अमेज़ॅन ईसीएस में एक सेवा के कंटेनर को अपडेट करें


32

Amazon ECS में चलने वाली सेवा के कंटेनर को अपडेट करने के लिए किस तरह के दृष्टिकोण की सिफारिश की जाती है?

एडब्ल्यूएस प्रलेखन कहते हैं: "आप अपने आवेदन के डोकर छवि को अद्यतन किया है, तो आप उस छवि के साथ एक नया कार्य परिभाषा बनाते हैं और अपने सेवा, एक समय में एक काम करने के लिए इसे तैनात कर सकते हैं।" यह बहुत कुछ सब कुछ है जो वर्तमान में प्रलेखन में उपलब्ध है (13 अप्रैल 2015)।

क्या मैं सही तरीके से समझ पाया, कि अमेज़न ईसीएस में अपने एप्लिकेशन कंटेनर को अपडेट करने का एकमात्र तरीका एक नया कार्य बनाना है, फिर पुराने कार्य को रोकना और नया कार्य शुरू करना है?

मैं कोर ओएस और फ्लीटक्टल के साथ "नवीनतम" टैग का सफलतापूर्वक उपयोग कर रहा हूं। नए अपडेट के लिए डॉकर छवि के टैग को बदलने की आवश्यकता नहीं होने का यह लाभ है, क्योंकि सेवा को फिर से लोड करने पर नए परिवर्तन दिखाई देंगे और कंटेनर को अपडेट करेंगे (उसी टैग का उपयोग करके "नवीनतम")।

अमेज़ॅन ईसीएस में अपडेटेड डॉक छवि के साथ अपनी सेवा को अपडेट करने के लिए आपने किस तरह के दृष्टिकोण का उपयोग किया है?


इसके अलावा यह पता लगाने की कोशिश कर रहे हैं, क्योंकि हम उत्पादन में लगातार चलाने के लिए कई प्रकार के डेमन की तैनाती के लिए ईसीएस का उपयोग करने की उम्मीद कर रहे हैं।
पैरेंट ५४४६

1
बस पुष्टि करने के लिए, आपने कहा था कि एक ecs सेवा को पुनरारंभ करने से किसी छवि का नवीनतम संस्करण नीचे आ जाएगा? मैं इस बारे में दस्तावेज ढूंढ रहा हूं और इसे कहीं भी नहीं पा सकता हूं।
mmilleruva

1
इस पर कोई पुष्टि?
लियोर ओहाना

@LiorOhana दुख की बात यह सच है। विवरण के लिए मेरा उत्तर देखें।
हैमक्स 09

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

जवाबों:


18

यह सुनिश्चित नहीं है कि अगर इसे छोड़ दिया गया प्रश्न माना जाता है - मेरे मुद्दे का निवारण करते समय इस पर ठोकर खाई और अब मेरा समाधान जोड़ रहा है कि यह हल हो गया है।

नए कंटेनर के साथ सेवा को अपडेट करने के लिए, आपको निम्न करने की आवश्यकता है:

  1. भंडार में नया कंटेनर अपलोड करें;
  2. ट्रिगर कार्य परिभाषा अद्यतन;
  3. ट्रिगर कंटेनर अद्यतन;
  4. महत्वपूर्ण: सुनिश्चित करें कि सेवा नियम कार्य के नए संस्करण को लॉन्च करने की अनुमति देते हैं।

यदि सेवा कार्य को नवीनतम संस्करण में अपडेट नहीं किया गया है, तो त्रुटियों के लिए "ईवेंट" टैब की जांच करें। उदाहरण के लिए, शायद ECS आपकी सेवा के नए संस्करण को शुरू करने में सक्षम नहीं था: आपके पास क्लस्टर में केवल एक ec2 उदाहरण है और अनुप्रयोग पोर्ट पहले से ही होस्ट पर उपयोग किया जाता है। इस मामले में, "न्यूनतम स्वास्थ्य / अधिकतम स्वास्थ्य" की सीमा "0%, 100%" पर सेट करें - इस तरह, ईसीएस नए को तैनात करने से पहले पुराने कंटेनर को मारने का चयन करेगा। यह भी कुछ मिनटों के दौरान हो रहा है - अगर आप तत्काल प्रतिक्रिया नहीं देखते हैं तो जल्दबाजी न करें।

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

awsRegion=us-east-1
containerName=..
containerRepository=..
taskDefinitionFile=...
taskDefinitionName=...
serviceName=...


echo 'build docker image...'
docker build -t $containerName .

echo 'upload docker image...'
docker tag $containerName:latest $containerRepository:$containerName
docker push $containerRepository:$containerName

echo 'update task definition...'
aws ecs register-task-definition --cli-input-json file://$taskDefinitionFile --region $awsRegion > /dev/null

echo 'update our service with that last task..'
aws ecs update-service --service $serviceName --task-definition $taskDefinitionName --region $awsRegion  > /dev/null

2
यह मुझे स्थानीय रूप से फ़ाइल के रूप में एक कार्य परिभाषा रखने के लिए मजबूर करता है, और अगर मैं सही ढंग से समझता हूं, तो यह एकमात्र स्थान है जहां मैं पर्यावरण चर को परिभाषित कर सकता हूं। क्या स्थानीय स्तर पर पर्यावरण चर होने के बिना ऐसा करने का कोई तरीका है? आदर्श रूप में मैं कार्य / सेवा / कंटेनर / आदि के बारे में कोई अन्य जानकारी भेजे बिना एक नए डॉकटर छवि टैग को इंगित करने के लिए एक कमांड जारी करना चाहता हूं।
rmac

1
टिप्पणियों पर set "min health/max health" limits to "0%, 100%"सुनहरा है। आपको बहुत - बहुत धन्यवाद!
शिवाबुध

1
यहां सावधानी के शब्द, यदि आप अपना कार्य सेट करते minहैं 0%, जब आप कार्य को अपनी सेवा की परिभाषा में बदल देते हैं, तो आप अनिवार्य रूप से उस तैनाती के लिए एक ही समय में सभी कार्यों को नीचे लाने के लिए पूर्ण अधिकार दे रहे हैं ।
मृदुक


1

मैं अपने सुधारों के साथ ईकस-तैनात स्क्रिप्ट से कुछ भाग का उपयोग करता हूं (यह प्रत्येक कंटेनर विवरण से चित्र लेता है, और इसके टैग भाग को $ TAG_PURE के साथ बदलता है): https://gist.github.com/Forever-Young/e939dccc41bc7a105cdcf8cd7ab9d714149d71414

# based on ecs-deploy script
TASK_DEFINITION_NAME=$(aws ecs describe-services --services $SERVICE --cluster $CLUSTER | jq -r .services[0].taskDefinition)
TASK_DEFINITION=$(aws ecs describe-task-definition --task-def "$TASK_DEFINITION_NAME" | jq '.taskDefinition')
NEW_CONTAINER_DEFINITIONS=$(echo "$TASK_DEFINITION" | jq --arg NEW_TAG $TAG_PURE 'def replace_tag: if . | test("[a-zA-Z0-9.]+/[a-zA-Z0-9]+:[a-zA-Z0-9]+") then sub("(?<s>[a-zA-Z0-9.]+/[a-zA-Z0-9]+:)[a-zA-Z0-9]+"; "\(.s)" + $NEW_TAG) else . end ; .containerDefinitions | [.[] | .+{image: .image | replace_tag}]')
TASK_DEFINITION=$(echo "$TASK_DEFINITION" | jq ".+{containerDefinitions: $NEW_CONTAINER_DEFINITIONS}")
# Default JQ filter for new task definition
NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions"
# Some options in task definition should only be included in new definition if present in
# current definition. If found in current definition, append to JQ filter.
CONDITIONAL_OPTIONS=(networkMode taskRoleArn)
for i in "${CONDITIONAL_OPTIONS[@]}"; do
  re=".*${i}.*"
  if [[ "$TASK_DEFINITION" =~ $re ]]; then
    NEW_DEF_JQ_FILTER="${NEW_DEF_JQ_FILTER}, ${i}: .${i}"
  fi
done

# Build new DEF with jq filter
NEW_DEF=$(echo $TASK_DEFINITION | jq "{${NEW_DEF_JQ_FILTER}}")
NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json "$NEW_DEF" | jq -r .taskDefinition.taskDefinitionArn`

echo "New task definition registered, $NEW_TASKDEF"

aws ecs update-service --cluster $CLUSTER --service $SERVICE --task-definition "$NEW_TASKDEF" > /dev/null

echo "Service updated"

लिंक-रोट प्रदान करने के लिए, आपके उत्तर में लिंक से उपयोगी जानकारी प्रदान करने की सिफारिश की गई है। क्या आप ऐसा कर सकते हैं?
1277 बजे BE77Y

1
मेरे उत्तर को अपडेट करें
फॉरएवरयुंग

1

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

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

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


यह वास्तव में सच नहीं है - आप हमेशा इसे करने के लिए अपनी सेवा पर निर्भर होने के बजाय मैन्युअल रूप से एक कार्य को मार सकते हैं । जब सेवा यह पता लगा tag
लेती है

1

मेरे लिए काम करने का तरीका उपरोक्त के समान है। अपनी सेवा और कार्य बनाने और सब कुछ शुरू करने के बाद, ऑटो-स्केलिंग समूह को संपादित करें और यह सुनिश्चित करें कि न्यूनतम , अधिकतम और वांछित 1 पर सेट हो ।

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

जब वह सभी जगह हो, तो किसी भी समय आप एक अद्यतन कंटेनर छवि को तैनात करना चाहते हैं, जो क्लस्टर के टास्क क्षेत्र में जाएं और कार्य को रोक दें । आपको एक चेतावनी मिलेगी, लेकिन बशर्ते ऑटो-स्केलिंग सेट की गई हो, सेवा फिर से नवीनतम पुश के साथ शुरू हो जाएगी।

सेवा या कार्य के नए संस्करण बनाने की आवश्यकता नहीं है।

ध्यान दें कि सेवा / कार्य तुरंत या एक मिनट के भीतर कहीं से भी स्वयं को अपडेट करते हैं। यदि आप हताश प्रतीक्षा कर रहे हैं, तो आप बस नई टास्क को मैन्युअल रूप से चला सकते हैं। यह सेवा स्वयं की नहीं होगी, इसलिए यह आदर्श नहीं है, लेकिन यदि यह मर जाता है, तो यह अभी भी एक नया काम करेगा।


1

मुझे पता है कि यह एक पुराना धागा है, लेकिन इसका समाधान बहुत आसान है, क्योंकि यहां अधिकांश उत्तर इसे आसान बनाते हैं।

दो चरणों में रनिंग कंटेनर को कैसे अपडेट करें:

नीचे माना जाता है कि आपके पास एक कार्य चल रहा है जो एक कंटेनर को टैग किया हुआ है latest(या कोई अन्य स्थिर टैग जो एलीवेटर अपडेट को नहीं बदलता है) को संदर्भित कर रहा है ।

  1. अपना नया कंटेनर रिपॉजिटरी में अपलोड करें
  2. मैन्युअल रूप से अपने कार्यों को मार डालो

यदि लक्ष्य हमारे लिए एक नया निर्माण करना है, तो हमें वास्तव में इसके लिए अपनी सेवा पर भरोसा करने की आवश्यकता नहीं है (और मैं तर्क दूंगा, हमें इस पर भरोसा नहीं करना चाहिए )। यदि आप अपने कार्य को मारते हैं, तो सेवा यह मान लेगी कि उसके पास Desired Countचलने वाले कार्य नहीं हैं , और बस एक नया काम करना है। यह आपके कंटेनर को उसी टैग के आधार पर पुन: खींचेगा।

ECS सेवाएं HA सुरक्षा जाल हैं, कि आपकी CD / CI पाइपलाइन के लिए प्रतिस्थापन।


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


तीन चरणों में नए टैग कैसे तैनात करें:

  1. अपने नए container:tagको भंडार में अपलोड करें
  2. नया संदर्भित करने के लिए एक नया कार्य परिभाषा बनाएँ tag
  3. नई कार्य परिभाषा को संदर्भित करने के लिए अपनी सेवा को अपडेट करें
    • यहाँ सावधान! आप है minimum healthyकरने के लिए सेट 0%के रूप में कुछ अन्य उत्तर सुझाव है, तो आप एडब्ल्यूएस क्रम नया कार्य परिभाषा को तैनात करने में अपनी पूरी सेवा को मारने के लिए पूर्ण अधिकार दे रहे हैं। यदि आप एक रोलिंग / क्रमिक परिनियोजन पसंद करते हैं, तो अपना न्यूनतम कुछ सेट करें >0%
    • वैकल्पिक रूप से, अपने सेट minimum healthyकरने के लिए 100%और अपने maximum healthyकुछ करने के लिए >100%आपकी सेवा को तैनात करने की अनुमति देने के लिए नए पुराने लोगों (अपने उपयोगकर्ताओं के लिए प्रभाव को कम करने) की हत्या से पहले कार्य।

इस बिंदु से, आपकी सेवा स्वचालित रूप से यह पहचान लेगी कि आपने एक नया कार्य निर्दिष्ट किया है, और आपके द्वारा कॉन्फ़िगर किए गए minimum/ maximumस्वस्थ थ्रेसहोल्ड के आधार पर उसे बाहर तैनात करने पर काम करेंगे ।


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