मैं कुबेरनेट्स पर कंटेनर कैसे रख सकता हूं?


124

अब मैं कुबेरनेट क्लस्टर पर शेल (/ बिन / बैश) के साथ एक साधारण कंटेनर चलाने की कोशिश कर रहा हूं।

मैंने सोचा था कि डॉकटर कंटेनर का उपयोग करके pseudo-ttyऔर डिटैच ऑप्शन ( कमांड -tdपर विकल्प docker run) को चालू रखने का एक तरीका था ।

उदाहरण के लिए,

$ sudo docker run -td ubuntu:latest

क्या कुबेरनेट्स में इस तरह का कोई विकल्प है?

मैंने एक kubectl run-containerकमांड का उपयोग करके कंटेनर चलाने की कोशिश की है जैसे:

kubectl run-container test_container ubuntu:latest --replicas=1

लेकिन कंटेनर कुछ सेकंड के लिए बाहर निकलता है (जैसे docker runकि ऊपर दिए गए विकल्पों के बिना कमांड के साथ लॉन्च करना )। और प्रतिकृतिकंट्रोलर ने इसे बार-बार लॉन्च किया।

क्या कमांड -tdमें विकल्पों की तरह कुबेरनेट्स पर कंटेनर रखने का एक तरीका है docker run?


इस छवि का उपयोग करना (जैसा कि कुबेरनेट्स डॉक्स सुझाव देते हैं) काफी उपयोगी है:kubectl run curl --image=radial/busyboxplus:curl -i --tty
मैथ्यूस सैंटाना

इस वीडियो में इस प्रश्न का उल्लेख किया गया है: "कार्गो कल्टिंग" से स्लाइड-शीर्षक के साथ डेटडॉग पर कुबेरनेट्स ने बहुत कठिन तरीके से । विकिपीडिया से: कार्गो कार्गो प्रोग्रामर शब्द तब लागू किया जा सकता है जब एक अकुशल या नौसिखिया कंप्यूटर प्रोग्रामर (या समस्या के साथ एक अनुभवहीन)। हाथ में) कुछ प्रोग्राम कोड को एक जगह से दूसरे स्थान पर कॉपी करता है, जिसमें यह काम करता है या यह आवश्यक नहीं है कि इसकी नई स्थिति की कोई समझ नहीं है।
tgogos

जवाबों:


49

एक कंटेनर निकलता है जब इसकी मुख्य प्रक्रिया बाहर निकलती है। कुछ ऐसा करना:

docker run -itd debian

कंटेनर को खुला रखने के लिए स्पष्ट रूप से एक हैक है जिसे केवल त्वरित परीक्षणों और उदाहरणों के लिए उपयोग किया जाना चाहिए। यदि आप कुछ मिनट के लिए परीक्षण के लिए कंटेनर चाहते हैं, तो मैं करूंगा:

docker run -d debian sleep 300

इसका यह फायदा है कि अगर आप इसके बारे में भूल जाते हैं तो कंटेनर अपने आप बाहर निकल जाएगा। वैकल्पिक रूप से, आप whileइसे हमेशा के लिए चालू रखने के लिए लूप में कुछ ऐसा डाल सकते हैं, या बस एक एप्लिकेशन चला सकते हैं जैसे कि top। इन सभी को कुबेरनेट्स में करना आसान होना चाहिए।

असली सवाल यह है कि आप ऐसा क्यों करना चाहेंगे? आपका कंटेनर एक सेवा प्रदान करने वाला होना चाहिए, जिसकी प्रक्रिया पृष्ठभूमि में कंटेनर को चालू रखेगी।


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

अभी के लिए, मैं चल रहा है की कोशिश करेंगे catतर्कों और बिना topऔर sleepबड़ी संख्या के तर्क के साथ।
स्प्रिंगवेल

30
sleep infinityबहुत से मामलों में काम करता है (बिजीबॉक्स नहीं)
rwilson04

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

क्योंकि मेरी सेवा में कई प्रक्रियाएँ हैं।
Константин Ван

135

कंटेनर को पूरा करने के लिए चलाने के लिए हैं। आपको अपना कंटेनर एक ऐसे कार्य के साथ प्रदान करना होगा जो कभी खत्म नहीं होगा। कुछ इस तरह काम करना चाहिए:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]

लेकिन क्या यह एक सर्वोत्तम अभ्यास है?
अनीश जोशी

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

@JoelB धन्यवाद। मैं सोच रहा था कि इसे करने का "सही" तरीका क्या है।
अनीश जोशी

1
इसके लिए धन्यवाद क्योंकि मुझे एक कंटेनर की ज़रूरत है जो मुझे इसे दर्ज करने की अनुमति देने के लिए थोड़ी देर के लिए रह सकता है। मैं लाइटर इमेज के साथ वैसा ही करने की कोशिश कर रहा था ubuntuऔर bashइमेज की कोशिश करता था लेकिन काम करने के लिए नहीं मिल रहा था। किसी भी विचार कैसे bashछवि के साथ ऐसा ही करने के लिए ?
क्रियांभु

1
@cryanbhu एक हल्की छवि के लिए, आप अल्पाइन का उपयोग कर सकते हैं, कंटेनर की युक्ति इस तरह दिख सकती है: {"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}(केवल json क्योंकि यम टिप्पणी में प्रारूपित नहीं होंगे।) इसके /bin/shबजाय महत्वपूर्ण बिट होना /bin/bash
bschlueter

111

आप इस CMD का उपयोग अपने में कर सकते हैं Dockerfile:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

यह आपके कंटेनर को तब तक जीवित रखेगा जब तक कि इसे बंद करने के लिए नहीं कहा जाता है। जाल और प्रतीक्षा का उपयोग करना आपके कंटेनर को रोक अनुरोध पर तुरंत प्रतिक्रिया देगा । बिना जाल / प्रतीक्षा के रुकने में कुछ सेकंड लगेंगे।

व्यस्त बॉक्स आधारित छवियों के लिए (अल्पाइन आधारित छवियों में प्रयुक्त) नींद अनंत तर्क के बारे में नहीं जानती है। यह वर्कअराउंड आपको उपरोक्त उदाहरण की तरह ही तत्काल प्रतिक्रिया देता है docker stop:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"

मैं डिबगिंग के उद्देश्यों के लिए कुबेरनेट्स तैनाती यमल पर समान उपयोग कर रहा हूं
sdkks

यह मुझे "नींद: अमान्य संख्या 'अनंत' देता है
अरुणजुन

@arunkjn इसके लिए धन्यवाद। आप शायद एक ऐसी छवि के साथ फंस गए हैं जो बिजीबॉक्स (जैसे अल्पाइन चित्र) का उपयोग करता है। अद्यतन उत्तर देखें।
इसका जुलफ

24
  1. अपने Dockerfile में इस कमांड का उपयोग करें:

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. अपनी डॉकटर छवि बनाएं।

  3. इसे अपने क्लस्टर या समान पर पुश करें, बस यह सुनिश्चित करने के लिए कि यह उपलब्ध छवि है।
  4. kubectl run debug-container -it --image=<your-image>
    

कंटेनर डिबगिंग के लिए शानदार सुझाव।
काटा

16

POD को चालू रखने के लिए POD को कुछ कार्य करने चाहिए, अन्यथा कुबेरनेट्स इसे अनावश्यक पाएंगे, इसलिए यह बाहर निकलता है। POD को चालू रखने के कई तरीके हैं।

मुझे ऐसी ही समस्याओं का सामना करना पड़ा है जब मुझे बिना कुछ किए लगातार चलने के लिए एक POD की आवश्यकता थी। निम्नलिखित दो तरीके मेरे लिए काम कर रहे हैं:

  1. कंटेनर को चलाते समय नींद की कमांड को फायर करना।
  2. कंटेनर के अंदर एक अनंत लूप चलाना।

हालांकि पहला विकल्प दूसरे से आसान है और आवश्यकता को पूरा कर सकता है, यह सबसे अच्छा विकल्प नहीं है। के रूप में, वहाँ एक सीमा के रूप में जहाँ तक आप नींद आदेश में असाइन करने के लिए जा रहे हैं की संख्या है। लेकिन अनंत लूप वाला एक कंटेनर जिसके अंदर चलता है वह कभी बाहर नहीं निकलता है।

हालाँकि, मैं दोनों तरीकों का वर्णन करूँगा (ध्यान में रखते हुए कि आप बिजीबॉक्स कंटेनर चला रहे हैं):

1. स्लीप कमांड

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "sleep 1000"]
  nodeSelector:
    beta.kubernetes.io/os: linux

