Kubernetes savjeti i trikovi: prilagođene stranice s pogreškama u NGINX Ingressu

Kubernetes savjeti i trikovi: prilagođene stranice s pogreškama u NGINX Ingressu

U ovom članku želim govoriti o dvije značajke NGINX Ingressa koje se odnose na prikazivanje personaliziranih stranica s pogreškama, kao io ograničenjima koja postoje u njima i načinima kako ih zaobići.

1. Promjena zadane pozadine

Prema zadanim postavkama, NGINX Ingress koristi zadanu pozadinu koja obavlja odgovarajuću funkciju. To znači da kada zahtijevamo Ingress koji navodi host koji nije u Ingress resursima, dobivamo sljedeću stranicu s kodom odgovora 404:

Kubernetes savjeti i trikovi: prilagođene stranice s pogreškama u NGINX Ingressu

Međutim, sve češće naši klijenti dolaze sa zahtjevom da im se stranica prikaže s logotipom tvrtke i drugim pogodnostima umjesto standardnog 404. Da bi to učinio, NGINX Ingress ima ugrađena sposobnost redefinirati default-backend-service. Unos formata prosljeđujemo kao argument istoimenoj opciji namespace/servicename. Port usluge trebao bi biti 80.

Da biste to učinili, morate izraditi vlastiti pod (uvođenje) i uslugu sa svojom aplikacijom (primjer implementacije u YAML iz repozitorija ingress-nginx), koji će biti dan umjesto zadane pozadine.

Evo male ilustracije:

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

Dakle, sve domene koje nisu eksplicitno kreirane putem YAML-a sa kind: Ingress, spadaju u default-backend. U gornjem popisu ova je domena postala sadsdasdas.

2. Rukovanje HTTP pogreškama u aplikaciji pomoću zadane pozadine

Druga situacija su zahtjevi koji završavaju s HTTP greškama (404, 500, 502...) prema aplikaciji koja ne obrađuje takve situacije (ne generiraju se odgovarajuće lijepe stranice). To također može biti posljedica želje programera da poslužuju iste stranice s pogreškama u više aplikacija.

Za implementaciju ovog slučaja na strani poslužitelja potrebno nam je:

  1. Slijedite gornje upute iz odlomka o zadanoj pozadini;
  2. Dodajte ključ konfiguraciji nginx-ingress ConfigMap custom-http-errors, na primjer, s vrijednošću 404,503 (očito odgovara šiframa grešaka koje pokriva novo pravilo).

Očekivani rezultat je postignut: kada klijentska aplikacija radi i primi pogrešku s kodom odgovora 404 ili 503, zahtjev će se automatski preusmjeriti na novu zadanu pozadinu...

Međutim, kada razvijate aplikaciju za zadanu pozadinu i prilagođene http-pogreške, trebate uzeti u obzir važnu značajku:

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

Činjenica je da kada se zahtjev preusmjeri, zaglavlja će sadržavati korisne informacije s prethodnim kodom odgovora i dodatnim informacijama (dostupan je njihov potpuni popis здесь).

To znači da morate i sami voditi računa o ispravnom kodu odgovora. Evo primjera iz dokumentacije kako radi.

Različite aplikacije imaju različite zadane pozadine

Kako biste bili sigurni da rješenje nije globalno za cijeli klaster, već da se primjenjuje samo na određene aplikacije, prvo morate provjeriti Ingress verziju. Ako se poklopi 0.23 ili više, koristite izvorne Ingress komentare:

  1. Možemo nadjačati default-backend za svaki Ingressov koristeći anotacije;
  2. Možemo nadjačati custom-http-errors za svaki Ingressov koristeći anotacije.

Kao rezultat toga, resurs Ingressa izgledat će otprilike ovako:

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

U tom će slučaju pogreške 404 i 502 biti preusmjerene na uslugu stranica s pogreškama sa svim potrebnim zaglavljima.

В prethodne verzije Ingressa nisu imale ovu značajku (sudbonosni commit na 0.23). A ako imate 2 potpuno različite aplikacije koje se izvode u vašem klasteru i želite navesti različitu zadanu pozadinsku uslugu i obradu različitih kodova pogrešaka za svaku od njih, za to ćete morati koristiti zaobilazna rješenja, od kojih imamo dva.

Ulaz < 0.23: pristup jedan

Ova opcija je jednostavnija. Kao aplikacija koja poslužuje svoje stranice, imamo obični HTML, koji ne zna kako pogledati zaglavlja i vratiti ispravne kodove odgovora. Takva se aplikacija uvodi s Ingressom s url-a /error-pages, te u katalogu ws bit će vraćeni HTML.

Ilustracija u YAML-u:

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

Usluga za ovu implementaciju mora biti tipa ClusterIP.

Istovremeno, u aplikaciji u kojoj ćemo obraditi pogrešku, u Ingress dodajemo isječak servera ili isječak konfiguracije sa sljedećim sadržajem:

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

Ulaz < 0.23: drugi pristup

Opcija za aplikaciju koja može obraditi zaglavlja ... I općenito ovo je ispravniji način, posuđen iz custom-http-errors. Ručno korištenje (kopiranje) omogućit će vam da ne mijenjate globalne postavke.

Koraci su sljedeći. Mi stvaramo isti raspored s aplikacijom koja može slušati potrebne naslove i ispravno odgovoriti. Dodajte isječak poslužitelja u aplikaciju Ingress sa sljedećim sadržajem:

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

Kao što vidite, za svaku pogrešku koju želimo obraditi, moramo napraviti vlastitu lokaciju, gdje će biti umetnuta sva potrebna zaglavlja, kao u "nativnom". prilagođene-stranice-pogreške. Na taj način možemo stvoriti različite personalizirane stranice s pogreškama čak i za pojedinačne lokacije i poslužitelje.

PS

Ostalo iz serije savjeta i trikova K8s:

Pročitajte i na našem blogu:

Izvor: www.habr.com

Dodajte komentar