আমি কীভাবে কুবেরনেটসে চালিত পাত্র রাখতে পারি?


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
ম্যাথিউস সান্টানা

এই প্রশ্নের এই ভিডিওটি পদে উল্লেখিত হয়েছে: Kubernetes Datadog খুব কঠিন পথ একটি স্লাইড-শিরোনাম সঙ্গে "জাহাজী culting উইকিপিডিয়া থেকে:। শব্দটি পণ্যসম্ভার অর্চনা প্রোগ্রামার প্রযোজ্য হতে পারে যখন একটি অদক্ষ বা ব্রতী কম্পিউটার প্রোগ্রামার (অথবা এক সমস্যা অনভিজ্ঞ হাতে) কিছু প্রোগ্রাম কোড একটি জায়গা থেকে অন্য জায়গায় অনুলিপি করে এটি কীভাবে কাজ করে বা তার নতুন অবস্থানে এটি প্রয়োজনীয় কিনা সে সম্পর্কে খুব কম বা না বোঝার সাথে
tgogos

উত্তর:


49

একটি ধারক যখন এর প্রধান প্রক্রিয়াটি প্রস্থান করে তখন বের হয়। এরকম কিছু করা:

docker run -itd debian

ধারকটি খোলা রাখা খোলামেলা একটি হ্যাক যা কেবল দ্রুত পরীক্ষা এবং উদাহরণ হিসাবে ব্যবহার করা উচিত। আপনি যদি কয়েক মিনিটের জন্য পরীক্ষার জন্য কেবল ধারক চান তবে আমি তা করতাম:

docker run -d debian sleep 300

যার সুবিধা রয়েছে যে আপনি যদি ভুলে যান তবে ধারকটি স্বয়ংক্রিয়ভাবে প্রস্থান করবে। বিকল্পভাবে, আপনি whileএটিকে চিরকালের জন্য চলতে রাখতে একটি লুপের মধ্যে এমন কিছু রাখতে পারেন বা কেবল অ্যাপ্লিকেশন যেমন চালাতে পারেন top। এই সমস্তগুলি কুবারনেটসে করা সহজ হওয়া উচিত।

আসল প্রশ্ন আপনি কেন এটি করতে চান? আপনার ধারকটি একটি পরিষেবা সরবরাহ করা উচিত, যার প্রক্রিয়াটি ধারকটিকে পটভূমিতে চলমান রাখবে।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আমি এখন একই সাথে কয়েক ডজন কনটেইনার চালিয়ে পাত্রে আচরণ করার চেষ্টা করছি। অন্তহীন লুপ এবং অন্যান্য ভারী কমান্ড ব্যবহার করে আমাকে ধারকগুলির আচরণ কী তা জানতে বাধা দিন। এই কারণেই আমার কেবল চলমান / বিন / ব্যাশের মতো সাধারণ ধারক প্রয়োজন।
স্প্রিংওয়েল

এখন জন্য, আমি চলমান চেষ্টা করব catআর্গুমেন্ট ছাড়া topএবং sleepসংখ্যক আর্গুমেন্ট সঙ্গে।
স্প্রিংওয়েল

