የኩበርኔትስ ምክሮች እና ዘዴዎች፡ ብጁ የስህተት ገጾች በNGINX Ingress ውስጥ

የኩበርኔትስ ምክሮች እና ዘዴዎች፡ ብጁ የስህተት ገጾች በNGINX Ingress ውስጥ

በዚህ ጽሑፍ ውስጥ ስለ ሁለት የ NGINX Ingress ባህሪያት ለግል የተበጁ የስህተት ገጾችን ከማሳየት ጋር የተዛመዱ, እንዲሁም ስለ ውሱንነት እና በዙሪያቸው ስለሚገኙባቸው መንገዶች ማውራት እፈልጋለሁ.

1. ነባሪውን የጀርባውን ጀርባ ይለውጡ

በነባሪነት፣ NGINX Ingress ተጓዳኝ ተግባሩን የሚያከናውን ነባሪውን የኋላ ክፍል ይጠቀማል። ይህ ማለት በ Ingress መርጃዎች ውስጥ ከሌለው አስተናጋጅ ጋር መግቢያ ስንጠይቅ ይህን ገጽ 404 የምላሽ ኮድ እናገኛለን፡-

የኩበርኔትስ ምክሮች እና ዘዴዎች፡ ብጁ የስህተት ገጾች በNGINX Ingress ውስጥ

ሆኖም ደንበኞቻችን ከመደበኛ 404 ይልቅ የኩባንያ አርማ እና ሌሎች አገልግሎቶችን እንዲያሳዩ በተደጋጋሚ ጥያቄ አቅርበዋል። ለዚህም, NGINX Ingress አለው አብሮገነብ አቅም እንደገና ይግለጹ default-backend-service. የቅርጸት መዝገቡን እንደ ክርክር ለተመሳሳይ ስም አማራጭ እናስተላልፋለን። namespace/servicename. የአገልግሎት ወደብ 80 መሆን አለበት።

ይህንን ለማድረግ የራስዎን ፖድ (ማሰማራት) እና ከመተግበሪያዎ ጋር አገልግሎት መፍጠር ያስፈልግዎታል (ምሳሌ ትግበራ በ YAML ከ ingress-nginx ማከማቻ), ይህም ከነባሪው ጀርባ ምትክ ይሰጣል.

አንድ ትንሽ ምሳሌ እነሆ፡-

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

ስለዚህ በ YAML በኩል በግልፅ ያልተፈጠሩ ሁሉም ጎራዎች kind: Ingress, በነባሪ-የጀርባ ጀርባ ውስጥ ይወድቁ. ከላይ ባለው ዝርዝር ውስጥ ይህ ጎራ ሆነ sadsdasdas.

2. በመተግበሪያው ውስጥ ያሉ የኤችቲቲፒ ስህተቶችን በነባሪው ጀርባ ማስተናገድ

ሌላው ሁኔታ በኤችቲቲፒ ስህተቶች (404, 500, 502…) የሚጨርሱ ጥያቄዎች እንደዚህ ያሉ ሁኔታዎችን ወደማይይዝ መተግበሪያ (ተዛማጅ ቆንጆ ገጾች አልተፈጠሩም)። እንዲሁም በብዙ መተግበሪያዎች ውስጥ ተመሳሳይ የስህተት ገጾችን ለመመለስ በገንቢዎች ፍላጎት ምክንያት ሊከሰት ይችላል።

ይህንን ጉዳይ በአገልጋዩ በኩል ለመተግበር እኛ ያስፈልገናል፡-

  1. ስለ ነባሪው የጀርባ ሽፋን ከአንቀጹ ከላይ ያሉትን መመሪያዎች ይከተሉ;
  2. ቁልፉን ወደ ውቅረት አክል ConfigMap nginx-ingress custom-http-errorsለምሳሌ, ከዋጋው ጋር 404,503 (በግልጽ በአዲሱ ህግ ከተካተቱት የስህተት ኮዶች ጋር ይዛመዳል)።

የሚጠበቀው ውጤት ተገኝቷል፡ የደንበኛ አፕሊኬሽኑ ሲሰራ እና ከ 404 ወይም 503 የምላሽ ኮድ ጋር ስሕተት ሲቀበል ጥያቄው በራስ ሰር ወደ አዲሱ ነባሪ ጀርባ ይዛወራል ...

ነገር ግን፣ ለነባሪ የጀርባ እና ብጁ-http-ስህተቶች መተግበሪያን ሲያዘጋጁ አንድ አስፈላጊ ባህሪ ግምት ውስጥ መግባት አለበት።

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

እውነታው ግን ጥያቄው ሲዛወር ራስጌዎቹ ከቀድሞው የምላሽ ኮድ እና ተጨማሪ መረጃ ጋር ጠቃሚ መረጃዎችን ይይዛሉ (ሙሉ ዝርዝራቸው ይገኛል) እዚህ).

