डिप्लॉयमेंटसमस्या निवारणसर्विस कभी हेल्दी नहीं होती

मेरी सर्विस डिप्लॉय होती है, लेकिन कभी हेल्दी नहीं होती

बिल्ड सफल होता है और नया पॉड शुरू हो जाता है, लेकिन डिप्लॉय फ़ेल मार्क हो जाता है या नए वर्ज़न तक कभी ट्रैफ़िक नहीं पहुँचता।

इसका क्या मतलब है

प्लेटफ़ॉर्म का हेल्थ चेक — आपके ऐप के पोर्ट पर TCP प्रोब — कभी पास नहीं होता, इसलिए ट्रैफ़िक कभी नए पॉड पर नहीं जाता। Lizard लगभग 30 सेकंड इंतज़ार करता है, फिर डिप्लॉय को फ़ेल मार्क कर देता है। जो सर्विस पहले से चल रही थी, वह पुराना वर्ज़न सर्व करती रहती है, बशर्ते उसमें वॉल्यूम अटैच न हो: वॉल्यूम होने पर पुराना पॉड पहले बंद होता है, और जब तक कोई डिप्लॉय पास न हो, सर्विस डाउन रहती है। पहला डिप्लॉय crashed के रूप में दिखता है।

ऐसा क्यों हो सकता है

  • आपका ऐप अपेक्षित पोर्ट पर नहीं सुन रहा। Lizard एक PORT एनवायरनमेंट वेरिएबल इंजेक्ट करता है (डिफ़ॉल्ट कंटेनर पोर्ट 3000) और जाँचता है कि आपका ऐप उस पोर्ट पर पहुँच में है या नहीं। अगर ऐप में कोई दूसरा पोर्ट हार्डकोड है, या वह किसी पोर्ट से बाइंड ही नहीं होता, तो हेल्थ चेक कभी पास नहीं होता। Python ऐप में यह सबसे आम है: जब तक आप अलग से न बताएँ, gunicorn और uvicorn 127.0.0.1 से बाइंड होते हैं, जबकि प्रोब प्रोसेस के बाहर से आता है। Python ऐप होस्टिंग में हर फ़्रेमवर्क के लिए ज़रूरी --bind 0.0.0.0:$PORT लाइन दी गई है।
  • सर्विस का पोर्ट इमेज से मेल नहीं खाता। जब lizard up बिना EXPOSE लाइन वाले Dockerfile से सर्विस बनाता है, तो वह पोर्ट 3000 सेट करता है, भले ही बेस इमेज किसी और पोर्ट पर सुनती हो, जैसे पोर्ट 80 पर nginx। PORT वेरिएबल से यह पोर्ट नहीं बदलता। lizard port <n> चलाकर रीडिप्लॉय करें, या EXPOSE लाइन जोड़ें। Lizard किस पोर्ट पर रूट करता है देखें।
  • सर्विस गलती से वर्कर मोड में है। containerPort=0 सेट करने से सर्विस वर्कर मोड में चली जाती है, जो हेल्थ चेक और लोड बैलेंसर रजिस्ट्रेशन को पूरी तरह छोड़ देता है। जो सर्विस HTTP सर्व करने के लिए थी, लेकिन containerPort=0 पर चली गई, वह “सफलतापूर्वक” डिप्लॉय तो हो जाएगी, पर कभी कुछ सर्व नहीं करेगी — वर्कर मोड स्टार्टअप की असली समस्या को सामने लाने के बजाय छिपा देता है।

संभावित समाधान

मौजूदा पोर्ट देखें

lizard port --service api

अगर यह worker mode प्रिंट करता है, तो सर्विस में containerPort=0 सेट है। अगर इस सर्विस को HTTP सर्व करना है, तो उसे वापस असली पोर्ट पर सेट करें:

lizard port 3000 --service api
lizard redeploy --service api

पक्का करें कि आपका ऐप वहीं सुन रहा है जहाँ Lizard उम्मीद करता है

रनटाइम लॉग में स्टार्टअप एरर देखें और वह एड्रेस भी, जिस पर ऐप ख़ुद बताता है कि वह सुन रहा है। उसकी तुलना सर्विस पोर्ट से करें, जिसे Lizard ऐप को PORT के रूप में पास करता है:

lizard logs --service api
lizard port --service api

यह भी देखें

अपडेट: