Tip & trik Kubernetes: halaman kasalahan khusus dina NGINX Ingress

Tip & trik Kubernetes: halaman kasalahan khusus dina NGINX Ingress

Dina tulisan ieu, kuring hoyong ngobrol ngeunaan dua fitur NGINX Ingress anu aya hubunganana sareng nampilkeun halaman kasalahan anu dipersonalisasi, ogé watesan anu aya dina éta sareng cara pikeun ngerjakeunana.

1. Ngarobah backend standar

Sacara standar, NGINX Ingress nganggo backend standar, anu ngalaksanakeun fungsi anu saluyu. Ieu ngandung harti yén nalika nyuhunkeun Ingress nangtukeun host anu henteu aya dina sumber daya Ingress, kami nampi halaman di handap ieu kalayan kode réspon 404:

Tip & trik Kubernetes: halaman kasalahan khusus dina NGINX Ingress

Tapi, beuki sering klien kami datang sareng pamundut pikeun nunjukkeun halamanna kalayan logo perusahaan sareng fasilitas sanés tibatan standar 404. Jang ngalampahkeun ieu, NGINX Ingress boga kamampuhan diwangun-di ngartikeun deui default-backend-service. Urang lulus entri format salaku argumen kana pilihan tina nami nu sami namespace/servicename. Port jasa kedahna 80.

Jang ngalampahkeun ieu, anjeun kudu nyieun pod anjeun sorangan (deployment) jeung jasa jeung aplikasi Anjeun (conto palaksanaan di YAML ti Repository ingress-nginx), anu bakal dipasihkeun tibatan backend standar.

Ieu ilustrasi leutik:

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

Jadi sakabeh domain nu teu eksplisit dijieun via YAML kalawan kind: Ingress, digolongkeun kana standar-backend. Dina daptar di luhur, domain ieu janten sadsdasdas.

2. Nanganan kasalahan HTTP dina aplikasi ngagunakeun backend standar

kaayaan sejen requests tungtung kasalahan HTTP (404, 500, 502...) kana aplikasi nu teu ngolah kaayaan kitu (kaca geulis pakait teu dihasilkeun). Ieu ogé tiasa disababkeun ku kahayang pamekar pikeun ngalayanan halaman kasalahan anu sami dina sababaraha aplikasi.

Pikeun ngalaksanakeun hal ieu di sisi server kami peryogi:

  1. Turutan parentah di luhur tina paragraf ngeunaan backend standar;
  2. Tambahkeun konci kana konfigurasi nginx-ingress ConfigMap custom-http-errors, contona, kalawan nilai 404,503 (écés pakait jeung Konci kasalahan nu katutupan ku aturan anyar).

Hasil anu dipiharep parantos kahontal: nalika aplikasi klien dijalankeun sareng nampi kasalahan sareng kode réspon 404 atanapi 503, pamundutna bakal otomatis dialihkeun ka backend standar anyar...

Nanging, nalika ngembangkeun aplikasi pikeun backend standar sareng custom-http-kasalahan, anjeun kedah tumut kana fitur anu penting:

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

Kanyataanna nyaéta nalika pamundut dialihkeun, lulugu bakal ngandung inpormasi anu mangpaat sareng kode réspon saméméhna sareng inpormasi tambahan (daptar lengkepna sayogi. di dieu).

Ieu ngandung harti yén anjeun sorangan kudu ngurus kode respon bener. Ieu conto ti dokuméntasi kumaha gawéna.

Aplikasi béda gaduh backends standar béda

Pikeun mastikeun yén solusi henteu global pikeun sakabéh klaster, tapi ngan lumaku pikeun aplikasi husus, Anjeun mimitina kudu pariksa versi Ingress. Lamun cocog 0.23 atawa saluhureuna, nganggo anotasi Ingress asli:

  1. Urang bisa override default-backend keur masing-masing Ingress urang ngagunakeun anotasi;
  2. Urang bisa override custom-http-errors keur masing-masing Ingress urang ngagunakeun anotasi.

Hasilna, sumberdaya Ingress bakal katingali sapertos kieu:

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

Dina hal ieu, kasalahan 404 sareng 502 bakal dialihkeun kana jasa halaman-halaman sareng sadaya header anu diperyogikeun.

В versi saméméhna tina Ingress teu boga fitur ieu (fateful komitmen dina 0.23). Sareng upami anjeun gaduh 2 aplikasi anu béda-béda anu ngajalankeun dina kluster anjeun sareng anjeun badé netepkeun jasa standar-backend-layanan sareng ngolah kode kasalahan anu béda pikeun masing-masing, pikeun ieu anjeun kedah nganggo workarounds, dimana urang gaduh dua.

Ingress <0.23: ngadeukeutan hiji

pilihan ieu leuwih basajan. Salaku aplikasi anu ngalayanan halamanna, urang gaduh HTML biasa, anu henteu terang kumaha ningali header sareng ngabalikeun kode réspon anu leres. Aplikasi sapertos kitu digulung nganggo Ingress tina url /error-pages, sareng dina katalog ws bakal HTML balik.

Ilustrasi dina 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

Ladenan pikeun panyebaran ieu kedah tina jinis ClusterIP.

Dina waktos anu sami, dina aplikasi dimana kami bakal ngolah kasalahan, dina Ingress kami nambihan snippet-server atanapi snippet-configuration kalayan eusi ieu:

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: pendekatan kadua

Hiji pilihan pikeun aplikasi nu bisa ngolah headers ... Sarta sacara umum ieu cara leuwih bener, injeuman tina custom-http-kasalahan. Nganggo sacara manual (nyalin) bakal ngamungkinkeun anjeun henteu ngarobih setélan global.

Léngkah-léngkahna kieu. Urang nyieun deployment sarua kalayan aplikasi anu tiasa ngadangukeun judul anu diperyogikeun sareng ngabales leres. Tambahkeun snippet-server kana aplikasi Ingress kalayan eusi ieu:

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

Sakumaha anjeun tiasa tingali, pikeun tiap kasalahan anu urang hoyong diolah, urang kedah ngadamel lokasi urang sorangan, dimana sadaya header anu diperyogikeun bakal diselapkeun, sapertos dina "asli". custom-kasalahan-kaca. Ku cara ieu urang tiasa nyiptakeun halaman kasalahan pribadi anu béda bahkan pikeun lokasi sareng server individu.

PS

Séjén ti séri tip & trik K8s:

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar