はじめに
Kubernetesにおいて、ホストOSからkubectl execで半永続的に動作するコマンドを実行したが動作しない問題に直面した。その解決方法について記載する。
環境
- Ubuntu 24.04
- Kubernetes v1.30.2
問題、課題
Kubernetesにおいて、ホストOSからkubectl execで半永続的に動作するコマンドをバックプロセスで実行したが動作しない問題に直面した。その解決方法について記載する。 今回は例として半永続的に動作するyesコマンドを実行した場合を記載する。
# テスト用のPodを起動 $ kubectl run ubuntu-pod --image=ubuntu:24.04 -- /bin/bash -c "sleep infinity" $ kubectl get po NAME READY STATUS RESTARTS AGE ubuntu-pod 1/1 Running 0 12s # コマンド実行 $ kubectl exec -it ubuntu-pod -- /bin/bash -c "yes > /dev/null 2> /dev/null &" # 確認 $ kubectl exec -it ubuntu-pod -- /bin/bash -c "ps aux" USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2696 1408 ? Ss 10:15 0:00 sleep infinity root 4 0.0 0.0 0 0 ? Z 10:18 0:00 [bash] <defunct> root 5 0.0 0.1 7888 4224 pts/0 Rs+ 10:18 0:00 ps aux (実行したコマンドを確認できず)
解決
github.com 上記を参考に-itオプションを省略することで動作するようだ。
毎回、おまじないのように-itオプションを選択していた。
kubernetes.ioを確認すると、 ショートオプションの-iと-tは、ロングオプションの--stdinと--ttyと同様のようだ。
- -i, --stdin:標準入力(stdin)をコンテナに接続するためのオプションである。
- -t, --tty:擬似ターミナル(TTY)を割り当てるためのオプションである。このオプションを使用することで、コンテナ内でのシェルセッションがターミナルのように動作する。
確認
itのオプションを省略して実行する。
# コマンド実行 $ kubectl exec ubuntu-pod -- /bin/bash -c "yes > /dev/null 2> /dev/null &" # 確認 $ kubectl exec -it ubuntu-pod -- /bin/bash -c "ps aux" root 7 98.3 0.0 2696 1408 ? R 10:20 0:03 yes (実行したコマンドを確認できた)
オプションの説明を見るに、-iのオプションが不要だと理解した。そのため、-tオプションのみで動作を確認する。
# コマンド実行 $ kubectl exec -t ubuntu-pod -- /bin/bash -c "yes > /dev/null 2> /dev/null &" # 確認 $ kubectl exec -it ubuntu-pod -- /bin/bash -c "ps aux" root 7 99.8 0.0 2696 1408 ? R 10:20 6:42 yes root 10 99.3 0.0 2696 1280 ? R 10:26 0:02 yes (実行したコマンドを確認できた)