కుబెర్నెట్స్ చిట్కాలు & ఉపాయాలు: NGINX ప్రవేశంలో అనుకూల ఎర్రర్ పేజీలు

కుబెర్నెట్స్ చిట్కాలు & ఉపాయాలు: NGINX ప్రవేశంలో అనుకూల ఎర్రర్ పేజీలు

ఈ కథనంలో, నేను వ్యక్తిగతీకరించిన ఎర్రర్ పేజీలను ప్రదర్శించడానికి సంబంధించిన NGINX ప్రవేశానికి సంబంధించిన రెండు లక్షణాల గురించి, అలాగే వాటిలో ఉన్న పరిమితులు మరియు వాటిని అధిగమించే మార్గాల గురించి మాట్లాడాలనుకుంటున్నాను.

1. డిఫాల్ట్ బ్యాకెండ్‌ని మార్చడం

డిఫాల్ట్‌గా, NGINX ఇన్‌గ్రెస్ డిఫాల్ట్ బ్యాకెండ్‌ని ఉపయోగిస్తుంది, ఇది సంబంధిత ఫంక్షన్‌ను నిర్వహిస్తుంది. దీనర్థం ఇన్‌గ్రెస్ వనరులలో లేని హోస్ట్‌ని పేర్కొనడం కోసం ప్రవేశాన్ని అభ్యర్థించినప్పుడు, మేము 404 ప్రతిస్పందన కోడ్‌తో క్రింది పేజీని అందుకుంటాము:

కుబెర్నెట్స్ చిట్కాలు & ఉపాయాలు: NGINX ప్రవేశంలో అనుకూల ఎర్రర్ పేజీలు

అయినప్పటికీ, మా క్లయింట్లు తరచుగా తమ పేజీని ప్రామాణిక 404కి బదులుగా కార్పొరేట్ లోగో మరియు ఇతర సౌకర్యాలతో చూపించమని అభ్యర్థనతో వస్తారు. దీన్ని చేయడానికి, NGINX ప్రవేశం ఉంది అంతర్నిర్మిత సామర్థ్యం పునర్నిర్వచించండి 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. డిఫాల్ట్ బ్యాకెండ్‌ని ఉపయోగించి అప్లికేషన్‌లో HTTP లోపాలను నిర్వహించడం

మరొక పరిస్థితి అటువంటి పరిస్థితులను ప్రాసెస్ చేయని అప్లికేషన్‌కు (సంబంధిత అందమైన పేజీలు రూపొందించబడవు) HTTP ఎర్రర్‌లతో (404, 500, 502...) ముగిసే అభ్యర్థనలు. బహుళ అప్లికేషన్‌లలో ఒకే ఎర్రర్ పేజీలను అందించాలనే డెవలపర్‌ల కోరిక కూడా దీనికి కారణం కావచ్చు.

సర్వర్ వైపు ఈ కేసును అమలు చేయడానికి మనకు ఇది అవసరం:

  1. డిఫాల్ట్ బ్యాకెండ్ గురించి పేరా నుండి పై సూచనలను అనుసరించండి;
  2. nginx-ingress కాన్ఫిగరేషన్ ConfigMapకి ఒక కీని జోడించండి 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 లేదా అంతకంటే ఎక్కువ, స్థానిక ప్రవేశ ఉల్లేఖనాలను ఉపయోగించండి:

  1. మేము భర్తీ చేయవచ్చు default-backend కోసం ప్రతి ప్రవేశం యొక్క ఉల్లేఖనాలను ఉపయోగించడం;
  2. మేము భర్తీ చేయవచ్చు custom-http-errors కోసం ప్రతి ప్రవేశం యొక్క ఉల్లేఖనాలను ఉపయోగించడం.

ఫలితంగా, ప్రవేశ వనరు ఇలా కనిపిస్తుంది:

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ని కలిగి ఉన్నాము, ఇది హెడర్‌లను ఎలా చూడాలో మరియు సరైన ప్రతిస్పందన కోడ్‌లను ఎలా అందించాలో తెలియదు. అటువంటి అప్లికేషన్ 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 రకంగా ఉండాలి.

అదే సమయంలో, మేము లోపాన్ని ప్రాసెస్ చేసే అప్లికేషన్‌లో, ప్రవేశంలో మేము కింది కంటెంట్‌తో సర్వర్-స్నిప్పెట్ లేదా కాన్ఫిగరేషన్-స్నిప్పెట్‌ను జోడిస్తాము:

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 చిట్కాలు & ఉపాయాలు సిరీస్ నుండి ఇతర:

మా బ్లాగులో కూడా చదవండి:

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి