„Kubernetes“ patarimai ir gudrybės: pasirinktiniai klaidų puslapiai „NGINX Ingress“.

„Kubernetes“ patarimai ir gudrybės: pasirinktiniai klaidų puslapiai „NGINX Ingress“.

Šiame straipsnyje noriu pakalbėti apie dvi NGINX Ingress funkcijas, susijusias su asmeninių klaidų puslapių rodymu, taip pat juose esančius apribojimus ir būdus, kaip juos apeiti.

1. Numatytosios užpakalinės programos keitimas

Pagal numatytuosius nustatymus NGINX Ingress naudoja numatytąją vidinę programą, kuri atlieka atitinkamą funkciją. Tai reiškia, kad pateikę užklausą dėl įėjimo, nurodant pagrindinį kompiuterį, kurio nėra Ingress ištekliuose, gauname šį puslapį su 404 atsakymo kodu:

„Kubernetes“ patarimai ir gudrybės: pasirinktiniai klaidų puslapiai „NGINX Ingress“.

Tačiau vis dažniau mūsų klientai ateina su prašymu vietoj standartinio 404 savo puslapį rodyti su įmonės logotipu ir kitais patogumais. Norėdami tai padaryti, NGINX Ingress turi įmontuota galimybė iš naujo apibrėžti default-backend-service. Formato įrašą perduodame kaip to paties pavadinimo parinkties argumentą namespace/servicename. Paslaugos prievadas turėtų būti 80.

Norėdami tai padaryti, turite sukurti savo priedą (diegimą) ir paslaugą naudodami programą (įgyvendinimo pavyzdys YAML iš ingress-nginx saugyklos), kuri bus suteikta vietoj numatytosios vidinės programos.

Štai maža iliustracija:

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

Taigi visi domenai, kurie nėra tiesiogiai sukurti per YAML su kind: Ingress, eikite į numatytąją vidinę programą. Aukščiau pateiktame sąraše šis domenas tapo sadsdasdas.

2. HTTP klaidų tvarkymas programoje naudojant numatytąją vidinę programą

Kita situacija – užklausos, kurios baigiasi HTTP klaidomis (404, 500, 502...) į aplikaciją, kuri tokių situacijų neapdoroja (atitinkami gražūs puslapiai negeneruojami). Taip pat gali būti dėl kūrėjų noro pateikti tuos pačius klaidų puslapius keliose programose.

Norėdami įdiegti šį atvejį serverio pusėje, mums reikia:

  1. Vykdykite anksčiau pateiktus nurodymus pastraipoje apie numatytąją vidinę programą;
  2. Pridėkite raktą prie „nginx-ingress“ konfigūracijos „ConfigMap“. custom-http-errors, pavyzdžiui, su verte 404,503 (akivaizdu, kad tai atitinka klaidų kodus, kuriems taikoma nauja taisyklė).

Numatytas rezultatas pasiektas: kai kliento programa veikia ir gauna klaidą su 404 arba 503 atsakymo kodu, užklausa bus automatiškai nukreipta į naują numatytąją vidinę...

Tačiau kurdami programą, skirtą numatytosioms foninėms ir pasirinktinėms http klaidoms, turite atsižvelgti į svarbią funkciją:

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

Faktas yra tas, kad kai užklausa peradresuojama, antraštėse bus naudingos informacijos su ankstesniu atsakymo kodu ir papildoma informacija (galima rasti visą jų sąrašą čia).

Tai reiškia, kad jūs pats turite pasirūpinkite teisingu atsakymo kodu. Štai pavyzdys iš dokumentacijos, kaip tai veikia.

Skirtingos programos turi skirtingas numatytąsias programas

Norėdami įsitikinti, kad sprendimas nėra visuotinis visame klasteryje, o taikomas tik konkrečioms programoms, pirmiausia turite patikrinti Ingress versiją. Jeigu sutampa 0.23 ar daugiau, naudokite vietinius Ingress komentarus:

  1. Galime nepaisyti default-backendkiekvienas Ingress's naudojant anotacijas;
  2. Galime nepaisyti custom-http-errorskiekvienas Ingress's naudojant anotacijas.

Dėl to Ingress šaltinis atrodys maždaug taip:

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

Tokiu atveju 404 ir 502 klaidos bus nukreiptos į klaidų puslapių tarnybą su visomis būtinomis antraštėmis.

В Ankstesnėse Ingress versijose šios funkcijos nebuvo (lemtingas įsipareigojimas 0.23). Ir jei jūsų klasteryje veikia 2 visiškai skirtingos programos ir kiekvienai iš jų norite nurodyti skirtingą numatytąją backend paslaugą ir skirtingų klaidų kodų apdorojimą, tam turėsite naudoti sprendimus, iš kurių turime du.

Įėjimas < 0.23: artėja prie vieno

Ši parinktis yra paprastesnė. Kaip programa, kuri aptarnauja savo puslapius, turime įprastą HTML, kuris nežino, kaip peržiūrėti antraštes ir grąžinti teisingus atsakymo kodus. Tokia programa iškeliama naudojant Ingress iš URL /error-pages, ir kataloge ws bus grąžintas HTML.

Iliustracija 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

Šio diegimo paslauga turi būti ClusterIP tipo.

Tuo pačiu metu programoje, kurioje apdorosime klaidą, prie Ingress pridedame serverio fragmentą arba konfigūracijos fragmentą su tokiu turiniu:

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

Įėjimas < 0.23: antrasis metodas

Programos, kuri gali apdoroti antraštes, parinktis... Ir apskritai tai yra teisingesnis būdas, pasiskolintas iš custom-http-klaidų. Naudodami jį rankiniu būdu (kopijuodami), galėsite nekeisti visuotinių nustatymų.

Veiksmai yra tokie. Mes kuriame tas pats dislokavimas su programa, kuri gali klausytis reikiamų antraščių ir teisingai atsakyti. Pridėkite serverio fragmentą prie programos Ingress su tokiu turiniu:

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

Kaip matote, kiekvienai klaidai, kurią norime apdoroti, turime sukurti savo vietą, kurioje bus įterptos visos reikalingos antraštės, kaip ir „gimtojoje“. pasirinktinių klaidų puslapiai. Tokiu būdu galime sukurti skirtingus suasmenintus klaidų puslapius net atskiroms vietoms ir serveriams.

PS

Kiti iš K8s patarimų ir gudrybių serijos:

Taip pat skaitykite mūsų tinklaraštyje:

Šaltinis: www.habr.com

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