Serişte û hîleyên Kubernetes: Rûpelên xeletiya xwerû di NGINX Ingress de

Serişte û hîleyên Kubernetes: Rûpelên xeletiya xwerû di NGINX Ingress de

Di vê gotarê de, ez dixwazim li ser du taybetmendiyên NGINX Ingress bi nîşandana rûpelên xeletiya kesane, û her weha tixûbên ku di wan de hene û awayên xebata li dora wan biaxivim.

1. Guhertina paşnavê xwerû

Ji hêla xwerû, NGINX Ingress paşnavê xwerû bikar tîne, ku fonksiyona têkildar pêk tîne. Ev tê vê wateyê ku dema ku daxwaza Ingressek ku mêvandarek ku ne di çavkaniyên Ingress de ye diyar dike, em rûpela jêrîn bi kodek bersivê 404 distînin:

Serişte û hîleyên Kubernetes: Rûpelên xeletiya xwerû di NGINX Ingress de

Lêbelê, pir caran xerîdarên me bi daxwazek têne ku li şûna standard 404 rûpela xwe bi logoya pargîdanî û taybetmendiyên din nîşan bidin. Ji bo vê yekê, NGINX Ingress heye kapasîteya çêkirî ji nû ve pênase bike default-backend-service. Em têketina formatê wekî arguman ji vebijarka bi heman navî re derbas dikin namespace/servicename. Divê porta karûbarê 80 be.

Ji bo vê yekê, hûn hewce ne ku bi serîlêdana xwe re pod (dabeşkirin) û karûbarê xwe biafirînin (pêkanîna nimûne li YAML ji depoya ingress-nginx), ya ku dê li şûna paşiya xwerû were dayîn.

Li vir nîgarek piçûk heye:

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

Ji ber vê yekê hemî domên ku bi eşkere bi YAML ve nehatine afirandin kind: Ingress, dikeve nav default-backend. Di navnîşa jorîn de, ev domain bû sadsdasdas.

2. Di serîlêdanê de çewtiyên HTTP-ê bi karanîna paşnavê xwerû bi kar tînin

Rewşek din daxwazên ku bi xeletiyên HTTP-ê (404, 500, 502...) bi dawî dibin ji serîlêdanek ku rewşên weha pêvajo nake (rûpelên xweşik ên têkildar nayên çêkirin). Ev jî dibe ku ji ber daxwaza pêşdebiran be ku heman rûpelên xeletiyê di gelek serlêdanan de xizmetê bikin.

Ji bo pêkanîna vê dozê li ser milê serverê em hewce ne:

  1. Rêwerzên li jor ji paragrafa li ser paşnavê xwerû bişopînin;
  2. Mifteyek li veavakirina nginx-ingress ConfigMap zêde bikin custom-http-errors, ji bo nimûne, bi nirx 404,503 (eşkere bi kodên xeletiyê yên ku ji hêla qaîdeya nû ve têne vegirtin re têkildar e).

Encama çaverêkirî hate bidestxistin: gava ku serîlêdana xerîdar dimeşe û xeletiyek bi koda bersivê 404 an 503 werdigire, daxwaz dê bixweber berbi paşîna xwerû ya nû ve were rêve kirin…

Lêbelê, dema ku serîlêdanek ji bo paşnavê xwerû û xeletiyên xwerû-http-ê pêşdixin, hûn hewce ne ku taybetmendiyek girîng li ber çavan bigirin:

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

Rastî ev e ku dema ku daxwazek ji nû ve were rêve kirin, sernav dê bi koda bersiva berê û agahdariya zêde re agahdariya kêrhatî hebe (lîsteya wan a bêkêmasî heye vir).

Ev tê wê wateyê ku hûn bi xwe divê hay ji koda bersiva rast hebe. Li vir nimûne ye. ji belgeyên ku ew çawa dixebite.

Serlêdanên cihêreng paşnavên xwerû yên cihêreng hene

Ji bo ku bicîh bikin ku çareserî ji bo tevahiya komê ne gerdûnî ye, lê tenê ji bo serîlêdanên taybetî derbas dibe, hûn pêşî hewce ne ku guhertoya Ingress kontrol bikin. Ger lihevhatî be 0.23 an mezintir, şiroveyên xwemalî yên Ingress bikar bînin:

  1. Em dikarin bi ser bixin default-backend bo ji her yekê Ingress's bikaranîna annotations;
  2. Em dikarin bi ser bixin custom-http-errors bo ji her yekê Ingress's bikaranîna annotations.

Wekî encamek, çavkaniya Ingress dê tiştek weha xuya bike:

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

Di vê rewşê de, xeletiyên 404 û 502 dê bi hemî sernavên pêwîst re berbi karûbarê rûpelên xeletiyê ve werin rêve kirin.

В guhertoyên berê yên Ingress vê taybetmendiyê tune (di 0.23 de qedera xwe pêk tîne). Û heke we 2 serîlêdanên bi tevahî cûda yên ku di koma we de têne xebitandin hene û hûn dixwazin ji bo her yek ji wan karûbarek xwerû-paşgir-karûbarek cihêreng diyar bikin û kodên xeletiyê yên cihêreng hilînin, ji bo vê yekê hûn neçar in ku rêgezên ku me du ji wan hene bikar bînin.

Têketin < 0.23: nêzîkbûna yek

Ev vebijêrk hêsantir e. Wekî serîlêdanek ku rûpelên xwe xizmet dike, me HTML-ya birêkûpêk heye, ku nizane meriv çawa li sernivîsan binêre û kodên bersivê yên rast vegerîne. Serlêdanek wusa bi Ingress ji url-ê tê derxistin /error-pages, û di katalogê de ws dê bibe HTMLê vegerandin.

Nîşan di YAML de:

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

Divê karûbarê ji bo vê bicîhkirinê ji celebê ClusterIP be.

Di heman demê de, di serîlêdana ku em ê xeletiyê pêve bikin, di Ingress de em server-snippet an veavakirin-snippet bi naveroka jêrîn lê zêde dikin:

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: nêzîkbûna duyemîn

Vebijarkek ji bo serîlêdanek ku dikare sernavan bişopîne... Û bi gelemperî ev rêyek rasttir e, ji xeletiyên xwerû-http-deynkirî ye. Bikaranîna wê bi destan (kopîkirin) dê bihêle ku hûn mîhengên gerdûnî neguhezînin.

Gavên wiha ne. Em diafirînin heman belavkirinê bi serîlêdanek ku dikare guh bide sernivîsên pêwîst û rast bersiv bide. Bi naveroka jêrîn server-snippet li serîlêdana Ingress zêde bikin:

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

Wekî ku hûn dikarin bibînin, ji bo her xeletiyek ku em dixwazin pêvajo bikin, pêdivî ye ku em cîhê xwe çêbikin, ku dê hemî sernavên hewce bêne danîn, wekî ya "xwecihî". custom-error-pages. Bi vî rengî em dikarin rûpelên çewtiyên kesane yên cihêreng jî ji bo cîh û serverên kesane biafirînin.

PS

Din ji rêzikên serişte û hîleyên K8s:

Li ser bloga me jî bixwînin:

Source: www.habr.com

Add a comment