Kubernetesi nÀpunÀited ja nipid: isikupÀrastatud viga lehed NGINX Ingressis

Kubernetes'i nÀpunÀited ja trikid: isikupÀrastatud vealehed NGINX Ingress'is

Selles artiklis tahan rÀÀkida kahest NGINX Ingressi omadusest, mis on seotud isikupĂ€rastatud vealehtede kuvamisega, samuti nende piirangutest ja vĂ”imalustest, kuidas neid ĂŒletada.

1. Vaikimisi backend'i muutmine

NGINX Ingressis kasutatakse vaikimisi backend'ina default backend'i, mis tÀidab vastavat funktsiooni. See tÀhendab, et kui teeme Ingress'i pÀringu hostiga, mis ei ole Ingress ressources, saame sellise vealehe koos vastusekoodiga 404:

Kubernetes'i nÀpunÀited ja trikid: isikupÀrastatud vealehed NGINX Ingress'is

Kuid ĂŒha sagedamini tulevad meie kliendid palvega nĂ€idata tavalise 404 asemel oma lehte koos brĂ€ndi logoga ja muude mugavustega. Selleks on NGINX Ingressil sisseehitatud vĂ”imalus ĂŒlekirjutada default-backend-service. Samanimelist valikut argumendina edastades tuleb esitada kirje vormingus namespace/servicename. Teenuse port peab olema 80.

Selleks on vajalik luua oma pod (deployment) ja teenus koos teie rakendusega (YAML'i rakenduse nÀidis ingress-nginx repostiost), mis antakse vÀlja vaikimisi backend'i asemel.

Siin on vÀike illustratsioon:

~$ 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>Otsitavat lehte ei leitud.</span>

Nii on kĂ”ik domeenid, mis pole selgelt loodud lĂ€bi YAML, tĂŒĂŒp: Ingress, jĂ”uavad default-backend'i. Ülaltoodud nimekirjas sai selliseks domeeniks sadsdasdas.

2. HTTP-ettevÔtete töötlemine rakenduses default backend'i abil

Teine olukord on see, kui rakendusele esitatakse HTTP-ettevÔtted (404, 500, 502
), kus selliseid olukordi ei kÀsitleta (vastavaid ilusaid lehti ei genereerita). See vÔib olla tingitud arendajate soovist anda sama vealehti mitmes rakenduses.

Selle juhtumi rakendamiseks serveripoolt on vajalik:

  1. Teha ĂŒlaltoodud juhiste kohaselt default backend'i kohta;
  2. Lisada konfigureerimis ConfigMap nginx-ingress'i vÔtme custom-http-errors, nÀiteks vÀÀrtusega 404,503 (ilmselgelt vastab see uue reegli alla kuuluvate veakoodide jaoks).

Oodatud tulemus saavutatakse: kliendi rakenduse töö kĂ€igus, kui kohtate 404 vĂ”i 503 vastuskoodi, suunatakse pĂ€ring automaatselt uude default backend'i


Kuid custom-http-errors'i ja default backend'i rakenduse arendamisel tuleb arvesse vÔtta olulist aspekti:

!!! TÀhtis. Eeldatakse, et kohandatud backend tagastab Ôige HTTP staatusekoodi, mitte 200. NGINX ei muuda vastust kohandatud default backend'ilt.

Asja on selles, et pÀringu suunamisel peavad headerites olema kasulikud andmed eelmise vastuse koodi ja tÀiendava teabe kohta (tÀielik loend on saadaval siit).

See tÀhendab, et te peate ise hoolitsema Ôige vastuse koodi eest. Siin on nÀide dokumentatsioonist, kuidas see töötab.

Erinevatele rakendustele – erinev default backend

Kuna lahendus ei tohiks olla globaalne kogu klastris, vaid seonduda ainult konkreetsetele rakendustele, tuleb esmalt kontrollida Ingressi versiooni. Kui see vastab 0.23 vÔi uuemale, kasutage "natiivseid" Ingressi annotatsioone:

  1. Me saame ĂŒle kirjutada default-backend kuna peamise domeeni kohta loendis. Ingressist annotatsiooni abil;
  2. Me saame ĂŒle kirjutada custom-http-errors kuna peamise domeeni kohta loendis. Ingressist annotatsiooni abil.

SeetÔttu nÀeb Ingressi ressurss vÀlja umbes nii:

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

Sel juhul suunatakse vead 404 ja 502 teenusele error-pages koos kÔigi vajalike headeritega.

V eelnevates Ingressi versioonides sellist vĂ”imalust ei olnud (saatuslik commit versioonis 0.23). Ja kui teil klastris töötab 2 tĂ€iesti erinevat rakendust ja soovite igale neist mÀÀrata erinevad default-backend-service'id ning erinevate veakoodide töötlemise — selleks peate kasutama workaround'e, millest meil on kaks.

Ingress < 0.23: esimene lÀhenemine

See variant on lihtsam. Rakenduse jaoks, mis annab oma lehti, on meil tavaline HTML, mis ei oska vaadata pealkirju ja anda Ôigeid vastusekoode. Selline rakendus kÀivitatakse koos Ingress'iga URL-iga /error-pages, ja kataloogis ws asub vÀljaantud HTML.

Illustratsioon YAML-is:

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

Selle tĂ”uke jaoks peab teenus olema tĂŒĂŒbiga ClusterIP.

Samuti rakenduses, kus töötleme viga, lisame Ingress'ile serveri-ƥnipi vÔi konfiguratsiooni-ƥnipi jÀrgmise sisuga:

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

Ingress < 0.23: teine lÀhenemine

Variant rakendusele, mis oskab pealkirju töödelda
 Lisaks on see ĂŒldiselt korrektsem tee, mis on laenatud custom-http-errors'ist. Selle kĂ€sitsi kasutamine (kopeerimine) vĂ”imaldab mitte muuta globaalsete seadete seadeid.

JĂ€rgmised sammud. Loome sama tĂŒĂŒpi kasutuselevĂ”tu rakendusega, mis oskab kuulata vajalikke pealkirju ja vastata Ă”igesti. Lisame Ingress'e server-snippeti jĂ€rgmise sisuga:

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

Nagu nĂ€ha, tuleb iga vea jaoks, mida soovime töödelda, luua oma asukoht, kus pannakse sisse kĂ”ik vajalikud pĂ€ised nagu „kohalikus” custom-error-pages. Nii saame luua erinevaid isikupĂ€rastatud vealehti isegi konkreetsete asukohtade ja serverite jaoks.

P.S.

Teine osa K8s nÀpunÀidetest ja nippidest:

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster