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
なら入ってる)