
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:
![]()
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 ĂŒ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 ( 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:
- Teha ĂŒlaltoodud juhiste kohaselt default backend'i kohta;
- Lisada konfigureerimis ConfigMap nginx-ingress'i vÔtme
custom-http-errors, nÀiteks vÀÀrtusega404,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 ).
See tÀhendab, et te peate ise hoolitsema Ôige vastuse koodi eest. 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:
- Me saame ĂŒle kirjutada
default-backendkuna peamise domeeni kohta loendis. Ingressist ; - Me saame ĂŒle kirjutada
custom-http-errorskuna peamise domeeni kohta loendis. Ingressist .
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: 80Sel juhul suunatakse vead 404 ja 502 teenusele error-pages koos kÔigi vajalike headeritega.
V eelnevates Ingressi versioonides sellist vĂ”imalust ei olnud (). 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: 80Selle 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 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â . 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
