tail -f /dev/nullやsleep,exitを使ってデバッグや動作確認用に。
run実行で作成されるworkloadsリソースについては以下も参照。
- usage
- runningするだけで何もしないpod
- 60秒後に実行完了するpod
- 60秒後にエラーで完了するpod
- 任意のLinuxコマンドを実行して終了するpod
- プライベートレジストリにあるイメージの場合
usage
# Start the nginx container using the default command, but use custom arguments (arg1 .. argN) for that command. kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN> # Start the nginx container using a different command and custom arguments. kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>
kubectl run --helpより。
runningするだけで何もしないpod
「何もしない」というと語弊があるけど、とりあえずrunning状態のpodを作る。
pod内から別podへの疎通を確認したり、runningなpodがある状態でクラスタやネームスペースの状態などを確認したり、デプロイ時のノードへのスケジューリングを確認したり。
[zaki@minikube ~]$ kubectl run running-pod --image=alpine:latest --command -- tail -f /dev/null kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/running-pod created [zaki@minikube ~]$ kubectl get pod -l run=running-pod NAME READY STATUS RESTARTS AGE running-pod-6d5c4b4975-v9h88 1/1 Running 0 11s
このpodはtail -f /dev/nullしてるだけなので、基本的にそれ以外何もせずにrunning状態を維持する。
[zaki@minikube ~]$ kubectl exec -it running-pod-6d5c4b4975-v9h88 ps aux
PID USER TIME COMMAND
1 root 0:00 tail -f /dev/null
8 root 0:00 ps aux
もちろんalpine:latestでなくcentos:latestやdebian:latestでも良いし、OpenShiftならrhel7なども。適当なコンテナイメージを使えばOK。
OKD 4.4の場合
[zaki@okd4-manager ~]$ oc run running-pod --image=alpine:latest --command -- tail -f /dev/null
kubectl run --generator=deploymentconfig/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deploymentconfig.apps.openshift.io/running-pod created
[zaki@okd4-manager ~]$ oc get pod
NAME READY STATUS RESTARTS AGE
running-pod-1-deploy 0/1 Completed 0 22s
running-pod-1-sgmbv 1/1 Running 0 14s
[zaki@okd4-manager ~]$ oc exec -it running-pod-1-sgmbv ps aux
PID USER TIME COMMAND
1 10005800 0:00 tail -f /dev/null
11 10005800 0:00 ps aux
停止するにはDeploymentかDeploymentConfigを削除する。
(--restart=Neverで実行した場合は、podを削除する)
60秒後に実行完了するpod
tail -f /dev/nullのかわりに、sleep 60すればよい。
[zaki@minikube ~]$ kubectl run sleep-exit-pod --image=alpine:latest --command -- sleep 60 kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/sleep-exit-pod created [zaki@minikube ~]$ kubectl get pod -l run=sleep-exit-pod NAME READY STATUS RESTARTS AGE sleep-exit-pod-5dd66749d5-j2bdq 1/1 Running 0 7s
60秒後
[zaki@minikube ~]$ kubectl get pod -l run=sleep-exit-pod -w NAME READY STATUS RESTARTS AGE sleep-exit-pod-5dd66749d5-j2bdq 1/1 Running 0 34s sleep-exit-pod-5dd66749d5-j2bdq 0/1 Completed 0 64s sleep-exit-pod-5dd66749d5-j2bdq 1/1 Running 1 68s
この通り、(Deployment/ReplicaSetリソースがあるため)podが停止するとセルフヒーリングされるため、restartされ続ける。
sleep 60の後そのまま終了したい場合は--restart=Neverを指定し、Deploymentリソースを作成せずにpod単発で動作させる。(k8s 1.17まで)
[zaki@minikube ~]$ kubectl run sleep-exit-pod --image=alpine:latest --restart=Never --command -- sleep 60 pod/sleep-exit-pod created
[zaki@minikube ~]$ kubectl get pod -l run=sleep-exit-pod -w NAME READY STATUS RESTARTS AGE sleep-exit-pod 1/1 Running 0 5s sleep-exit-pod 0/1 Completed 0 64s
Completedで完了し、そのままrestartしなくなる。
OKD 4.4の場合も同様。
[zaki@okd4-manager ~]$ oc run sleep-exit-pod --image=alpine:latest --command -- sleep 60 kubectl run --generator=deploymentconfig/v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deploymentconfig.apps.openshift.io/sleep-exit-pod created [zaki@okd4-manager ~]$ [zaki@okd4-manager ~]$ oc get pod -l run=sleep-exit-pod -w NAME READY STATUS RESTARTS AGE sleep-exit-pod-1-4wqbg 0/1 ContainerCreating 0 11s sleep-exit-pod-1-4wqbg 1/1 Running 0 11s
60sec後
[zaki@okd4-manager ~]$ oc get pod -l run=sleep-exit-pod NAME READY STATUS RESTARTS AGE sleep-exit-pod-1-4wqbg 0/1 Completed 0 75s
このままだとセルフヒーリングする。(RESTARTSが1になっている)
[zaki@okd4-manager ~]$ oc get pod -l run=sleep-exit-pod -w NAME READY STATUS RESTARTS AGE sleep-exit-pod-1-skj6g 0/1 Completed 0 73s sleep-exit-pod-1-skj6g 1/1 Running 1 77s
--restart=Neverを付ければpod単発で動作する。
[zaki@okd4-manager ~]$ oc run sleep-exit-pod --image=alpine:latest --restart=Never --command -- sleep 60 pod/sleep-exit-pod created [zaki@okd4-manager ~]$ oc get pod -l run=sleep-exit-pod NAME READY STATUS RESTARTS AGE sleep-exit-pod 0/1 ContainerCreating 0 7s
60sec後
[zaki@okd4-manager ~]$ oc get pod -l run=sleep-exit-pod NAME READY STATUS RESTARTS AGE sleep-exit-pod 0/1 Completed 0 77s
60秒後にエラーで完了するpod
エラーと言っても、リターンコードを0以外で終わらせればよい。
要はexit 89とか。
[zaki@minikube ~]$ kubectl run error-exit-pod --image=alpine:latest --restart=Never --command -- sh -c "sleep 60; exit 89" pod/error-exit-pod created [zaki@minikube ~]$ [zaki@minikube ~]$ kubectl get pod -l run=error-exit-pod -w NAME READY STATUS RESTARTS AGE error-exit-pod 1/1 Running 0 10s error-exit-pod 0/1 Error 0 64s
Errorで終了した。
podの状態はkubectl get pod error-exit-pod -o yamlで.status.containerStatuses[].state辺りで確認する。
sh -c "..."を使わずに、そのままsleep 60; exit 89にしてしまうと、コンテナで実行されるのはsleep 60だけで、; exit 89はkubectlのコマンドの後の実行になってそのままログアウトしてしまうので注意。
OKD 4.4
[zaki@okd4-manager ~]$ oc run error-exit-pod --image=alpine:latest --restart=Never --command -- sh -c "sleep 60; exit 89" pod/error-exit-pod created
[zaki@okd4-manager ~]$ oc get pod -l run=error-exit-pod NAME READY STATUS RESTARTS AGE error-exit-pod 0/1 Error 0 80s
任意のLinuxコマンドを実行して終了するpod
tailやsleepのかわりに、コンテナ内で実行可能なコマンドを叩いて終わるpod
[zaki@minikube ~]$ kubectl run exec-command-pod --image=alpine:latest --restart=Never --command -- ps auxww pod/exec-command-pod created [zaki@minikube ~]$ kubectl get pod -l run=exec-command-pod -w NAME READY STATUS RESTARTS AGE exec-command-pod 0/1 ContainerCreating 0 2s exec-command-pod 0/1 Completed 0 4s
コマンドの実行時間によっては当然一瞬で終了する。
実行結果はstdoutへ出した分はkubectl logsで確認できる。
[zaki@minikube ~]$ kubectl logs exec-command-pod
PID USER TIME COMMAND
1 root 0:00 ps auxww
ファイル入出力が必要なものであれば、NFSみたいな共有ストレージやFTPでファイル転送したり、なんか工夫してちょ。
例のpsだとパッとしないけど、例えばyes > /dev/nullを実行すれば簡単にCPU負荷をかけたりもできる。
プライベートレジストリにあるイメージの場合
--image=に指定するイメージをFQDNで指定すればOK
$ kubectl run priv-image-pod --image=gitlab-ce.example.org:25000/zaki/example/httpd:latest --restart=Never --command -- tail -f /dev/null pod/priv-image-pod created [zaki@minikube ~]$ kubectl get pod -l run=priv-image-pod NAME READY STATUS RESTARTS AGE priv-image-pod 1/1 Running 0 13s
ところで--commandって有ってもなくても動作変わらないような気がするんだけど、どこに影響してるんだろ。
ちなみにdebianイメージだと、psコマンド入ってないのね。(ubuntuなら入ってる)