コンテナーをKubernetesで実行し続けるにはどうすればよいですか?


124

現在、Kubernetesクラスターでシェル(/ bin / bash)を使用した単純なコンテナーを実行しようとしています。

pseudo-tty分離オプション(コマンドの-tdオプションdocker run)を使用して、Dockerコンテナーでコンテナーを実行し続ける方法があると思いました。

例えば、

$ sudo docker run -td ubuntu:latest

Kubernetesにこのようなオプションはありますか?

私はkubectl run-container次のようなコマンドを使用してコンテナを実行しようとしました:

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

しかし、コンテナーは数秒間終了します(docker run上記のオプションなしでコマンドを使用して起動するのと同じです)。そして、ReplicationControllerは繰り返し起動します。

コマンドの-tdオプションのように、Kubernetesでコンテナーを実行し続ける方法はありますdocker runか?


このイメージを使用して(とKubernetesのドキュメントが提案する)非常に便利です:kubectl run curl --image=radial/busyboxplus:curl -i --tty
マテウス・サンタナ

この質問はこのビデオで言及されています。KubernetesはDatadog非常に難しい方法です。「Cargo culting というスライドのタイトルが付いています。ウィキペディアから:カーゴカルトプログラマという用語は、未熟なまたは初心者のコンピュータプログラマ(または問題に未経験のプログラマ)に適用される場合があります手元にある)プログラムコードをある場所から別の場所にコピーし、それがどのように機能するか、または新しい位置で必要かどうかをほとんどまたはまったく理解していない
tgogos

回答:


49

コンテナは、メインプロセスが終了すると終了します。次のようなことをする:

docker run -itd debian

コンテナを開いたままにすることは、率直に言って、簡単なテストと例にのみ使用すべきハックです。数分間テストするためのコンテナーが必要な場合は、次のようにします。

docker run -d debian sleep 300

これには、忘れた場合にコンテナが自動的に終了するという利点があります。または、このようなものをwhileループに入れて永久に実行し続けるか、のようなアプリケーションを実行することもできますtop。これらはすべて、Kubernetesで簡単に実行できるはずです。

本当の質問は、なぜあなたはこれをしたいのですか?コンテナーはサービスを提供している必要があり、そのプロセスはコンテナーをバックグラウンドで実行し続けます。


お返事ありがとうございます。コンテナーの動作を理解しようとしています。同時に何十ものコンテナーが実行されています。無限ループと他の重いコマンドを使用すると、コンテナーの動作が何であるかを知ることができなくなります。それが/ bin / bashを実行するだけのような単純なコンテナが必要な理由です。
Springwell、2015

とりあえず、cat引数なしtopsleep、引数の多い引数で実行してみます。
Springwell、2015

30
sleep infinity多くの場合で動作します(busyboxではありません)
rwilson04 '09 / 09/21

1
これを行う理由はたくさんあります。たとえば、helmリリースとインジェクト構成を使用してポッドをデプロイすると、類似の環境の再作成が煩わしく煩雑になります。ただし、他のポッドがクラッシュしたり削除されたりした場合に、その構成のコンテナを使用すると、非常に便利です。
RichardLøvehjerte18年

私のサービスは複数のプロセスで構成されているためです。
КонстантинВан

134

コンテナは最後まで実行することを目的としています。終了しないタスクをコンテナに提供する必要があります。このようなものがうまくいくはずです:

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これはベストプラクティスだとは言えません。これは、すぐに終了せずに実行されるポッドを提供する例にすぎません。ベストプラクティスは、コンテナを作成して、それらが設計されたジョブ(完了するまで実行されるジョブ、永続的に実行されるWebサーバーなど)を実行することです。デフォルトのコマンドがすぐに終了するため、ポッドを作成し続けると最初は表示されずに消えてしまうと、Kubernetesは最初に苛立ちを感じるので、これを例として投稿しました。
Joel B

@JoelBありがとう。それを行う「正しい」方法は何だろうと思っていました。
aneesh joshi

1
私がそれを入れるのを可能にするしばらくの間生きることができるコンテナが必要なので、これに感謝します。私は明るい画像で同じことをしようとしていて、画像ubuntuを試しましbashたが、機能しませんでした。これと同じことをbash画像で行う方法はありますか?
cryanbhu

