Энэ нийтлэлд би NGINX Ingress-ийн хувийн алдааны хуудсыг харуулахтай холбоотой хоёр онцлог шинж чанар, тэдгээрт байгаа хязгаарлалт, тэдгээрийг тойрон гарах арга замын талаар ярихыг хүсч байна.
1. Анхдагч арын хэсгийг өөрчлөх
Анхдагч байдлаар, NGINX 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. Өгөгдмөл backend ашиглан програмын HTTP алдааг зохицуулах
Өөр нэг нөхцөл байдал бол HTTP алдаагаар (404, 500, 502...) төгссөн хүсэлтүүд юм. Ийм нөхцөл байдлыг боловсруулдаггүй программ (харгалзах сайхан хуудсууд үүсдэггүй). Энэ нь мөн хөгжүүлэгчид олон программ дээр ижил алдааны хуудсанд үйлчлэх хүсэлтэй холбоотой байж болох юм.
Энэ хэргийг сервер тал дээр хэрэгжүүлэхийн тулд бидэнд хэрэгтэй:
- Өгөгдмөл backend-ийн тухай догол мөрөөс дээрх зааврыг дагана уу;
- Nginx-ingress тохиргооны ConfigMap-д түлхүүр нэмнэ үү
custom-http-errors
, жишээ нь, утгын хамт404,503
(шинэ дүрмийн алдааны кодуудтай тохирч байгаа нь ойлгомжтой).
Хүлээгдэж буй үр дүнд хүрсэн: үйлчлүүлэгчийн програм ажиллаж байх үед 404 эсвэл 503 гэсэн хариу код бүхий алдааг хүлээн авах үед хүсэлтийг автоматаар шинэ өгөгдмөл арын хэсэг рүү дахин чиглүүлэх болно...
Гэсэн хэдий ч, өгөгдмөл backend болон custom-http-алдааны програмыг боловсруулахдаа та нэг чухал онцлогийг анхаарч үзэх хэрэгтэй.
!!! 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
нь тус бүрээс Ingress-ийнтайлбар ашиглах ; - Бид дарж болно
custom-http-errors
нь тус бүрээс Ingress-ийнтайлбар ашиглах .
Үүний үр дүнд 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-тэй бөгөөд толгой хэсгийг хэрхэн харж, зөв хариултын кодыг буцааж өгөхийг мэдэхгүй байна. Ийм програмыг url-аас Ingress-ийн тусламжтайгаар гаргадаг /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
K8-ийн бусад зөвлөмж, аргачлалын цувралууд:
- «
Кластерт ажиллаж байгаа нөөцүүдийг Helm 2 удирдлага руу шилжүүлэх "; - «
Зангилааны хуваарилалт ба вэб програм дээрх ачааллын тухай "; - «
Хөгжүүлэгчийн сайтуудад хандах "; - «
Том өгөгдлийн сангийн ачааллыг хурдасгах ".
Мөн манай блог дээрээс уншина уу:
- «
Istio ашиглан микро үйлчилгээ рүү буцах. 1-р хэсэг "; - «
[Зурагтай] Кубернетес дэх сүлжээний гарын авлага. 3-р хэсэг ".
Эх сурвалж: www.habr.com