मेरी सर्विस डिप्लॉय होती है, लेकिन कभी हेल्दी नहीं होती
बिल्ड सफल होता है और नया पॉड शुरू हो जाता है, लेकिन डिप्लॉय फ़ेल मार्क हो जाता है या नए वर्ज़न तक कभी ट्रैफ़िक नहीं पहुँचता।
इसका क्या मतलब है
प्लेटफ़ॉर्म का हेल्थ चेक — आपके ऐप के पोर्ट पर TCP प्रोब — कभी पास नहीं होता, इसलिए ट्रैफ़िक कभी नए पॉड पर नहीं जाता। Lizard लगभग 30 सेकंड इंतज़ार करता है, फिर डिप्लॉय को फ़ेल मार्क कर देता है। जो सर्विस पहले से चल रही थी, वह पुराना वर्ज़न सर्व करती रहती है, बशर्ते उसमें वॉल्यूम अटैच न हो: वॉल्यूम होने पर पुराना पॉड पहले बंद होता है, और जब तक कोई डिप्लॉय पास न हो, सर्विस डाउन रहती है। पहला डिप्लॉय crashed के रूप में दिखता है।
ऐसा क्यों हो सकता है
- आपका ऐप अपेक्षित पोर्ट पर नहीं सुन रहा। Lizard एक
PORTएनवायरनमेंट वेरिएबल इंजेक्ट करता है (डिफ़ॉल्ट कंटेनर पोर्ट3000) और जाँचता है कि आपका ऐप उस पोर्ट पर पहुँच में है या नहीं। अगर ऐप में कोई दूसरा पोर्ट हार्डकोड है, या वह किसी पोर्ट से बाइंड ही नहीं होता, तो हेल्थ चेक कभी पास नहीं होता। Python ऐप में यह सबसे आम है: जब तक आप अलग से न बताएँ,gunicornऔरuvicorn127.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यह भी देखें
- बैकग्राउंड वर्कर —
containerPort=0कब सही विकल्प है (और कब नहीं)। - डिप्लॉयमेंट → लाइफ़साइकल — डिप्लॉय में हेल्थ चेक किस चरण पर होता है।
अपडेट: