Kubernetes məsləhətləri və fəndləri: NGINX Ingress-də fərdi səhv səhifələri

Kubernetes məsləhətləri və fəndləri: NGINX Ingress-də fərdi səhv səhifələri

Bu yazıda NGINX Ingress-in fərdiləşdirilmiş səhv səhifələrinin göstərilməsi ilə bağlı iki xüsusiyyəti, habelə onların məhdudiyyətləri və onlardan keçməyin yolları haqqında danışmaq istəyirəm.

1. Defolt arxa ucunu dəyişdirin

Varsayılan olaraq, NGINX Ingress müvafiq funksiyanı yerinə yetirən standart backenddən istifadə edir. Bu o deməkdir ki, Giriş resurslarında olmayan host ilə Giriş sorğusunda biz bu səhifəni 404 cavab kodu ilə əldə edirik:

Kubernetes məsləhətləri və fəndləri: NGINX Ingress-də fərdi səhv səhifələri

Bununla belə, daha tez-tez müştərilərimiz səhifələrini standart 404 əvəzinə şirkət loqosu və digər imkanlarla göstərmək istəyi ilə gəlirlər. Bunun üçün NGINX Ingress var daxili qabiliyyət yenidən müəyyənləşdirin default-backend-service. Format qeydini eyni adlı varianta arqument kimi ötürürük namespace/servicename. Xidmət portu 80 olmalıdır.

Bunu etmək üçün siz öz podunuzu (yerləşdirmə) və tətbiqinizlə bir xidmət yaratmalısınız (YAML-də nümunə tətbiqi ingress-nginx repozitorundan), bu, standart backend əvəzinə veriləcək.

Budur kiçik bir illüstrasiya:

~$ 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>

Beləliklə, YAML vasitəsilə açıq şəkildə yaradılmayan bütün domenlər kind: Ingress, default-backend-ə düşür. Yuxarıdakı siyahıda bu domen oldu sadsdasdas.

2. Tətbiqdə HTTP xətalarının default backend tərəfindən idarə edilməsi

Başqa bir vəziyyət HTTP xətaları (404, 500, 502…) ilə bitən sorğulardır ki, bu cür vəziyyətləri idarə etməyən proqramlar (uyğun gözəl səhifələr yaradılmır). Buna həm də tərtibatçıların birdən çox tətbiqdə eyni səhv səhifələrini qaytarmaq istəyi səbəb ola bilər.

Bu işi server tərəfində həyata keçirmək üçün bizə lazımdır:

  1. Defolt backend haqqında paraqrafdan yuxarıdakı təlimatlara əməl edin;
  2. Açarı ConfigMap nginx-ingress konfiqurasiyasına əlavə edin custom-http-errorsməsələn, dəyəri ilə 404,503 (açıqcası yeni qaydanın əhatə etdiyi səhv kodlarına uyğun gəlir).

Gözlənilən nəticə əldə edilir: müştəri tətbiqi işləyərkən və 404 və ya 503 cavab kodu ilə xəta aldıqda, sorğu avtomatik olaraq yeni standart backend-ə yönləndiriləcək ...

Bununla belə, standart backend və xüsusi http xətaları üçün proqram hazırlayarkən vacib bir xüsusiyyət nəzərə alınmalıdır:

!!! 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.

Fakt budur ki, sorğu yönləndirildikdə, başlıqlarda əvvəlki cavab kodu və əlavə məlumat ilə faydalı məlumatlar olacaq (onların tam siyahısı mövcuddur) burada).

Bu o deməkdir ki, lazımdır düzgün cavab koduna diqqət yetirin. Burada bir nümunə. onun necə işlədiyi sənədlərdən.

Fərqli proqramlar - fərqli standart backend

Həllin bütün klaster üçün qlobal olmaması, ancaq xüsusi tətbiqlərə aid olması üçün əvvəlcə Ingress versiyasını yoxlamaq lazımdır. Əgər uyğun gəlirsə 0.23 və ya daha yüksək, yerli Giriş annotasiyalarından istifadə edin:

  1. Yenidən müəyyən edə bilərik default-backend uğrunda hər biri ilə daxil olun annotasiya;
  2. Yenidən müəyyən edə bilərik custom-http-errors uğrunda hər biri ilə daxil olun annotasiya.

Nəticədə, Ingress resursu belə görünəcək:

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

Bu halda, 404 və 502 səhvləri bütün lazımi başlıqlarla səhv səhifələri xidmətinə yönləndiriləcək.

В Ingress-in əvvəlki versiyalarında bu xüsusiyyət yox idi. (0.23-də taleyüklü öhdəliyi). Əgər sizin klasterinizdə işləyən 2 tamamilə fərqli proqram varsa və siz müxtəlif default-backend-xidmətləri təyin etmək və onların hər biri üçün müxtəlif xəta kodları ilə işləmək istəyirsinizsə, bunun üçün bizdə ikisi olan müvəqqəti həll yollarından istifadə etməli olacaqsınız.

Giriş < 0.23: birinə yaxınlaşın

Bu seçim daha sadədir. Səhifələrini göstərən bir proqram olaraq, başlıqlara necə baxmağı və düzgün cavab kodlarını qaytarmağı bilməyən sadə HTML-yə sahibik. Belə bir proqram url ilə Ingress ilə yayılır /error-pages, və kataloqda ws HTML veriləcək.

YAML-də illüstrasiya:

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

Bu yerləşdirmə üçün xidmət ClusterIP tipli olmalıdır.

Eyni zamanda, xətanı idarə edəcəyimiz tətbiqdə, Ingress-də aşağıdakı məzmunlu server-snippet və ya konfiqurasiya-snippet əlavə edirik:

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;
      }

Giriş < 0.23: ikinci yanaşma

Başlıqları emal edə bilən bir proqram üçün bir variant ... Və ümumiyyətlə, bu, xüsusi-http-səhvlərdən götürülmüş daha düzgün bir yoldur. Əl ilə istifadə (kopyalama) qlobal parametrləri dəyişdirməməyə imkan verəcəkdir.

Addımlar aşağıdakı kimidir. Biz yaradırıq eyni yerləşdirmə düzgün başlıqları dinləyə və düzgün cavab verə bilən bir tətbiq ilə. Aşağıdakı məzmunla Girişə server-snippet proqramları əlavə edirik:

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;
      }

Gördüyünüz kimi, emal etmək istədiyimiz hər bir səhv üçün "doğma" kimi bütün lazımi başlıqların əvəzlənəcəyi öz yerimizi etməliyik. xüsusi xəta səhifələri. Bu yolla biz hətta fərdi yerlər və serverlər üçün müxtəlif fərdiləşdirilmiş səhv səhifələri yarada bilərik.

PS

K8s məsləhətlər və fəndlər seriyasından digərləri:

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

Добавить комментарий