डाउनटाइम के बिना डॉकटर कंटेनर को अपडेट करें


17

मान लीजिए कि मेरे पास वेब सर्वर (जैसे अपाचे 2) के साथ डॉकटर कंटेनर है। अब मैं इसके तहत ओएस को अपडेट करना चाहता हूं। यह एसएफ उत्तर कहता है कि सबसे अच्छा तरीका आधार छवि और मेरी अपाचे छवि का पुनर्निर्माण करना है। लेकिन छवि को तैनात करने का मतलब डाउनटाइम है क्योंकि मुझे नया कंटेनर बनाने से पहले पुराने कंटेनर को हटाना होगा, इसलिए केवल एक कंटेनर है जो 80/443 को पोर्ट करने के लिए बाध्यकारी है।

लेकिन मैं इस अपडेट को शून्य डाउनटाइम के साथ कैसे तैनात कर सकता हूं? क्या मुझे एक लोड बैलेंसर का उपयोग करना चाहिए और अंतर-कंटेनर संचार का उपयोग करना चाहिए? और मैं लोड बैलेंसर को कैसे अपडेट करूं?

जवाबों:


18

आदर्श लक्ष्य परिदृश्य

हां, आपको एक लोड बैलेंसर का उपयोग करना चाहिए और एक समय में एक उदाहरण को अपडेट करना चाहिए। मुझे यकीन नहीं है कि अंतर-कंटेनर संचार कहाँ आता है।

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

फिर, आप बैकएंड को अपग्रेड करना चाहते हैं, जो इस मामले में अपाचे उदाहरण हैं।

  1. B लोड बैलेंसर के लिए योग्य बैकएंड से बाहर ले जाएं ताकि यह अब किसी ट्रैफ़िक को स्वीकार नहीं कर रहा है।
  2. वर्तमान में दिए जाने वाले अनुरोधों की प्रतीक्षा करें और मौजूदा कनेक्शन बंद कर दिए जाएं।
  3. कंटेनर या अंतर्निहित VM को अपडेट करें जो B की सेवा करता है
  4. बी को पुनरारंभ करें, इसे लोड करने और काम करना शुरू करने के लिए प्रतीक्षा करें
  5. यह सुनिश्चित करने के लिए B परीक्षण करें कि यह नए अनुरोधों की ठीक से सेवा कर रहा है
  6. ट्रैफ़िक को फिर से सक्षम करने के लिए लोड बैलेंसर बैकएंड पूल में वापस बी जोड़ें

फिर, सी, डी, आदि के लिए एक ही प्रक्रिया करें।

ध्यान दें कि डॉकर कंटेनर के इन-प्लेस अपग्रेड के लिए नवंबर 2013 से एक खुला अनुरोध है , लेकिन यह बहुत प्रगति के लिए प्रकट नहीं होता है इसलिए उपरोक्त समाधान वह है जो आपको मतलब समय में करना चाहिए।

मौजूदा लाइव साइट के लिए क्या करें

संभवतः, आप यह इसलिए पूछ रहे हैं क्योंकि आप पहले से ही इस मॉडल में एक लाइव साइट चला रहे हैं और आप इसे डाउनटाइम के बिना अपग्रेड करना चाहते हैं। इसलिए, हमें ऊपर दिए गए आदर्श लक्ष्य राज्य में जाने की आवश्यकता है, लेकिन वृद्धिशील रूप से।

मान लेते हैं कि:

  • आपके पास अपने कंटेनर को इंगित करने वाला DNS नाम है
  • आपका कंटेनर कुछ IP पते पर चलता है
  • आपके उपयोगकर्ता कंटेनर के IP पते को नहीं जानते हैं और यह कहीं भी हार्ड-कोडेड नहीं है

यदि ये धारणाएँ झूठी हैं, तो आपको पहले इसे ऐसे ठीक करना चाहिए कि यह सही है।

फिर, इन चरणों का पालन करें:

  1. एक नए आईपी में एक लोड बैलेंसर बनाएं और इसे मौजूदा कंटेनर में केवल बैकएंड के रूप में इंगित करें
  2. सीधे कंटेनर आईपी के बजाय लोड बैलेंसर को इंगित करने के लिए डीएनएस बदलें
  3. समान VM + कंटेनर सेटअप के साथ एक समान Apache बैकएंड जोड़ें
  4. अब आपके पास दो बैकेंड बी और सी के साथ एक लोड बैलेंसर है, इसलिए उन्हें एक बार में अपग्रेड करने के लिए "आदर्श लक्ष्य परिदृश्य" अनुभाग में निर्देशों का पालन करें

