फली के भीतर कंटेनर को फिर से शुरू करें


112

मेरे पास test-1495806908-xn5jn2 कंटेनर के साथ एक फली है । मैं उनमें से किसी एक को पुनः आरंभ करना चाहता हूं container-test। क्या एक पॉड के भीतर एक कंटेनर को फिर से शुरू करना संभव है और कैसे? यदि नहीं, तो मैं फली को कैसे पुनः आरंभ करूं?

पॉड का उपयोग करके बनाया गया था deployment.yaml:

kubectl create -f deployment.yaml

जवाबों:


144

क्या किसी एक कंटेनर को फिर से शुरू करना संभव है

के माध्यम से नहीं kubectl, हालांकि आपके क्लस्टर के सेटअप के आधार पर आप "धोखा" कर सकते हैं और docker kill the-sha-goes-here, जो "विफल" कंटेनर को पुनरारंभ करने के लिए क्यूबलेट का कारण बनेगा (यह मानते हुए, पॉड के लिए पुनरारंभ नीति कहती है कि यह क्या करना चाहिए)

मैं फली को कैसे पुनः आरंभ करूँ

यह इस बात पर निर्भर करता है कि पॉड कैसे बनाया गया था, लेकिन आपके द्वारा प्रदत्त पॉड नाम के आधार पर, यह एक प्रतिकृति के निरीक्षण के तहत प्रतीत होता है, इसलिए आप बस kubectl delete pod test-1495806908-xn5jnऔर कुबेरनेट्स अपने स्थान पर एक नया निर्माण करेंगे (नया पॉड होगा) अलग नाम, इसलिए फिर कभी kubectl get podsलौटने की उम्मीद न test-1495806908-xn5jnकरें)


7
डिफ़ॉल्ट पुनरारंभ नीति हमेशा पुनरारंभ होती है
हेम

अगर मैं यह कर सकता हूं: docker kill the-sha-goes-hereतो docker container restart the-sha-goes-hereइसके बजाय क्यों नहीं ? kubeletइसे पुनः आरंभ करने के लिए क्यों भरोसा करें ? वैसे भी, असली समस्या यह है कि मैं dockerकंटेनर को मारने के लिए कमांड कहां चलाता हूं । पर could-shell, dockerk8s समूहों से कंटेनरों को नहीं दिखाता है!
नवाज

53

ऐसे मामले हैं जब आप फली को हटाने के बजाय एक विशिष्ट कंटेनर को पुनरारंभ करना चाहते हैं और कुबेरनेट्स इसे फिर से बनाने देते हैं।

kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5मेरे लिए काम करना ।

(मैं से आदेश बदल rebootकरने के लिए /sbin/killall5अनुशंसाएं नीचे के आधार पर।)


28
हर कंटेनर में नहीं है reboot; मुझे /sbin/killall5इसके बजाय निष्पादन के साथ अधिक भाग्य था ; जो सभी प्रक्रियाओं को मारता है, और कंटेनर बाहर निकल जाएगा।
इंगो करकट

1
और हर कंटेनर में रूट उपयोगकर्ता नहीं है;)
JuliSmz

4
-1, क्योंकि ... आप 'रिबूट' के साइड इफेक्ट का उपयोग कर रहे हैं और सभी प्रक्रियाओं को मार रहे हैं और कुबेरनेट्स इसकी वसूली कर रहे हैं। यह बहुत सारी धारणाएँ बना रहा है: जड़ के रूप में चल रहा है, कंटेनर में बाइनरी की उपलब्धता, एक पुनरारंभपॉलिश जो सक्षम है, आदि। इसके अलावा, यह प्रक्रिया की विफलता के बारे में लॉग को क्लैट करता है, जो आदर्श नहीं है।
gertvdijk

1
तो ऐसा लगता है कि अल्पाइन में किलॉल नहीं है, लेकिन / sbin / रिबूट शानदार काम करता है। kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootएक आकर्षण की तरह काम किया
Atifm

38

फली और कंटेनर दोनों अल्पकालिक हैं, विशिष्ट कंटेनर को रोकने के लिए निम्न आदेश का उपयोग करने का प्रयास करें और k8s क्लस्टर एक नया कंटेनर को पुनरारंभ करेगा।

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

यह SIGTERM1 को संसाधित करने के लिए एक संकेत भेजेगा , जो कि कंटेनर में चलने वाली मुख्य प्रक्रिया है। अन्य सभी प्रक्रियाएं प्रक्रिया 1 के बच्चे होंगे, और प्रक्रिया 1 से बाहर निकलने के बाद समाप्त हो जाएगी। अन्य संकेतों के लिए किल मैनपेज देखें जिन्हें आप भेज सकते हैं।


3
मैंने अन्य उत्तरों की कोशिश की और यह एक ही था जिसने मेरे लिए काम किया, यह मुझे लगता है कि यह सबसे सामान्य है।
बटाटो

मुझे कंटेनर का नाम कैसे मिला जो एक फली के अंदर चल रहा है ??
राथेड्रेण

जब मैंने यह कोशिश की तो मेरा अल्पाइन कंटेनर किसी प्रकार की अस्वस्थ स्थिति में चला गया। kubectl पॉ पॉ के लिए स्थिति कॉलम में त्रुटि दिखाता है ..
Atifm

17

कुबेरनेट होने का पूरा कारण यह है कि यह आपके लिए कंटेनरों का प्रबंधन करता है इसलिए आपको फली में कंटेनरों के जीवनकाल के बारे में इतना ध्यान रखने की आवश्यकता नहीं है।

चूंकि आपके पास एक deploymentसेटअप है जो उपयोग करता है replica set। आप फली का उपयोग करके हटा सकते हैं kubectl delete pod test-1495806908-xn5jnऔर कुबेरनेट बिना किसी डाउनटाइम के 2 कंटेनरों के साथ एक नई फली के निर्माण का प्रबंधन करेंगे। फली में एकल कंटेनरों को मैन्युअल रूप से पुनरारंभ करने की कोशिश करने से कुबेरनेट्स के पूरे लाभ को नकार दिया जाता है।


2
मुझे पदत्याग का अनुभव हुआ क्योंकि मेरी समाप्ति पॉड की प्रक्रिया 0/1
डीन क्रिश्चियन आर्मडा

6
आपको "बिना किसी डाउनटाइम" के सावधान रहने की आवश्यकता है। यह आपके सटीक कॉन्फ़िगरेशन पर निर्भर करता है। साथ ही जीरो-डाउनटाइम की अपनी चुनौतियां हैं।
निकोलस

जब मैं अपनी तैनाती में केवल 1 प्रतिकृति के साथ एक पॉड को हटाता हूं, तो मुझे हमेशा डाउनटाइम का अनुभव होता है।
नायन चैन व्यान

7

उपरोक्त सभी उत्तरों ने फली को हटाने का उल्लेख किया है ... लेकिन यदि आपके पास एक ही सेवा के कई पॉड हैं, तो उनमें से प्रत्येक को हटाना थकाऊ होगा ...

इसलिए, मैं निम्नलिखित समाधान का प्रस्ताव करता हूं, पुनः आरंभ करें :

  • 1) सेट स्केल टू जीरो:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    उपरोक्त कमांड आपके सभी पॉड्स को नाम के साथ समाप्त करेगा <<name>>

  • 2) फली को फिर से शुरू करने के लिए, प्रतिकृतियों को 0 से अधिक पर सेट करें

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    उपरोक्त कमांड आपके पॉड्स को फिर से 2 प्रतिकृतियों के साथ शुरू करेगा।


5
प्रश्न यह पूछ रहा था कि फली के भीतर एक एकल कंटेनर को कैसे पुनः आरंभ किया जाए।
क्रिस बीच

इसके अलावा, 0 फली तक स्केलिंग अत्यधिक उपलब्ध अनुप्रयोगों के लिए काम नहीं करेगी। kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"इसके बजाय उपयोग करें । यह तैनाती को अद्यतन करेगा और इसलिए रोलिंग अपडेट रणनीति के अनुसार इसके द्वारा प्रबंधित सभी पॉड्स के मनोरंजन को आरंभ करेगा।
कोस्ताराब

3

हम एकीकरण फली पर ताजा छवियों की फिर से तैनाती के लिए मजबूर करने के लिए एक बहुत सुविधाजनक कमांड लाइन का उपयोग करते हैं।
हमने देखा कि हमारे अल्पाइन कंटेनर पीआईडी ​​5 पर अपनी "निरंतर" कमांड चलाते हैं। इसलिए, यह एक SIGTERMसंकेत भेजकर कंटेनर को नीचे ले जाता है। जब यह कंटेनर वापस लाता है तो नवीनतम छवि को क्यूबलेट में फिर से imagePullPolicyसेट करने के लिए सेट किया जा रहा है Always

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
-15 और 5 क्या दर्शाता है?
जॉन बल्विन एरियस

2
@JohnBalvinArias इसे ऊपर के विवरण में टक किया गया है, लेकिन kill -15 5आप PID 5 के साथ प्रक्रिया को "-15" सिग्नल भेजने के लिए किल कमांड चला रहे हैं। यह है कि आप एक प्रक्रिया बताएं जिसे आप इसे समाप्त करना चाहते हैं (SIGTERM) ) और किसी भी खुले संसाधनों (अस्थायी फ़ाइलों, रोलबैक डीबी लेनदेन, करीबी कनेक्शन, जो भी हो) को साफ करने में समय लगता है। -9 (SIGKILL) के साथ विरोधाभास, इस प्रक्रिया को तुरंत मारता है, यह किसी भी खुले संसाधनों को साफ करने की अनुमति नहीं देता है।
कॉनरैड.डीन

2

मेरे लिए Dockerfile CMD/ ENTRYPOINTकार्यों में निर्दिष्ट प्रक्रिया को मारना । (कंटेनर स्वचालित रूप से पुनरारंभ होता है)

मेरे कंटेनर में रिबूटिंग की अनुमति नहीं थी, इसलिए मुझे इस वर्कअराउंड का उपयोग करना पड़ा।


2

corednsफली में एक समस्या थी , मैंने ऐसी फली को हटा दिया

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

इसकी फली अपने आप फिर से शुरू हो जाएगी।


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

कंटेनर को रूट के रूप में चलाया जाता है जिसे अनुशंसित नहीं किया जाता है।

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


1
यदि आप लिखते हैं kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., तो लोगों को कॉपी / पेस्ट करना बहुत आसान हो जाता है।
विलियम पर्ससेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.