Konsèy ak ke trik nouvèl Kubernetes: paj erè koutim nan NGINX Ingress

Konsèy ak ke trik nouvèl Kubernetes: paj erè koutim nan NGINX Ingress

Nan atik sa a, mwen vle pale sou de karakteristik NGINX Ingress ki gen rapò ak montre paj erè pèsonalize, osi byen ke limit ki egziste nan yo ak fason yo travay alantou yo.

1. Chanje backend default la

Pa default, NGINX Ingress itilize backend default la, ki fè fonksyon ki koresponn lan. Sa vle di lè nou mande yon Ingress ki espesifye yon lame ki pa nan resous Ingress, nou resevwa paj sa a ak yon kòd repons 404:

Konsèy ak ke trik nouvèl Kubernetes: paj erè koutim nan NGINX Ingress

Sepandan, pi plis ak pi souvan kliyan nou yo vini ak yon demann pou montre paj yo ak yon logo antrepriz ak lòt ekipman olye de estanda 404 la. Pou fè sa, NGINX Ingress genyen kapasite entegre redéfinir default-backend-service. Nou pase antre fòma a kòm yon agiman nan opsyon ki gen menm non an namespace/servicename. Pò sèvis la ta dwe 80.

Pou fè sa, ou bezwen kreye pwòp gous ou (deplwaman) ak sèvis ak aplikasyon w lan (egzanp aplikasyon nan YAML soti nan repozitwa ingress-nginx), ki pral bay olye pou yo backend default la.

Men yon ti ilistrasyon:

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

Se konsa, tout domèn ki pa klèman kreye atravè YAML ak kind: Ingress, tonbe nan default-backend. Nan lis ki pi wo a, domèn sa a te vin sadsdasdas.

2. Manyen erè HTTP nan aplikasyon an lè l sèvi avèk backend default la

Yon lòt sitiyasyon se demann ki fini nan erè HTTP (404, 500, 502...) nan yon aplikasyon ki pa trete sitiyasyon sa yo (paj korespondan yo bèl yo pa pwodwi). Sa a kapab tou akòz dezi a nan devlopè yo sèvi paj yo erè nan plizyè aplikasyon.

Pou aplike ka sa a sou bò sèvè nou bezwen:

  1. Swiv enstriksyon ki anwo yo nan paragraf la sou backend default;
  2. Ajoute yon kle nan konfigirasyon nginx-ingress ConfigMap la custom-http-errors, pou egzanp, ak valè a 404,503 (evidamman koresponn ak kòd erè ki kouvri pa nouvo règ la).

Rezilta espere a te reyalize: lè aplikasyon kliyan an ap kouri epi li resevwa yon erè ak kòd repons 404 oswa 503, demann lan pral otomatikman redireksyon nan nouvo backend default la...

Sepandan, lè w ap devlope yon aplikasyon pou backend default ak koutim-http-erè, ou bezwen pran an kont yon karakteristik enpòtan:

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

Reyalite a se ke lè yo redireksyon yon demann, tèt yo pral gen enfòmasyon itil ak kòd repons anvan an ak enfòmasyon adisyonèl (lis konplè yo disponib isit la).

Sa vle di ke ou menm ou dwe pran swen kòd repons kòrèk la. Isit la se yon egzanp soti nan dokiman ki jan li fonksyone.

Aplikasyon diferan gen diferan backend default

Pou asire ke solisyon an pa mondyal pou tout gwoup la, men li aplike sèlman nan aplikasyon espesifik, ou bezwen premye tcheke vèsyon an Ingress. Si li matche 0.23 oswa pi wo, itilize annotasyon Ingress natif natal yo:

  1. Nou ka depase default-backend pou chak Antre nan lè l sèvi avèk anotasyon;
  2. Nou ka depase custom-http-errors pou chak Antre nan lè l sèvi avèk anotasyon.

Kòm yon rezilta, resous Ingress la pral gade yon bagay tankou sa a:

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

Nan ka sa a, erè 404 ak 502 yo pral redireksyon sou sèvis paj erè a ak tout tèt ki nesesè yo.

В vèsyon anvan yo nan Ingress pa t 'gen karakteristik sa a (komèt fatal nan 0.23). Men, si ou gen 2 aplikasyon konplètman diferan kouri nan gwoup ou a epi ou vle presize yon diferan default-backend-sèvis ak pwosesis nan kòd erè diferan pou chak nan yo, pou sa a ou pral gen yo sèvi ak solisyon, nan ki nou gen de.

Antre <0.23: apwòch youn

Opsyon sa a pi senp. Kòm yon aplikasyon ki sèvi paj li yo, nou gen HTML regilye, ki pa konnen ki jan yo gade nan tèt yo epi retounen kòd repons kòrèk yo. Yon aplikasyon konsa woule soti ak Ingress soti nan url la /error-pages, ak nan katalòg la ws pral HTML retounen.

Ilistrasyon nan 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

Sèvis pou deplwaman sa a dwe nan kalite ClusterIP.

An menm tan an, nan aplikasyon an kote nou pral trete erè a, nan Ingress nou ajoute yon snippet sèvè oswa konfigirasyon snippet ak kontni sa a:

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

Antre <0.23: dezyèm apwòch

Yon opsyon pou yon aplikasyon ki ka trete headers... Ak an jeneral sa a se yon fason ki pi kòrèk, prete nan koutim-http-erè. Sèvi ak li manyèlman (kopi) pral pèmèt ou pa chanje paramèt mondyal yo.

Etap yo se jan sa a. Nou kreye menm deplwaman ak yon aplikasyon ki ka koute tit ki nesesè yo epi reponn kòrèkteman. Ajoute yon ti sèvè nan aplikasyon Ingress ak kontni sa a:

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

Kòm ou ka wè, pou chak erè ke nou vle trete, nou bezwen fè pwòp kote nou an, kote yo pral mete tout headers ki nesesè yo, tankou nan yon "natif natal". paj koutim-erè. Nan fason sa a nou ka kreye diferan paj erè pèsonalize menm pou kote endividyèl ak sèvè.

PS

Lòt nan seri konsèy ak ke trik nouvèl K8s yo:

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè