Дар ин мақола, ман мехоҳам дар бораи ду хусусияти NGINX Ingress марбут ба намоиши саҳифаҳои хатогиҳои фардӣ, инчунин маҳдудиятҳое, ки дар онҳо мавҷуданд ва роҳҳои кор дар атрофи онҳо сӯҳбат кунам.
1. Тағйир додани пуштибонии пешфарз
Бо нобаёнӣ, NGINX Ingress пуштибонии пешфарзро истифода мебарад, ки вазифаи мувофиқро иҷро мекунад. Ин маънои онро дорад, ки ҳангоми дархости Ingress, ки хостеро, ки дар захираҳои Ingress нест, дархост мекунад, мо саҳифаи зеринро бо рамзи ҷавоби 404 мегирем:
Аммо, бештар ва бештар муштариёни мо бо дархости нишон додани саҳифаи худ бо логотипи корпоративӣ ва дигар шароити мусоид ба ҷои стандарти 404 меоянд. Барои ин, NGINX Ingress дорад default-backend-service
. Мо вуруди форматро ҳамчун далел ба варианти ҳамон ном мегузорем namespace/servicename
. Порти хидмат бояд 80 бошад.
Барои ин ба шумо лозим аст, ки бо замимаи худ pod (ҷойгиркунӣ) ва хидмати худро эҷод кунед (
Ин як мисоли хурд аст:
~$ curl -i -XGET http://sadsdasdas.kube-cloud.my/
HTTP/1.1 404 Not Found
Date: Mon, 11 Mar 2019 05:38:15 GMT
Content-Type: */*
Transfer-Encoding: chunked
Connection: keep-alive
<span>The page you're looking for could not be found.</span>
Ҳамин тавр, ҳама доменҳо, ки ба таври возеҳ тавассути YAML бо офарида нашудаанд kind: Ingress
, ба default-backend афтод. Дар рӯйхати боло, ин домен шуд sadsdasdas
.
2. Коркарди хатогиҳои HTTP дар барнома бо истифода аз пуштибонии пешфарз
Вазъияти дигар дархостҳое мебошад, ки бо хатогиҳои HTTP (404, 500, 502...) анҷом меёбанд, ба барномае, ки чунин ҳолатҳоро коркард намекунад (саҳифаҳои зебои мувофиқ тавлид намешаванд). Ин метавонад инчунин аз хоҳиши таҳиягарон барои хидматрасонии як саҳифаҳои хато дар якчанд замимаҳо бошад.
Барои татбиқи ин ҳолат дар тарафи сервер ба мо лозим аст:
- Дастурҳои дар боло зикршударо дар бораи пуштибонии пешфарз иҷро кунед;
- Ба конфигуратсияи ConfigMap nginx-ingress калид илова кунед
custom-http-errors
, масалан, бо арзиш404,503
(баръало ба рамзҳои хатогие, ки бо қоидаи нав фаро гирифта шудаанд, мувофиқат мекунад).
Натиҷаи интизорӣ ба даст омад: вақте ки барномаи муштарӣ кор мекунад ва хатогиро бо рамзи посухи 404 ё 503 мегирад, дархост ба таври худкор ба пуштибонии пешфарзи нав равона карда мешавад...
Аммо, ҳангоми таҳияи барнома барои пуштибонии пешфарз ва хатоҳои фармоишӣ, шумо бояд як хусусияти муҳимро ба назар гиред:
!!! Important The custom backend is expected to return the correct HTTP status code instead of 200. NGINX does not change the response from the custom default backend.
Гап дар он аст, ки ҳангоми интиқоли дархост, сарлавҳаҳо дорои маълумоти муфид бо рамзи ҷавоби қаблӣ ва маълумоти иловагӣ (рӯйхати пурраи онҳо мавҷуд аст)
Ин маънои онро дорад, ки шумо худатон бояд ғамхорӣ рамзи ҷавоб дуруст.
Барномаҳои гуногун дорои пешфарзҳои гуногун мебошанд
Барои боварӣ ҳосил кардан, ки ҳалли он барои тамоми кластер глобалӣ нест, балки танҳо ба барномаҳои мушаххас дахл дорад, шумо аввал бояд версияи Ingress-ро тафтиш кунед. Агар мувофиқат кунад 0.23 ё баландтар, эзоҳҳои дохилии Ingress-ро истифода баред:
- Мо метавонем барҳам диҳанд
default-backend
барои ҳар яке Ингрессистифодаи эзоҳҳо ; - Мо метавонем барҳам диҳанд
custom-http-errors
барои ҳар яке Ингрессистифодаи эзоҳҳо .
Дар натиҷа, манбаи Ingress чунин хоҳад буд:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Chart.Name }}-app2
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/custom-http-errors: "404,502"
nginx.ingress.kubernetes.io/default-backend: error-pages
spec:
tls:
- hosts:
- app2.example.com
secretName: wildcard-tls
rules:
- host: app2.example.com
http:
paths:
- path: /
backend:
serviceName: {{ .Chart.Name }}-app2
servicePort: 80
Дар ин ҳолат, хатогиҳои 404 ва 502 бо тамоми сарлавҳаҳои зарурӣ ба хидмати саҳифаҳои хато равона карда мешаванд.
В версияҳои қаблии Ingress ин хусусиятро надоштанд (
Воридшавӣ <0.23: наздик ба як
Ин вариант соддатар аст. Ҳамчун барномае, ки ба саҳифаҳои худ хидмат мекунад, мо HTML-и муқаррарӣ дорем, ки намедонад, ки чӣ гуна ба сарлавҳаҳо нигоҳ кардан ва кодҳои ҷавоби дурустро баргардониданро намедонад. Чунин барнома бо Ingress аз URL паҳн карда мешавад /error-pages
, ва дар каталог ws
HTML баргардонида мешавад.
Тасвир дар YAML:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ .Chart.Name }}-app2
annotations:
kubernetes.io/ingress.class: "nginx"
ingress.kubernetes.io/server-snippet: |
proxy_intercept_errors on;
error_page 500 501 502 503 504 @error_pages;
location @error_pages {
rewrite ^ /error-pages/other/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
spec:
tls:
- hosts:
- app2.example.com
secretName: wildcard-tls
rules:
- host: app2.example.com
http:
paths:
- path: /
backend:
serviceName: {{ .Chart.Name }}-app2
servicePort: 80
Хидмат барои ин густариш бояд аз навъи ClusterIP бошад.
Ҳамзамон, дар барномае, ки мо хатогиро коркард мекунем, дар Ingress мо порчаи сервер ё конфигуратсияро бо мундариҷаи зерин илова мекунем:
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors on;
error_page 500 501 502 503 504 @error_pages;
location @error_pages {
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
Воридшавӣ <0.23: равиши дуюм
Варианти барномае, ки метавонад сарлавҳаҳоро коркард кунад... Ва дар маҷмӯъ ин роҳи дурусттарест, ки аз custom-http-errors гирифта шудааст. Истифодаи дастӣ (нусхабардорӣ) ба шумо имкон медиҳад, ки танзимоти глобалиро тағир надиҳед.
Қадамҳо чунинанд. Мо эҷод мекунем
nginx.ingress.kubernetes.io /server-snippet: |
proxy_intercept_errors off;
error_page 404 = @custom_404;
error_page 503 = @custom_503;
location @custom_404 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 404;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
location @custom_503 {
internal;
proxy_intercept_errors off;
proxy_set_header X-Code 503;
proxy_set_header X-Format $http_accept;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Namespace $namespace;
proxy_set_header X-Ingress-Name $ingress_name;
proxy_set_header X-Service-Name $service_name;
proxy_set_header X-Service-Port $service_port;
proxy_set_header Host $best_http_host;
rewrite ^ /error-pages/ws/index.html break;
proxy_pass http://error-pages.prod.svc.cluster.local;
}
Тавре ки шумо мебинед, барои ҳар як хатое, ки мо мехоҳем коркард кунем, мо бояд макони худамонро созем, ки дар он ҳама сарлавҳаҳои зарурӣ, ба мисли "модарӣ" ворид карда мешаванд.
PS
Дигар аз силсилаи маслиҳатҳо ва ҳилаҳои K8s:
- «
Интиқоли захираҳое, ки дар кластер кор мекунанд, ба идоракунии Helm 2 »; - «
Дар бораи тақсимоти гиреҳ ва боркунӣ дар барномаи веб »; - «
Дастрасӣ ба сайтҳои таҳиякунанда »; - «
Суръати пурборкунӣ барои пойгоҳи додаҳои калон ".
Инчунин дар блоги мо хонед:
- «
Бозгашт ба microservices бо Istio. Қисми 1 »; - «
[Illustrated] Дастур оид ба шабака дар Кубернетес. Қисми 3 ".
Манбаъ: will.com