30
sleep infinityপ্রচুর ক্ষেত্রে কাজ করে (
ব্যস্তবক্স

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;" ]

তবে এটি কি সেরা অনুশীলন?
aneesh joshi

3
@aneeshjoshi আমি এটি সর্বোত্তম অনুশীলন বলে না বলব । এটি এমন একটি পড সরবরাহের একটি উদাহরণ যা তাৎক্ষণিকভাবে বাইরে না বেরিয়ে চলে। সর্বোত্তম অনুশীলন হ'ল আপনার পাত্রে তারা যে কাজের জন্য ডিজাইন করা হয়েছিল তা করার জন্য তৈরি করা (একটি কাজ যা সমাপ্তির দিকে চলে যায়, একটি ওয়েবসার্ভার যা চিরকাল চলে, আমি এটি একটি উদাহরণ হিসাবে পোস্ট করেছি কারণ আপনি যখন শুঁটি তৈরি করতে থাকেন কেবলমাত্র ডিফল্ট কমান্ডটি তত্ক্ষণাত্ প্রস্থান হওয়ার পরে অদৃশ্য হয়ে যায় তখন কুবার্নিটগুলি প্রাথমিকভাবে হতাশাগ্রস্ত বোধ করতে পারে।
জোয়েল বি

@ জোয়েলবি ধন্যবাদ আমি ভাবছিলাম যে এটি করার "সঠিক" উপায়টি কী।
aneesh joshi

1
এটির জন্য ধন্যবাদ যেহেতু আমার এমন একটি ধারকের প্রয়োজন যা কিছুক্ষণের জন্য আমাকে প্রবেশ করতে দেয় live আমি চেয়ে হালকা ইমেজ দিয়ে একই করার চেষ্টা করছিলাম ubuntuএবং bashইমেজ চেষ্টা করেছি কিন্তু এটি কাজ করতে পারিনি get কোনও ধারণা কীভাবে bashইমেজ সহ এটি করা যায়?
ক্রিণভূ

1
@ ক্রিয়ানভু হালকা চিত্রের জন্য, আপনি আলপাইন ব্যবহার করতে পারেন, ধারক {"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}নকশাটি দেখতে পারে: (কেবল জসন কারণ ইয়ামল এখানে মন্তব্যগুলিতে ফর্ম্যাট করে না)) এর /bin/shপরিবর্তে গুরুত্বপূর্ণ বিটটি হচ্ছে /bin/bash
bschlueter

111

আপনি এই সিএমডি আপনার ব্যবহার করতে পারেন 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

এটি আমাকে "ঘুম দেয়: অবৈধ সংখ্যা 'অনন্ত'"
আরঙ্কজান

@ আরঙ্কজান এর জন্য ধন্যবাদ আপনি সম্ভবত এমন একটি চিত্রের সাথে আটকে আছেন যা ব্যস্তবক্স ব্যবহার করে (আলপাইন চিত্রগুলির মতো)। আপডেট উত্তর দেখুন।
itafire

24
  1. আপনার ডকফাইফাইলে এই আদেশটি ব্যবহার করুন:

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. আপনার ডকার ইমেজ তৈরি করুন।

  3. এটি আপনার ক্লাস্টারে বা অনুরূপে চাপ দিন কেবলমাত্র চিত্রটি এটি উপলব্ধ available
  4. kubectl run debug-container -it --image=<your-image>
    

ধারক ডিবাগ করার জন্য দুর্দান্ত টিপস।
কেটি

16

কোনও পিওড চালানোর জন্য পিওড চালিয়ে যাওয়ার জন্য কিছু নির্দিষ্ট কাজ করা উচিত, অন্যথায় কুবারনেটস এটি অপ্রয়োজনীয় বলে মনে করবে, তাই এটি প্রস্থান করে। পিওড চালিয়ে যাওয়ার অনেকগুলি উপায় রয়েছে।

আমি কিছু না করে অবিচ্ছিন্নভাবে চালানোর জন্য যখন কোনও পডের দরকার পড়ে তখন আমিও একই ধরণের সমস্যার মুখোমুখি হয়েছি। নিম্নলিখিত দুটি উপায় যা আমার পক্ষে কাজ করেছে:

  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
@ উইল অবশ্যই এটি করেন sleep infinityকনটেইনারটি উন্মুক্ত রাখে, একই ধরণের কার্যকারিতা সরবরাহ করে যা প্রশ্নটি জিজ্ঞাসা করে (বেশিরভাগ ধরণের পাত্রে জন্য)। এটি সুনির্দিষ্ট কমান্ডটি কাজ না করে এমন ক্ষেত্রে বিকল্পগুলির একটি লিঙ্কও সরবরাহ করে
rwilson04

এটি পর্যালোচনা থেকে ছিল। আপনি যদি মন্তব্যের পাঠ্য উত্তরের সাথে যুক্ত করেন তবে এটি একটি মানসম্পন্ন উত্তর :) আমার প্রাথমিক পতাকা / প্রশংসা আপনার মন্তব্যটি সফল হয়নি বলার উপর ভিত্তি করে তৈরি হয়েছিল, আমাকে ভাবিয়ে তোলে যে এটি একটি মন্তব্য হওয়ার কথা। একটি দ্রুত সম্পাদনা যোগ করা হয়েছে এবং upvmitted।
উইল

"... কুবারনেটসে ঘুমের অনন্ত" একটি অজানা বিবৃতি। এটি বোঝায় যে ছবিতে কোনও ইউনিক্স এবং কোনও ডকার নেই।
মিমলা

10

সবচেয়ে সহজ কমান্ড যেমনটি ক 8 এস পোড ম্যানিফেস্টের জন্য ধারকটি চিরকালের জন্য চালানো যেতে পারে:

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

5

আপনার কে 8 এস ক্লাস্টারে কনটেইনারটি চালিয়ে রাখতে আপনার ডকফাইফাইলের ভিতরে এই কমান্ডটি ব্যবহার করুন:

  • সিএমডি লেজ -f / দেব / নাল

3

আমার ক্ষেত্রে, একটি ইনকন্টেইনারযুক্ত একটি পড শুরু করতে ব্যর্থ হয়েছিল। দৌড়ানো 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

কেন আপনি এটিকে সবচেয়ে মার্জিত সমাধান হিসাবে বিবেচনা করেন?
mordowiciel

0

বিষয়টিতে আমার কয়েক সেন্ট। ধরে নিচ্ছি যে kubectlএটি কাজ করছে তখন নিকটতম কমান্ডটি যা আপনার প্রশ্নে উল্লেখ করা ডকার কমান্ডের সমান হবে, এটি এমন কিছু হবে।

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

কমান্ড উপরে একটি একক তৈরি করবে Podমধ্যে defaultনামস্থান এবং, এটা চালানো হবে sleepকমান্ড infinityযুক্তি -এই পথ আপনি একটি প্রক্রিয়া আছে করবে ফোরগ্রাউন্ড পালন কন্টেইনারে রান জীবিত।

ওয়ার্ডপ্রেস পরে, আপনি কমান্ড Podচালিয়ে যোগাযোগ করতে পারেন kubectl exec

$ kubectl exec ubuntu -it -- bash

পড রিসোর্স এবং অ্যাড-হক ডিবাগিং তৈরি করতে এই কৌশলটি খুব কার্যকর।


1
দুর্দান্ত কাজ করে। কোন প্রয়োজন নেই --restart=Never, কেবল কল করুনkubectl run ubuntu --image=ubuntu -- sleep infinity
নোয়াম মানস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.