web-dev-qa-db-ja.com

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

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

pseudo-ttyとdetachオプション(-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コマンドのdocker runオプションのように、Kubernetesでコンテナーを実行し続ける方法はありますか?

79
springwell

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

docker run -itd debian

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

docker run -d debian sleep 300

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

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

31
Adrian Mouat

コンテナは最後まで実行することを意図しています。決して終わらないタスクをコンテナに提供する必要があります。このような何かが動作するはずです:

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;" ]
82
Joel B

次のCMDをDockerfileで使用できます。

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

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

Busyboxベースの画像(Alpineベースの画像で使用)の場合、sleepは無限引数については知りません。この回避策は、上記の例のようにdocker stopに対する同じimmediate応答を提供します。

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
74
itsafire
  1. Dockerfileで次のコマンドを使用します。

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. Dockerイメージを構築します。

  3. 画像が利用可能であることを確認するために、クラスターまたは同様のものにプッシュします。
  4. kubectl run debug-container -it --image=<your-image>
16
Radu Gabriel

これをKubernetesのコマンドsleep infinityで動作させることができました。これにより、コンテナーが開いたままになります。うまくいかない場合の代替案については this answer をご覧ください。

7
rwilson04

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

助けてください!

7
Arbaaz

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

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

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

  • CMD tail -f/dev/null
3
Omar Khaled

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

2
Stefan L