これは古い問題であることは知っています。ただし、Kubernetesは一時的なコンテナをサポートするようになりました。リンク:kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers。これらのコンテナーには、リソース制限などの制限がありますが、デバッグ用に設計されています。
Shubham Singh

111

あなたはあなたの中でこのCMDを使うことができますDockerfile

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

これにより、停止するように指示されるまで、コンテナーは存続します。トラップと待機を使用すると、コンテナーは停止要求にすぐに反応します。トラップ/待機がない場合、停止には数秒かかります。

Busyboxベースのイメージ(高山ベースのイメージで使用)の場合、sleepは無限大の引数について知りません。この回避策は、上記の例のようなものに対して同じ即時応答を提供しますdocker stop

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

私はデバッグ目的でkubernetesデプロイメントyamlで同じを使用しています
sdkks

これにより、「スリープ:無効な数値 '無限大'」が得られます
arunkjn

@arunkjnありがとうございます。多分、高山の画像のように、busyboxを使用する画像で行き詰まっているでしょう。更新された回答をご覧ください。
itsafire 2018

24
  1. Dockerfileで次のコマンドを使用します。

    CMD ["sh", "-c", "tail -f /dev/null"]
    
  2. Dockerイメージをビルドします。

  3. 利用可能なイメージを確認するために、クラスターまたは類似のものにプッシュします。
  4. kubectl run debug-container -it --image=<your-image>
    

コンテナをデバッグするための素晴らしいヒント。
kta

16

PODを実行し続けるためには、PODが特定のタスクを実行している必要があります。そうしないと、Kubernetesは不要なタスクを見つけて終了します。PODを実行し続けるには多くの方法があります。

何もせずに継続的に実行するだけのPODが必要なときにも、同様の問題に直面しました。以下はそれらが私のために働いた2つの方法です:

  1. コンテナーの実行中にスリープコマンドを実行します。
  2. コンテナ内で無限ループを実行します。

最初のオプションは2番目のオプションよりも簡単で、要件を十分に満たす可能性がありますが、これは最良のオプションではありません。同様に、sleepコマンドで割り当てる秒数には制限があります。ただし、内部で無限ループが実行されているコンテナは存在しません。

ただし、両方の方法について説明します(busyboxコンテナーを実行していることを考慮して)。

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

それが役に立てば幸い!


睡眠って何?Ubuntuの内部コマンドですか?またはドッカーコマンド?
ファラズ

@FarazこれはLinuxシェルコマンドで、dockerに固有ではありません。
Arbaaz

11

これをsleep infinityKubernetes のコマンドで動作させることができました。これにより、コンテナーは開いたままになります。それが機能しない場合の代替策については、この回答を参照してください。


これは質問に対する答えを提供しません。批評したり、著者に説明を要求するには、投稿の下にコメントを残してください。- 口コミより
ウィル

1
確かにそうでしょう。sleep infinityコンテナーを開いたままにし、質問が尋ねるのと同じタイプの機能を提供します(ほとんどのタイプのコンテナー)。また、特定のコマンドが機能しない場合の代替策へのリンクも提供します
rwilson04

これはレビューによるものです。そこにコメントテキストを回答に追加すると、質の高い回答になります:)私の最初のフラグ/コメントは、コメントが成功しなかったというコメントに基づいていたので、これはコメントであると思われました。クイック編集を追加し、賛成票を投じました。
ウィル

「... Kubernetesでのスリープインフィニティ」は、情報に基づいていない声明です。それは、画像にunixとdockerがないことを意味します。
mmla

10

k8sポッドマニフェストがコンテナーを永久に実行するための最も単純なコマンド:

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

5

Dockerfile内で次のコマンドを使用して、K8sクラスターでコンテナーを実行し続けます。

  • CMDテール-f / dev / null

3

私の場合、initContainerを持つポッドは初期化に失敗しました。実行するdocker ps -aと、表示されないdocker logs exited-container-id-hereログメッセージがkubectl logs podname表示されました。ミステリーは解決しました:-)


1

これを行うにはさまざまな方法がありますが、最もエレガントな方法の 1つは次のとおりです。

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

なぜそれが最もエレガントなソリューションだと思いますか?
mordowiciel

0

主題についての私の数セント。それkubectlが機能していると仮定すると、質問で述べたdockerコマンドと同等の最も近いコマンドは次のようになります。

$ 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
Noam Manos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.