KubernetesにおいてホストOSからkubectl execで半永続的に動作するコマンドを実行

はじめに

Kubernetesにおいて、ホストOSからkubectl execで半永続的に動作するコマンドを実行したが動作しない問題に直面した。その解決方法について記載する。

環境

問題、課題

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
(実行したコマンドを確認できた)

参考

github.com

kubernetes.io