ืขืฆื•ืช ื•ื˜ืจื™ืงื™ื ืฉืœ Kubernetes: ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื‘-NGINX Ingress

ืขืฆื•ืช ื•ื˜ืจื™ืงื™ื ืฉืœ Kubernetes: ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื‘-NGINX Ingress

ื‘ืžืืžืจ ื–ื”, ืื ื™ ืจื•ืฆื” ืœื“ื‘ืจ ืขืœ ืฉืชื™ ืชื›ื•ื ื•ืช ืฉืœ NGINX Ingress ื”ืงืฉื•ืจื•ืช ืœื”ืฆื’ืช ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช, ื›ืžื• ื’ื ืขืœ ื”ืžื’ื‘ืœื•ืช ื”ืงื™ื™ืžื•ืช ื‘ื”ื ื•ื”ื“ืจื›ื™ื ืœืขืงื•ืฃ ืื•ืชืŸ.

1. ืฉื™ื ื•ื™ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ืื—ื•ืจื™

ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, NGINX Ingress ืžืฉืชืžืฉ ื‘-backend ื‘ืจื™ืจืช ื”ืžื—ื“ืœ, ืฉืžื‘ืฆืข ืืช ื”ืคื•ื ืงืฆื™ื” ื”ืžืชืื™ืžื”. ืžืฉืžืขื•ืช ื”ื“ื‘ืจ ื”ื™ื ืฉื›ืืฉืจ ืžื‘ืงืฉื™ื Ingress ื”ืžืฆื™ื™ืŸ ืžืืจื— ืฉืื™ื ื• ื ืžืฆื ื‘ืžืฉืื‘ื™ Ingress, ืื ื• ืžืงื‘ืœื™ื ืืช ื”ื“ืฃ ื”ื‘ื ืขื ืงื•ื“ ืชื’ื•ื‘ื” 404:

ืขืฆื•ืช ื•ื˜ืจื™ืงื™ื ืฉืœ Kubernetes: ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื‘-NGINX Ingress

ืขื ื–ืืช, ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื™ื•ืชืจ ื•ื™ื•ืชืจ ื”ืœืงื•ื—ื•ืช ืฉืœื ื• ืžื’ื™ืขื™ื ืขื ื‘ืงืฉื” ืœื”ืฆื™ื’ ืืช ื”ื“ืฃ ืฉืœื”ื ืขื ืœื•ื’ื• ืชืื’ื™ื“ื™ ื•ืฉื™ืจื•ืชื™ื ืื—ืจื™ื ื‘ืžืงื•ื 404 ื”ืกื˜ื ื“ืจื˜ื™. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ื™ืฉ ืœ-NGINX Ingress ื™ื›ื•ืœืช ืžื•ื‘ื ื™ืช ืœื”ื’ื“ื™ืจ ืžื—ื“ืฉ default-backend-service. ืื ื• ืžืขื‘ื™ืจื™ื ืืช ืขืจืš ื”ืคื•ืจืžื˜ ื›ืืจื’ื•ืžื ื˜ ืœืื•ืคืฆื™ื” ืฉืœ ืื•ืชื• ืฉื namespace/servicename. ื”ื™ืฆื™ืื” ืฉืœ ื”ืฉื™ืจื•ืช ืฆืจื™ื›ื” ืœื”ื™ื•ืช 80.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœื™ืฆื•ืจ ืคื•ื“ ืžืฉืœืš (ืคืจื™ืกื”) ื•ืฉื™ืจื•ืช ืขื ื”ื™ื™ืฉื•ื ืฉืœืš (ื™ื™ืฉื•ื ืœื“ื•ื’ืžื” ื‘-YAML ืžืžืื’ืจ ingress-nginx), ืฉื™ื™ื ืชืŸ ื‘ืžืงื•ื ื”-backend ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ.

ื”ื ื” ื”ืžื—ืฉื” ืงื˜ื ื”:

~$ 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, ื ื•ืคืœ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ-backend. ื‘ืจืฉื™ืžื” ืœืžืขืœื”, ืชื—ื•ื ื–ื” ื”ืคืš sadsdasdas.

2. ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช HTTP ื‘ืืคืœื™ืงืฆื™ื” ื‘ืืžืฆืขื•ืช ื”-backend ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ

ืžืฆื‘ ื ื•ืกืฃ ื”ื•ื ื‘ืงืฉื•ืช ื”ืžืกืชื™ื™ืžื•ืช ื‘ืฉื’ื™ืื•ืช HTTP (404, 500, 502...) ืœืืคืœื™ืงืฆื™ื” ืฉืœื ืžืขื‘ื“ืช ืžืฆื‘ื™ื ื›ืืœื” (ื”ื“ืคื™ื ื”ื™ืคื™ื ื”ืžืชืื™ืžื™ื ืœื ื ื•ืฆืจื™ื). ื™ื™ืชื›ืŸ ืฉื”ื“ื‘ืจ ื ื•ื‘ืข ื’ื ืžื”ืจืฆื•ืŸ ืฉืœ ืžืคืชื—ื™ื ืœืฉืจืช ืืช ืื•ืชื ื“ืคื™ ืฉื’ื™ืื” ื‘ืžืกืคืจ ื™ื™ืฉื•ืžื™ื.

ื›ื“ื™ ืœื™ื™ืฉื ืžืงืจื” ื–ื” ื‘ืฆื“ ื”ืฉืจืช ืื ื• ืฆืจื™ื›ื™ื:

  1. ื‘ืฆืข ืืช ื”ื”ื•ืจืื•ืช ืœืžืขืœื” ืžื”ืคืกืงื” ืขืœ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ืื—ื•ืจื™ืช;
  2. ื”ื•ืกืฃ ืžืคืชื— ืœืชืฆื•ืจืช nginx-ingress ConfigMap custom-http-errors, ืœืžืฉืœ, ืขื ื”ืขืจืš 404,503 (ื›ืžื•ื‘ืŸ ืžืชืื™ื ืœืงื•ื“ื™ ื”ืฉื’ื™ืื” ืฉืžื›ื•ืกื™ื ืขืœ ื™ื“ื™ ื”ื›ืœืœ ื”ื—ื“ืฉ).

ื”ืชื•ืฆืื” ื”ืฆืคื•ื™ื” ื”ื•ืฉื’ื”: ื›ืืฉืจ ืืคืœื™ืงืฆื™ื™ืช ื”ืœืงื•ื— ืคื•ืขืœืช ื•ืžืงื‘ืœืช ืฉื’ื™ืื” ืขื ืงื•ื“ ืชื’ื•ื‘ื” 404 ืื• 503, ื”ื‘ืงืฉื” ืชื•ืคื ื” ืื•ื˜ื•ืžื˜ื™ืช ืœ-backend ื”ื—ื“ืฉ ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ...

ืขื ื–ืืช, ื›ืืฉืจ ืžืคืชื—ื™ื ืืคืœื™ืงืฆื™ื” ืขื‘ื•ืจ ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืœ backend ื•-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.

ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื›ืืฉืจ ื‘ืงืฉื” ืžื•ืคื ื™ืช ืžื—ื“ืฉ, ื”ื›ื•ืชืจื•ืช ื™ื›ืœืœื• ืžื™ื“ืข ืฉื™ืžื•ืฉื™ ืขื ืงื•ื“ ื”ืชื’ื•ื‘ื” ื”ืงื•ื“ื ื•ืžื™ื“ืข ื ื•ืกืฃ (ื”ืจืฉื™ืžื” ื”ืžืœืื” ืฉืœื”ื ื–ืžื™ื ื” ื›ืืŸ).

ื–ื” ืื•ืžืจ ืฉืืชื” ื‘ืขืฆืžืš ื—ื™ื™ื‘ ืœื“ืื•ื’ ืœืงื•ื“ ื”ืชื’ื•ื‘ื” ื”ื ื›ื•ืŸ. ื”ื ื” ื“ื•ื’ืžื”. ืžื”ืชื™ืขื•ื“ ืื™ืš ื–ื” ืขื•ื‘ื“.

