Kubernetes зөвлөмж ба заль мэх: NGINX Ingress дахь тусгай алдааны хуудас

Kubernetes зөвлөмж ба заль мэх: NGINX Ingress дахь тусгай алдааны хуудас

Энэ нийтлэлд би NGINX Ingress-ийн хувийн алдааны хуудсыг харуулахтай холбоотой хоёр онцлог шинж чанар, тэдгээрт байгаа хязгаарлалт, тэдгээрийг тойрон гарах арга замын талаар ярихыг хүсч байна.

1. Анхдагч арын хэсгийг өөрчлөх

Анхдагч байдлаар, NGINX Ingress нь холбогдох функцийг гүйцэтгэдэг анхдагч арын хэсгийг ашигладаг. Энэ нь Оролтын нөөцөд байхгүй хостыг зааж өгөх хүсэлт гаргах үед бид 404 хариу код бүхий дараах хуудсыг хүлээн авна гэсэн үг юм.

Kubernetes зөвлөмж ба заль мэх: NGINX Ingress дахь тусгай алдааны хуудас

Гэсэн хэдий ч манай үйлчлүүлэгчид өөрсдийн хуудсаа стандарт 404-ийн оронд байгууллагын лого болон бусад хэрэгслээр харуулах хүсэлт ирдэг. Үүнийг хийхийн тулд NGINX Ingress байна суурилуулсан чадвар дахин тодорхойлох default-backend-service. Бид форматын оруулгыг ижил нэртэй сонголт руу аргумент болгон дамжуулдаг namespace/servicename. Үйлчилгээний порт нь 80 байх ёстой.

Үүнийг хийхийн тулд та өөрийн програмын тусламжтайгаар өөрийн pod (байршуулах) болон үйлчилгээг үүсгэх хэрэгтэй.YAML дээр хэрэгжүүлэх жишээ ingress-nginx репозитороос) нь анхдагч backend-ийн оронд өгөгдөнө.

Энд жижиг дүрслэл байна:

~$ 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...) төгссөн хүсэлтүүд юм. Ийм нөхцөл байдлыг боловсруулдаггүй программ (харгалзах сайхан хуудсууд үүсдэггүй). Энэ нь мөн хөгжүүлэгчид олон программ дээр ижил алдааны хуудсанд үйлчлэх хүсэлтэй холбоотой байж болох юм.

Энэ хэргийг сервер тал дээр хэрэгжүүлэхийн тулд бидэнд хэрэгтэй:

  1. Өгөгдмөл backend-ийн тухай догол мөрөөс дээрх зааврыг дагана уу;
  2. 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 тэмдэглэгээг ашиглана уу:

  1. Бид дарж болно default-backend нь тус бүрээс Ingress-ийн тайлбар ашиглах;
  2. Бид дарж болно 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-д). Хэрэв таны кластерт 2 огт өөр програм ажиллаж байгаа бөгөөд та өөр өөр анхдагч backend-үйлчилгээг зааж өгөхийг хүсч байгаа бөгөөд тэдгээр нь тус бүрдээ өөр өөр алдааны код боловсруулахыг хүсвэл үүний тулд та тойрон гарах арга замыг ашиглах хэрэгтэй болно.

Оролтын < 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-аас зээлсэн илүү зөв арга юм. Үүнийг гараар ашиглах (хуулбарлах) нь дэлхийн тохиргоог өөрчлөхгүй байх боломжийг танд олгоно.

Алхамууд нь дараах байдалтай байна. Бид бүтээдэг ижил байршуулалт шаардлагатай гарчгийг сонсож, зөв ​​хариулах боломжтой програмын тусламжтайгаар. Дараах контент бүхий серверийн хэсгийг Ingress програмд ​​нэмнэ үү:

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-ийн бусад зөвлөмж, аргачлалын цувралууд:

Мөн манай блог дээрээс уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх