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でコンテナーを実行し続ける方法はありますか?
コンテナは、メインプロセスが終了すると終了します。次のようなことをする:
docker run -itd debian
コンテナを開いたままにするのは、簡単なテストと例にのみ使用すべきハックです。数分間のテスト用のコンテナーが必要な場合は、次のようにします。
docker run -d debian sleep 300
これには、コンテナを忘れると自動的に終了するという利点があります。あるいは、このようなものをwhile
ループに入れて永久に実行し続けることも、単にtop
などのアプリケーションを実行することもできます。これらはすべて、Kubernetesで簡単に実行できるはずです。
本当の質問は、なぜあなたはこれをしたいのですか?コンテナはサービスを提供する必要があり、そのプロセスによりコンテナはバックグラウンドで実行され続けます。
コンテナは最後まで実行することを意図しています。決して終わらないタスクをコンテナに提供する必要があります。このような何かが動作するはずです:
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;" ]
次の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"
Dockerfileで次のコマンドを使用します。
CMD ["sh", "-c", "tail -f /dev/null"]
Dockerイメージを構築します。
kubectl run debug-container -it --image=<your-image>
これをKubernetesのコマンドsleep infinity
で動作させることができました。これにより、コンテナーが開いたままになります。うまくいかない場合の代替案については this answer をご覧ください。
PODを実行し続けるには、PODが特定のタスクを実行している必要があります。そうしないと、Kubernetesは不要であると判断するため、終了します。 PODを実行し続けるには多くの方法があります。
何もせずに継続的に実行するためだけにPODが必要になったときに、同様の問題に直面しました。以下は、それらが私のために働いた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
助けてください!
K8sポッドマニフェストがコンテナーを永久に実行するための最も単純なコマンド:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
Dockerfile内で次のコマンドを使用して、コンテナーをK8sクラスターで実行し続けます。
私の場合、initContainerを持つポッドは初期化に失敗しました。 docker ps -a
を実行してからdocker logs exited-container-id-here
を実行すると、kubectl logs podname
が表示しなかったログメッセージが表示されました。謎解き:-)