ืœื™ื™ืฉื•ืžื™ื ืฉื•ื ื™ื ื™ืฉ ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉื•ื ื”

ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื”ืคืชืจื•ืŸ ืื™ื ื• ื’ืœื•ื‘ืœื™ ืขื‘ื•ืจ ื”ืืฉื›ื•ืœ ื›ื•ืœื•, ืืœื ื—ืœ ืจืง ืขืœ ืืคืœื™ืงืฆื™ื•ืช ืกืคืฆื™ืคื™ื•ืช, ืชื—ื™ืœื” ืขืœื™ืš ืœื‘ื“ื•ืง ืืช ื’ืจืกืช 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 ื™ื™ืฉื•ืžื™ื ืฉื•ื ื™ื ืœื—ืœื•ื˜ื™ืŸ ืฉืคื•ืขืœื™ื ื‘ืืฉื›ื•ืœ ืฉืœืš ื•ืืชื” ืจื•ืฆื” ืœืฆื™ื™ืŸ ืฉื™ืจื•ืช ื‘ืจื™ืจืช ืžื—ื“ืœ ืื—ืจ ื•ืขื™ื‘ื•ื“ ืฉืœ ืงื•ื“ื™ ืฉื’ื™ืื” ืฉื•ื ื™ื ืขื‘ื•ืจ ื›ืœ ืื—ื“ ืžื”ื, ืœืฉื ื›ืš ืชืฆื˜ืจืš ืœื”ืฉืชืžืฉ ื‘ื“ืจื›ื™ื ืœืขืงื™ืคืช ื”ื‘ืขื™ื”, ืžื”ืŸ ื™ืฉ ืœื ื• ืฉื ื™ื™ื.

ื›ื ื™ืกื” < 0.23: ื’ื™ืฉื” ืื—ืช

ืืคืฉืจื•ืช ื–ื• ืคืฉื•ื˜ื” ื™ื•ืชืจ. ื›ืืคืœื™ืงืฆื™ื” ื”ืžืฉืจืชืช ืืช ื”ื“ืคื™ื ืฉืœื”, ื™ืฉ ืœื ื• HTML ืจื’ื™ืœ, ืฉืœื ื™ื•ื“ืข ืœื”ืกืชื›ืœ ืขืœ ื”ื›ื•ืชืจื•ืช ื•ืœื”ื—ื–ื™ืจ ืืช ืงื•ื“ื™ ื”ืชื’ื•ื‘ื” ื”ื ื›ื•ื ื™ื. ื™ื™ืฉื•ื ื›ื–ื” ืžืชื’ืœื’ืœ ืขื Ingress ืžื›ืชื•ื‘ืช ื”ืืชืจ /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;
      }

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ืขื‘ื•ืจ ื›ืœ ืฉื’ื™ืื” ืฉืื ื• ืจื•ืฆื™ื ืœืขื‘ื“, ืขืœื™ื ื• ืœื™ืฆื•ืจ ืžื™ืงื•ื ืžืฉืœื ื•, ืฉื‘ื• ื™ื•ื›ื ืกื• ื›ืœ ื”ื›ื•ืชืจื•ืช ื”ื“ืจื•ืฉื•ืช, ื›ืžื• ื‘ื–ื• ื”"ืžืงื•ืจื™ืช". ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช. ื›ืš ื ื•ื›ืœ ืœื™ืฆื•ืจ ื“ืคื™ ืฉื’ื™ืื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืฉื•ื ื™ื ืืคื™ืœื• ืขื‘ื•ืจ ืžื™ืงื•ืžื™ื ื•ืฉืจืชื™ื ื‘ื•ื“ื“ื™ื.

ื .ื‘.

ืื—ืจ ืžืกื“ืจืช ื”ื˜ื™ืคื™ื ื•ื”ื˜ืจื™ืงื™ื ืฉืœ K8s:

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”