AWS में साधारण सीआई / सीडी कंटेनर


14

मैं एक नया डॉकटर कंटेनर बनाने के लिए एडब्ल्यूएस कोड पाइपलाइन, कोड बिल्ड का उपयोग कर रहा हूं और इसे ईसीआर में धकेल रहा हूं।

मेरा आवेदन एक सरल सीधे-आगे एकल-कंटेनर आधारित है। वर्तमान में चल रहे कंटेनर को खींचने और ईसीएस रजिस्ट्री (कोड बिल्ड थ्रू कोड पाइपलाइन के आउटपुट) से एक नए कंटेनर को फिर से लॉन्च करने के लिए कम घर्षण दृष्टिकोण क्या होगा।

मैंने EC2 उपयोगकर्ता डेटा के साथ CloudFormation की कोशिश की, एक तरफ कस्टम स्क्रिप्ट और दूसरी तरफ कार्य परिभाषा के साथ ECS के साथ CloudFormation (अभी तक सफल नहीं)। मुझे दृढ़ता से लगता है कि अधिक स्पष्ट और सरल दृष्टिकोण होना चाहिए।

जवाबों:


16

मैं ईसीएस कंटेनर उदाहरण (मैं डॉकर्स होस्ट्स के बारे में बात कर रहा हूं - मुझे यहां एडब्ल्यूएस शब्दावली पसंद नहीं है) और तैनाती दो अलग-अलग चीजों के रूप में होगी।

अपने ECS को स्टैक करें और चलाएं। आप CloudFormation और Auto-स्केलिंग समूहों के माध्यम से इसे प्रबंधित कर सकते हैं, यह ठीक है। बस एक मंच है जहाँ आप को तैनात होगा के रूप में अपने क्लस्टर के बारे में सोच करने के लिए , नहीं कुछ आप की जरूरत है पुनर्वितरित

फिर, सीडी के लिए, अब तक का सबसे आसान तरीका एक नई कार्य परिभाषा का उपयोग करने के लिए सेवा परिभाषा को अपडेट करना है और ईसीएस रोलिंग को आपके लिए कंटेनरों को अपडेट करने देना है।

हर बार जब यह एक कार्य शुरू करता है, तो ईसीएस डॉक पुल इमेज चलाएगा: टैग भले ही उसके पास स्थानीय रूप से छवि हो यह सुनिश्चित करने के लिए कि उस छवि का नवीनतम संस्करण है: टैग। तो आपके द्वारा उपयोग किया जाने वाला छवि टैग वास्तव में कोई फर्क नहीं पड़ता (हर बिल्ड पर टैग को बदलने की कोई आवश्यकता नहीं है)।

इसका मतलब है कि आप इसे आसानी से तैनात करने के लिए myimage: नवीनतम ओवर-ओवर बना सकते हैं।

आपको जिस चीज़ की ज़रूरत है वह एक कार्य परिभाषा है जहाँ छवि = myimage: नवीनतम। उस कार्य परिभाषा के साथ एक सेवा बनाएं और हर बार जब ईसीएस एक कार्य (आपकी सेवा का एक उदाहरण) शुरू करता है तो यह आपके द्वारा बनाया गया सबसे नवीनतम "myimage: नवीनतम" होगा।

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

एक उदाहरण:

मान लेते हैं कि आपने MyService नामक एक सेवा बनाई है। कि आप कार्य परिभाषा MyTaskDefinition: 1 (संशोधन 1) के लिए 2 कार्य चलाने के लिए उस सेवा को कॉन्फ़िगर कर चुके हैं। उस कार्य परिभाषा में, आपके पास एक कंटेनर परिभाषा है जो छवि "myimage: नवीनतम" पर सेट है।

  1. कल आपने myimage का निर्माण किया: नवीनतम जिसमें ID (SHA) 365d8f7bf565 था।
  2. आपका कंटेनर उदाहरण ABC, MyTaskDefinition- 1 -containerName-someLongId नामक एक कार्य चला रहा है । जब आप उस कंटेनर का निरीक्षण करते हैं, तो यह "sha256: 365d8f7bf565 .........." छवि को चला रहा है
  3. आपका अन्य कंटेनर उदाहरण DEF एक और कार्य चला रहा है। इसका एक समान नाम है (केवल आईडी भिन्न है), लेकिन यह एक ही छवि चला रहा है।
  4. आप अपने रेपो में बदलाव को आगे बढ़ाते हैं।
  5. CodePipeline उस बदलाव को चुनता है, जो छवि को ECR में बनाता और प्रकाशित करता है।
  6. यह नई डॉकटर छवि भी myimage: नवीनतम है, लेकिन इसकी ID (SHA) f7ec5e54ac96 है
  7. अब आपको लेम्बडा फ़ंक्शन और AWS NodeJS SDK का उपयोग करने के लिए अपनी पाइपलाइन में एक कदम जोड़ने की आवश्यकता है:
    1. एक नई कार्य परिभाषा बनाएं (जो पहले जैसी ही होगी)। वह MyTaskDefinition: 2 होगा
    2. MyTaskDefinition: 2 (1 के बजाय) का उपयोग करने के लिए अपने MyService को अपडेट करें
  8. ईसीएस नए कार्यों का निर्माण करेगा। कंटेनर के नाम MyTaskDefinition- 2 -containerName-someLongId होंगे। जब आप उन कंटेनरों का निरीक्षण करेंगे, तो आप देखेंगे कि वे "sha256: f7ec5e54ac96 ......." चलेंगे। शायद आपके पास कंटेनर उदाहरण एबीसी पर 2 कार्य होंगे, शायद उन्हें छिड़का जाएगा (जो आपकी सेवा के कॉन्फ़िगरेशन पर निर्भर करता है)
  9. कुछ समय बाद ECS पुराने कार्य MyTaskDefinition-1-containerName-someLongId को ABC और DEF से हटा देगा।