कैसे एक लोड बैलेंसर अद्यतन करने के लिए

आसान (होस्टेड) ​​तरीका

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

मैनुअल तरीका है

यदि आप अपना खुद का लोड बैलेंसर चला रहे हैं, तो अप्रत्यक्ष (यानी, DNS) की एक और परत जोड़ने से मदद मिलेगी। चलो निम्नलिखित मान लेते हैं:

  • हमारे पास हमारे लोड बैलेंसर ए के आईपी को हल करने वाला एक होस्ट नाम है जिसे हम अपडेट करना चाहते हैं
  • हमारे लोड बैलेंसर में P1, P2, आदि का बैकेंड पूल है।

हम निम्नानुसार आगे बढ़ते हैं:

  • नए सॉफ्टवेयर संस्करण के साथ एक नया लोड बैलेंसर बी बनाएं
  • बैकेंड के रूप में हमारे नए लोड बैलेंसर बी में सभी बैकेंड पूल इंस्टेंस पी 1, पी 2 आदि को जोड़ दें
  • A के साथ DNS रिज़ॉल्यूशन में B का IP पता जोड़ें

    • अब हम प्रभावी रूप से DNS को लोड बैलेंसर के रूप में उपयोग कर रहे हैं
    • यदि A और B के लिए प्रविष्टियाँ अनवीटेड हैं, तो वे प्रभावी रूप से 50-50 हैं
    • अब देखना है कि B कैसा प्रदर्शन करता है, क्या कोई त्रुटि है आदि।
    • यदि बी के साथ कुछ भी गलत है, तो निम्नानुसार करें:

      1. DNS कॉन्फिगर से B हटाएं
      2. DNS में B प्रविष्टि के गायब होने की प्रतीक्षा करें (यानी, TTL के समाप्त होने की प्रतीक्षा करें )
      3. बी नीचे कर दें
  • मान लें कि आपने B के लिए "बर्न-इन" परीक्षण किया है और सब कुछ ठीक है
  • डीएनएस में प्राथमिकता और वजन को धीरे-धीरे अपडेट करें
  • DNS से ​​A को पूरी तरह से हटा दें
  • DNS TTL के समाप्त होने की प्रतीक्षा करें; A को अब कोई अनुरोध नहीं मिलना चाहिए
  • नीचे की ओर A करें

और आपने कल लिया।

विवरण, आरेख, और टूलींग

इन राइट-अप और टूल को देखें जो प्रक्रिया को स्वचालित करने में आपकी मदद कर सकते हैं, लेकिन सामान्य विचार समान है:

सीख

"कंप्यूटर विज्ञान में सभी समस्याओं को परोक्ष के एक और स्तर द्वारा हल किया जा सकता है, बहुत अधिक अप्रत्यक्ष की समस्या के लिए पाठ्यक्रम को छोड़कर।" - डेविड व्हीलर


लेकिन जब लोड बैलेंसर एक कंटेनर में होता है (कोरओएस का उपयोग करते समय), मैं इस कंटेनर को कैसे अपडेट करूं?
दास_ज

@das_j मैंने एक लोड बैलेंसर को अपडेट करने के लिए howto को जोड़ने का उत्तर संपादित किया। संकेत: यह अप्रत्यक्ष के एक और स्तर के बारे में है। :-)
मिशा ब्रुकमैन

1
सब सब में, यह लगता है कि कैसे एक भौतिक सर्वर और भौतिक भारोत्तोलकों को भी अद्यतन करेगा।
स्टीफन लासिवस्की

@StefanLasiewski आप बिल्कुल सही हैं और मैंने शीर्षकों में से एक में "कंटेनर" नोट को हटा दिया है। बाहरी उपयोगकर्ता के लिए, चाहे कोई ऐप या लोड बैलेंसर नंगे धातु, कंटेनर या वीएम पर चल रहा हो, काफी हद तक अदृश्य है।
मीशा ब्रुकमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.