Vidokezo na mbinu za Kubernetes: kurasa za makosa maalum katika NGINX Ingress

Vidokezo na mbinu za Kubernetes: kurasa za makosa maalum katika NGINX Ingress

Katika makala hii, nataka kuzungumza juu ya vipengele viwili vya NGINX Ingress kuhusiana na kuonyesha kurasa za makosa ya kibinafsi, pamoja na mapungufu yaliyopo ndani yao na njia za kufanya kazi karibu nao.

1. Kubadilisha backend chaguo-msingi

Kwa chaguo-msingi, NGINX Ingress hutumia backend default, ambayo hufanya kazi sambamba. Hii ina maana kwamba tunapoomba Ingress inayobainisha mwenyeji ambaye hayuko katika nyenzo za Ingress, tunapokea ukurasa ufuatao wenye msimbo wa majibu 404:

Vidokezo na mbinu za Kubernetes: kurasa za makosa maalum katika NGINX Ingress

Hata hivyo, mara nyingi zaidi wateja wetu huja na ombi la kuonyesha ukurasa wao ukiwa na nembo ya shirika na huduma zingine badala ya 404 ya kawaida. Ili kufanya hivyo, NGINX Ingress ina uwezo wa kujengwa fafanua upya default-backend-service. Tunapitisha ingizo la umbizo kama hoja kwa chaguo la jina moja namespace/servicename. Bandari ya huduma inapaswa kuwa 80.

Ili kufanya hivyo, unahitaji kuunda pod yako mwenyewe (kupeleka) na huduma na programu yako (mfano utekelezaji katika YAML kutoka kwa hazina ya ingress-nginx), ambayo itatolewa badala ya msingi wa msingi.

Hapa kuna kielelezo kidogo:

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

Kwa hivyo vikoa vyote ambavyo havijaundwa kwa njia ya YAML na kind: Ingress, kuanguka katika default-backend. Katika orodha iliyo hapo juu, kikoa hiki kilikua sadsdasdas.

2. Kushughulikia hitilafu za HTTP katika programu kwa kutumia mazingira ya msingi ya msingi

Hali nyingine ni maombi yanayoisha kwa hitilafu za HTTP (404, 500, 502...) kwa programu ambayo haishughulikii hali kama hizo (kurasa zinazolingana hazijazalishwa). Hii inaweza pia kuwa kwa sababu ya hamu ya wasanidi kutumikia kurasa sawa za makosa katika programu nyingi.

Ili kutekeleza kesi hii kwa upande wa seva tunahitaji:

  1. Fuata maagizo hapo juu kutoka kwa aya kuhusu mazingira ya asilia;
  2. Ongeza kitufe kwenye usanidi wa nginx-ingress ConfigMap custom-http-errors, kwa mfano, na thamani 404,503 (ni wazi inalingana na nambari za makosa ambazo zimefunikwa na sheria mpya).

Matokeo yaliyotarajiwa yamepatikana: wakati ombi la mteja linapofanya kazi na kupokea hitilafu yenye msimbo wa majibu 404 au 503, ombi litaelekezwa upya kiotomatiki kwenye mandharinyuma mpya chaguomsingi...

Walakini, wakati wa kuunda programu ya urejeshaji wa chaguo-msingi na makosa maalum ya http, unahitaji kuzingatia kipengele muhimu:

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

Ukweli ni kwamba wakati ombi linaelekezwa upya, vichwa vitakuwa na habari muhimu na msimbo wa majibu uliopita na maelezo ya ziada (orodha yao kamili inapatikana. hapa).

Hii ina maana kwamba wewe mwenyewe lazima tunza msimbo sahihi wa majibu. Hapa kuna mfano kutoka kwa nyaraka jinsi inavyofanya kazi.

Programu tofauti zina viambajengo tofauti vya chaguo-msingi

Ili kuhakikisha kuwa suluhisho sio la kimataifa kwa nguzo nzima, lakini inatumika tu kwa programu maalum, kwanza unahitaji kuangalia toleo la Ingress. Ikiwa inalingana 0.23 au zaidi, tumia maelezo ya asili ya Ingress:

  1. Tunaweza kubatilisha default-backend kwa kila mmoja Ingress ya kwa kutumia maelezo;
  2. Tunaweza kubatilisha custom-http-errors kwa kila mmoja Ingress ya kwa kutumia maelezo.

Kama matokeo, rasilimali ya Ingress itaonekana kama hii:

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

Katika kesi hii, makosa 404 na 502 yataelekezwa kwenye huduma ya kurasa za makosa na vichwa vyote muhimu.

Π’ matoleo ya awali ya Ingress hayakuwa na kipengele hiki (ahadi mbaya saa 0.23) Na ikiwa una programu 2 tofauti kabisa zinazoendesha kwenye nguzo yako na unataka kutaja huduma tofauti-msingi-backend na usindikaji wa misimbo tofauti ya makosa kwa kila mmoja wao, kwa hili itabidi utumie njia za kazi, ambazo tuna mbili.

Ingress <0.23: karibia moja

Chaguo hili ni rahisi zaidi. Kama programu ambayo hutumikia kurasa zake, tuna HTML ya kawaida, ambayo haijui jinsi ya kuangalia vichwa na kurudisha misimbo sahihi ya majibu. Programu kama hiyo inatolewa na Ingress kutoka url /error-pages, na katika orodha ws itakuwa HTML iliyorejeshwa.

Mchoro katika 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

Huduma ya uwekaji huu lazima iwe ya aina ya ClusterIP.

Wakati huo huo, katika programu ambapo tutashughulikia kosa, katika Ingress tunaongeza kijisehemu cha seva au kijisehemu cha usanidi na maudhui yafuatayo:

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: mbinu ya pili

Chaguo kwa ajili ya programu ambayo inaweza kuchakata vichwa... Na kwa ujumla hii ni njia sahihi zaidi, iliyokopwa kutoka kwa makosa-ya-http ya desturi. Kuitumia kwa mikono (kunakili) itakuruhusu usibadilishe mipangilio ya ulimwengu.

Hatua ni kama ifuatavyo. Tunaunda kupelekwa sawa na programu ambayo inaweza kusikiliza vichwa vya habari muhimu na kujibu kwa usahihi. Ongeza kijisehemu cha seva kwenye programu ya Ingress na maudhui yafuatayo:

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

Kama unaweza kuona, kwa kila kosa ambalo tunataka kusindika, tunahitaji kutengeneza eneo letu, ambapo vichwa vyote muhimu vitaingizwa, kama vile "asili". kurasa-makosa-maalum. Kwa njia hii tunaweza kuunda kurasa tofauti za hitilafu zilizobinafsishwa hata kwa maeneo na seva mahususi.

PS

Nyingine kutoka kwa safu za vidokezo na hila za K8s:

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni