Маслиҳатҳо ва ҳилаҳои Kubernetes: саҳифаҳои хатогиҳои фармоишӣ дар NGINX Ingress

Маслиҳатҳо ва ҳилаҳои Kubernetes: саҳифаҳои хатогиҳои фармоишӣ дар NGINX Ingress

Дар ин мақола, ман мехоҳам дар бораи ду хусусияти NGINX Ingress марбут ба намоиши саҳифаҳои хатогиҳои фардӣ, инчунин маҳдудиятҳое, ки дар онҳо мавҷуданд ва роҳҳои кор дар атрофи онҳо сӯҳбат кунам.

1. Тағйир додани пуштибонии пешфарз

Бо нобаёнӣ, NGINX Ingress пуштибонии пешфарзро истифода мебарад, ки вазифаи мувофиқро иҷро мекунад. Ин маънои онро дорад, ки ҳангоми дархости Ingress, ки хостеро, ки дар захираҳои Ingress нест, дархост мекунад, мо саҳифаи зеринро бо рамзи ҷавоби 404 мегирем:

Маслиҳатҳо ва ҳилаҳои Kubernetes: саҳифаҳои хатогиҳои фармоишӣ дар NGINX Ingress

Аммо, бештар ва бештар муштариёни мо бо дархости нишон додани саҳифаи худ бо логотипи корпоративӣ ва дигар шароити мусоид ба ҷои стандарти 404 меоянд. Барои ин, NGINX Ingress дорад қобилияти дарунсохт аз нав муайян кардан default-backend-service. Мо вуруди форматро ҳамчун далел ба варианти ҳамон ном мегузорем namespace/servicename. Порти хидмат бояд 80 бошад.

Барои ин ба шумо лозим аст, ки бо замимаи худ pod (ҷойгиркунӣ) ва хидмати худро эҷод кунед (намунаи татбиқи 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, ба default-backend афтод. Дар рӯйхати боло, ин домен шуд sadsdasdas.

2. Коркарди хатогиҳои HTTP дар барнома бо истифода аз пуштибонии пешфарз

Вазъияти дигар дархостҳое мебошад, ки бо хатогиҳои HTTP (404, 500, 502...) анҷом меёбанд, ба барномае, ки чунин ҳолатҳоро коркард намекунад (саҳифаҳои зебои мувофиқ тавлид намешаванд). Ин метавонад инчунин аз хоҳиши таҳиягарон барои хидматрасонии як саҳифаҳои хато дар якчанд замимаҳо бошад.

Барои татбиқи ин ҳолат дар тарафи сервер ба мо лозим аст:

  1. Дастурҳои дар боло зикршударо дар бораи пуштибонии пешфарз иҷро кунед;
  2. Ба конфигуратсияи ConfigMap nginx-ingress калид илова кунед custom-http-errors, масалан, бо арзиш 404,503 (баръало ба рамзҳои хатогие, ки бо қоидаи нав фаро гирифта шудаанд, мувофиқат мекунад).

Натиҷаи интизорӣ ба даст омад: вақте ки барномаи муштарӣ кор мекунад ва хатогиро бо рамзи посухи 404 ё 503 мегирад, дархост ба таври худкор ба пуштибонии пешфарзи нав равона карда мешавад...

Аммо, ҳангоми таҳияи барнома барои пуштибонии пешфарз ва хатоҳои фармоишӣ, шумо бояд як хусусияти муҳимро ба назар гиред:

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

Гап дар он аст, ки ҳангоми интиқоли дархост, сарлавҳаҳо дорои маълумоти муфид бо рамзи ҷавоби қаблӣ ва маълумоти иловагӣ (рӯйхати пурраи онҳо мавҷуд аст) дар ин ҷо).

Ин маънои онро дорад, ки шумо худатон бояд ғамхорӣ рамзи ҷавоб дуруст. Ин намунаи мисол аст аз ҳуҷҷатҳо, ки чӣ тавр кор мекунад.

Барномаҳои гуногун дорои пешфарзҳои гуногун мебошанд

Барои боварӣ ҳосил кардан, ки ҳалли он барои тамоми кластер глобалӣ нест, балки танҳо ба барномаҳои мушаххас дахл дорад, шумо аввал бояд версияи Ingress-ро тафтиш кунед. Агар мувофиқат кунад 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 барномаи комилан гуногун кор карда истода бошед ва шумо хоҳед, ки хидмати гуногуни default-backend-service ва коркарди рамзҳои хатогиҳои гуногунро барои ҳар яки онҳо муайян кунед, барои ин шумо бояд роҳҳои ҳалли худро истифода баред, ки мо дуто дорем.

Воридшавӣ <0.23: наздик ба як

Ин вариант соддатар аст. Ҳамчун барномае, ки ба саҳифаҳои худ хидмат мекунад, мо HTML-и муқаррарӣ дорем, ки намедонад, ки чӣ гуна ба сарлавҳаҳо нигоҳ кардан ва кодҳои ҷавоби дурустро баргардониданро намедонад. Чунин барнома бо Ingress аз 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

Хидмат барои ин густариш бояд аз навъи ClusterIP бошад.

Ҳамзамон, дар барномае, ки мо хатогиро коркард мекунем, дар Ingress мо порчаи сервер ё конфигуратсияро бо мундариҷаи зерин илова мекунем:

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: равиши дуюм

Варианти барномае, ки метавонад сарлавҳаҳоро коркард кунад... Ва дар маҷмӯъ ин роҳи дурусттарест, ки аз custom-http-errors гирифта шудааст. Истифодаи дастӣ (нусхабардорӣ) ба шумо имкон медиҳад, ки танзимоти глобалиро тағир надиҳед.

Қадамҳо чунинанд. Мо эҷод мекунем ҳамон ҷойгиркунӣ бо барномае, ки метавонад сарлавҳаҳои заруриро гӯш кунад ва дуруст ҷавоб диҳад. Ба барномаи Ingress бо мундариҷаи зерин порчаи сервер илова кунед:

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:

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