नोट: आपको वास्तव में एक नई कार्य परिभाषा बनाने की आवश्यकता नहीं है। यदि आप चाहते हैं कि आप इसके बजाय सेवा के कार्यों की सूची को पुनः प्राप्त कर सकते हैं और मैन्युअल रूप से उन्हें एक-एक करके बंद कर सकते हैं। आपको एक नए को रोकने से पहले ईसीएस के लिए एक कार्य को फिर से शुरू करने के लिए इंतजार करना चाहिए (वह है: पहला कंटेनर रोकें, ईसीएस की प्रतीक्षा करें इसे बदलने के लिए, दूसरा कंटेनर रोकें)। जब ECS कंटेनर को पुनरारंभ करता है, तो यह सबसे हाल ही में प्राप्त होने वाला माइमेज हड़प लेगा: नवीनतम निर्मित, जैसा कि पहले बताया गया है। मुझे लगता है कि एक नई कार्य परिभाषा बनाना आसान है और कम त्रुटि प्रवण (प्रतीक्षा करने और जांचने के लिए कोई तर्क की आवश्यकता नहीं है, यदि आपके पास नया कार्य परिभाषा है तो ईसीएस आपके लिए रोलिंग अपडेट को संभाल लेगा)।


कमाल - मैं आपके जवाब को डॉक के लिए सीआई / सीडी के लिए लापता मैनुअल के रूप में कहूंगा। धन्यवाद।
नवीन विजय

3

वर्णित सरल उपयोग के मामले में, मैं सुझाव दूंगा के लिए इलास्टिक बीनस्टॉक की जाँच करना, यह नंगे ईसीएस उपयोग की तरह न्यूनतम समाधान नहीं है, लेकिन आप ईएलबी, ईसी 2 ऑटोस्केल, स्वास्थ्य निगरानी और बहुत कुछ जैसे ऑटो-प्रबंधित और कॉन्फ़िगर सेवाओं से लाभ उठा सकते हैं।

उच्च-स्तरीय सारांश:

  1. विशिष्ट टैग myimage का उपयोग करने के लिए लोचदार बीनस्टॉक को कॉन्फ़िगर करें: परीक्षण किया गया
  2. टैग "परीक्षण" का निर्माण, परीक्षण और बढ़ावा देने के लिए कोड पाइपलाइन / बिल्ड का उपयोग करें
  3. ट्रिगर लोचदार बीनस्टॉक परिनियोजन, जो पदोन्नत छवि myimage को खींच लेगा: सभी उदाहरणों के लिए परीक्षण किया गया, उपलब्ध परिनियोजन रणनीतियाँ।

एक ही टैग को फिर से उपयोग करने पर आधारित यह दृष्टिकोण, वैकल्पिक दृष्टिकोण बिल्ड आईडी के साथ टैग उत्पन्न कर रहा होगा, उदाहरण के लिए myimage: परीक्षण -42, इसके लिए हर बार नए टैग के साथ इलास्टिक बीनस्टॉक को अपडेट करना होगा, लेकिन तैनात किए गए संशोधन पर अधिक दानेदार नियंत्रण देता है।


0

मैं अपनी सादगी के लिए दूसरा लोचदार बीनस्टॉक; यह सेटअप और तैनाती के लिए बहुत आसान है।

यदि आप docker-compose से परिचित हैं, तो एक और तरीका docker-compose.yml को परिभाषित करने और ECS-cli के साथ सीधे ECS पर तैनात करने का होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.