मेरे पास k8s क्लस्टर में एक nginx परिनियोजन है जो मेरे api/ कॉल को इस तरह प्रॉक्सी करता है:

server {
  listen 80;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

  location /api {
    proxy_pass http://backend-dev/api;
  }
}

यह ज्यादातर समय काम करता है, हालांकि कभी-कभी जब api पॉड तैयार नहीं होते हैं, तो nginx त्रुटि के साथ विफल हो जाता है:

nginx: [emerg] host not found in upstream "backend-dev" in /etc/nginx/conf.d/default.conf:12

कुछ घंटों के लिए इंटरनेट की खोज करने के बाद, मुझे लेख जो काफी हद तक एक ही मुद्दा है। मैंने यह कोशिश की है:

  location /api {
    set $upstreamName backend-dev;
    proxy_pass http://$upstreamName/api;
  }

अब nginx 502 लौटाता है। और इस:

  location /api {
    resolver 10.0.0.10 valid=10s;
    set $upstreamName backend-dev;
    proxy_pass http://$upstreamName/api;
  }

Nginx 503 लौटाता है।

K8s पर इसे ठीक करने का सही तरीका क्या है?

2
orkenstein 17 जुलाई 2019, 14:28

1 उत्तर

सबसे बढ़िया उत्तर

यदि आपके API पॉड तैयार नहीं हैं, तो Nginx उन तक ट्रैफ़िक रूट नहीं कर पाएगा।

Kubernetes दस्तावेज़ीकरण से:

क्यूबलेट यह जानने के लिए तत्परता जांच का उपयोग करता है कि कंटेनर कब यातायात स्वीकार करना शुरू करने के लिए तैयार है। एक पॉड तैयार माना जाता है जब उसके सभी कंटेनर तैयार होते हैं। इस सिग्नल का एक उपयोग यह नियंत्रित करना है कि कौन से पॉड्स सेवाओं के लिए बैकएंड के रूप में उपयोग किए जाते हैं। जब कोई पॉड तैयार नहीं होता है, तो उसे सर्विस लोड बैलेंसर्स से हटा दिया जाता है।

यदि आप लाईनेस या रेडीनेस प्रोब का उपयोग नहीं कर रहे हैं, तो आपके पॉड को "रेडी" के रूप में चिह्नित किया जाएगा, भले ही कंटेनर के अंदर चल रहे आपके एप्लिकेशन ने इसकी स्टार्टअप प्रक्रिया पूरी नहीं की हो और ट्रैफ़िक स्वीकार करने के लिए तैयार हो।

पॉड्स और डीएनएस रिकॉर्ड से संबंधित प्रासंगिक अनुभाग यहां

क्योंकि पॉड नामों के लिए A रिकॉर्ड नहीं बनाया जाता है, पॉड के A रिकॉर्ड को बनाने के लिए होस्टनाम की आवश्यकता होती है। एक पॉड जिसका कोई होस्टनाम नहीं है, लेकिन उपडोमेन के साथ केवल हेडलेस सेवा (डिफ़ॉल्ट-subdomain.my-namespace.svc.cluster-domain.example) के लिए एक रिकॉर्ड बनाएगा, जो पॉड के आईपी पते की ओर इशारा करता है। इसके अलावा, पॉड को रिकॉर्ड रखने के लिए तैयार होने की जरूरत है जब तक कि publishNotReadyAddresses=True सेवा पर सेट न हो।

अपडेट करें: मेरा सुझाव है कि NGINX को इनग्रेड कंट्रोलर के रूप में इस्तेमाल करें।

जब आप एनजीआईएनएक्स को एक प्रवेश नियंत्रक के रूप में उपयोग करते हैं, तो एनजीआईएनएक्स सेवा सफलतापूर्वक शुरू हो जाती है और जब भी कोई प्रवेश नियम परिनियोजित किया गया है, NGINX कॉन्फ़िगरेशन है मक्खी पर पुनः लोड किया गया

यह आपको NGINX पॉड के पुनरारंभ होने से बचने में मदद करेगा।

3
jlmayorga 18 जुलाई 2019, 20:16