2. अनंत लूप

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
  nodeSelector:
    beta.kubernetes.io/os: linux

पॉड चलाने के लिए निम्न कमांड चलाएँ:

kubectl apply -f <pod-yaml-file-name>.yaml

आशा करता हूँ की ये काम करेगा!


क्या मैं पूछ सकता हूं कि नींद क्या है? क्या यह उबंटू में आंतरिक कमांड है? या डॉकटर कमांड?
फराज

@ फ़राज़ यह एक लिनक्स शेल कमांड है, यह डॉक करने के लिए विशिष्ट नहीं है।
अरबाज

11

मैं इसे sleep infinityकुबेरनेट्स में कमांड के साथ काम करने में सक्षम था , जो कंटेनर को खुला रखेगा। विकल्प के लिए यह उत्तर देखें जब वह काम नहीं करता है।


यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें। - समीक्षा से
होगा

1
@Will यकीन है कि यह करता है। sleep infinityकंटेनर को खुला रखता है, उसी प्रकार की कार्यक्षमता प्रदान करता है जिसके बारे में सवाल पूछता है (अधिकांश प्रकार के कंटेनरों के लिए)। यह उन मामलों के लिए विकल्प का लिंक भी प्रदान करता है जब वह विशिष्ट कमांड काम नहीं करता है
rwilson04

यह समीक्षा से था। यदि आप टिप्पणी पाठ को उत्तर में जोड़ते हैं तो यह एक गुणवत्ता उत्तर है :) मेरा प्रारंभिक ध्वज / प्रशंसा यह कहने पर आधारित था कि आपकी टिप्पणी सफल नहीं थी, जिससे मुझे लगता है कि यह एक टिप्पणी थी। एक त्वरित संपादित और जोड़ा गया।
विल

"... कुबेरनेट्स में नींद की अनन्तता" एक असंगत कथन है। तात्पर्य यह है कि चित्र में कोई यूनिक्स और कोई डॉकटर नहीं है।
1

10

कंटेनर चलाने के लिए k8s पॉड मेनिफेस्ट के लिए यह सबसे सरल कमांड हो सकता है:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]

5

अपने K8s क्लस्टर में चल रहे कंटेनर को रखने के लिए Dockerfile के अंदर इस कमांड का उपयोग करें:

  • सीएमडी पूंछ-एफ / देव / नल

3

मेरे मामले में, एक initContainer के साथ एक फली शुरू में विफल रही। चल रहा है docker ps -aऔर फिर docker logs exited-container-id-hereमुझे एक लॉग संदेश दिया जो kubectl logs podnameप्रदर्शित नहीं हुआ। रहस्य सुलझ गया :-)


1

इसे पूरा करने के लिए कई अलग-अलग तरीके हैं, लेकिन सबसे सुरुचिपूर्ण में से एक है:

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh

आप इसे सबसे सुरुचिपूर्ण समाधान क्यों मानते हैं?
मोर्डोविसील

1

विषय पर मेरे कुछ सेंट। मान लें कि kubectlकाम कर रहा है तो निकटतम कमांड जो आपके प्रश्न में उल्लिखित docker कमांड के बराबर होगा, कुछ इस तरह होगा।

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

ऊपर कमांड नेमस्पेस Podमें एक सिंगल बनाएगी defaultऔर, यह sleepकमांड को निष्पादित करेगाinfinity तर्क-वितर्क के जिस तरह से आपके पास एक ऐसी प्रक्रिया होगी जो कंटेनर को जीवित रखते हुए अग्रभूमि में चलती है।

Afterwords, आप कमांड Podचलाकर बातचीत कर सकते हैं kubectl exec

$ kubectl exec ubuntu -it -- bash

यह तकनीक पोड संसाधन और तदर्थ डिबगिंग बनाने के लिए बहुत उपयोगी है।


1
बहुत अच्छा काम करता है। कोई जरूरत नहीं है --restart=Never, बस कॉल करेंkubectl run ubuntu --image=ubuntu -- sleep infinity
Noam Manos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.