ይህ ማለት አለብህ ማለት ነው። ትክክለኛውን የምላሽ ኮድ ይንከባከቡ. አንድ ምሳሌ እዚህ አለ። እንዴት እንደሚሰራ ከሰነድ.

የተለያዩ መተግበሪያዎች - የተለያዩ ነባሪ የኋላ

ስለዚህ መፍትሄው ለጠቅላላው ክላስተር ዓለም አቀፋዊ አይደለም, ነገር ግን ለተወሰኑ ትግበራዎች ብቻ የሚተገበር, በመጀመሪያ የመግቢያውን ስሪት ማረጋገጥ ያስፈልግዎታል. የሚዛመድ ከሆነ 0.23 እና ከዚያ በላይ፣ ቤተኛ Ingress ማብራሪያዎችን ተጠቀም፡-

  1. እንደገና መወሰን እንችላለን default-backendእያንዳንዳቸው ጋር መግባት ማብራሪያ;
  2. እንደገና መወሰን እንችላለን custom-http-errorsእያንዳንዳቸው ጋር መግባት ማብራሪያ.

በውጤቱም፣ የ Ingress መርጃው እንደዚህ ያለ ነገር ይመስላል።

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

በዚህ ሁኔታ, 404 እና 502 ስህተቶች ወደ ስህተት ገፆች አገልግሎት ከሁሉም አስፈላጊ ራስጌዎች ጋር ይዛወራሉ.

В የቀደሙት የ Ingress ስሪቶች ይህ ባህሪ አልነበራቸውም። (እጣ ፈንታ በ 0.23). እና በክላስተርዎ ውስጥ የሚሰሩ 2 ፍፁም የተለያዩ አፕሊኬሽኖች ካሉዎት እና የተለያዩ ነባሪ-backend-services እና ለእያንዳንዳቸው የተለያዩ የስህተት ኮዶችን ማስተናገድ ከፈለጉ ለዚህ መፍትሄ መጠቀም አለቦት፣ ከእነዚህም ውስጥ ሁለቱ አሉን።

መግቢያ <0.23: አንድ አቀራረብ

ይህ አማራጭ ቀላል ነው. ገጾቹን የሚያቀርብ መተግበሪያ እንደመሆናችን መጠን ራስጌዎችን እንዴት እንደሚመለከት እና ትክክለኛ የምላሽ ኮዶችን እንደሚመልስ የማያውቅ ግልጽ HTML አለን። እንዲህ ዓይነቱ መተግበሪያ ከ Ingress with url ጋር ይወጣል /error-pages, እና በማውጫው ውስጥ ws HTML ይሰጠዋል.

ምሳሌ በ 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

የዚህ ማሰማራት አገልግሎት የክላስተርአይፒ ዓይነት መሆን አለበት።

በተመሳሳይ ጊዜ ስህተቱን በምንይዝበት አፕሊኬሽን ውስጥ ኢንግረስ ውስጥ የአገልጋይ-ቅንጣቢ ወይም ውቅረት-ቅንጣን ከሚከተለው ይዘት ጋር እንጨምራለን፡

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

መግቢያ <0.23: ሁለተኛ አቀራረብ

የመተግበሪያ ተለዋጭ ራስጌዎችን ማሄድ ይችላል ... እና በአጠቃላይ ይህ የበለጠ ትክክለኛ መንገድ ነው ከብጁ-http-ስህተት። በእጅ መጠቀም (መገልበጥ) ዓለም አቀፋዊ ቅንብሮችን እንዳይቀይሩ ያስችልዎታል.

ደረጃዎቹ እንደሚከተለው ናቸው. እኛ እንፈጥራለን ተመሳሳይ ማሰማራት ትክክለኛ ራስጌዎችን ማዳመጥ እና በትክክል ምላሽ መስጠት በሚችል መተግበሪያ። ከሚከተለው ይዘት ጋር የአገልጋይ ቅንጣቢ መተግበሪያዎችን ወደ መግቢያው እንጨምራለን፡

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

እንደሚመለከቱት ፣ እኛ ልንሰራው የምንፈልገው እያንዳንዱ ስህተት ፣ እንደ “ቤተኛ” ሁሉም አስፈላጊ አርእስቶች የሚተኩበት የራሳችንን ቦታ መፍጠር አለብን ። ብጁ-ስህተት-ገጾች. በዚህ መንገድ ለግል አካባቢዎች እና አገልጋዮች እንኳን የተለያዩ ግላዊ የስህተት ገጾችን መፍጠር እንችላለን።

PS

ከK8s ተከታታይ ምክሮች እና ዘዴዎች ሌሎች፡-

በብሎጋችን ላይ ያንብቡ፡-

ምንጭ: hab.com

አስተያየት ያክሉ