zaki work log

作業ログやら生活ログやらなんやら

[oc / kubectl] run --commandを使って何もしないpodや一定時間後に任意のリターンコードで終了するpodをデプロイ

tail -f /dev/nullsleep,exitを使ってデバッグや動作確認用に。
run実行で作成されるworkloadsリソースについては以下も参照。

zaki-hmkc.hatenablog.com

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:latestdebian: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 89kubectlのコマンドの後の実行になってそのままログアウトしてしまうので注意。

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

tailsleepのかわりに、コンテナ内で実行可能なコマンドを叩いて終わる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なら入ってる)