Kubernetesベース:podを再起動する方法


Kubernetesではdocker restartのようなコンテナを再起動するようなpodを再起動するコマンドは提供されていませんが、一般的にrestartPolicyと組み合わせて自動再起動されます.この文章では、たまに手動で再起動する必要がある場合に使用する方法を整理します.
事前準備
環境準備
本明細書では、Kubernetes 1.17を使用して、以下を参照して、高速環境構築を行うことができます.
  • スタンドアロンバージョンまたはクラスタバージョン環境構築
  • pod準備
    次のpodのyamlファイルを使用します.
    [root@host131 config]# cat busybox-pod-test.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
        - name: busybox-container
          image: busybox:latest
          command: ["sleep", "15"]
      restartPolicy: Never
    [root@host131 config]# 
    

    実行コマンド:kubectl create-f busybox-pod-volume.yaml
    実行ログの例を次に示します.
    [root@host131 ~]# kubectl get pods
    No resources found in default namespace.
    [root@host131 ~]# kubectl create -f busybox-pod-test.yaml 
    pod/test-pod created
    [root@host131 ~]# 
    

    上記podは15秒後に終了するが、podのライフサイクルの状態説明に従ってcompletedの状態として表示され、状態例は以下の通りである.
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS      RESTARTS   AGE
    test-pod   0/1     Completed   0          57s
    [root@host131 ~]# 
    

    pod再起動:方式1:replaceコマンドで置き換える
    以前の起動時に使用したyamlファイルがあることを前提に、forceオプションとreplaceを使用して再起動できます.
    [root@host131 ~]# kubectl replace --force -f busybox-pod-test.yaml 
    pod "test-pod" deleted
    pod/test-pod replaced
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS              RESTARTS   AGE
    test-pod   0/1     ContainerCreating   0          3s
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          4s
    [root@host131 ~]#
    

    結果から,この方式が実際に置き換えられるプロセスは,削除してから再作成するプロセスであることがわかる.
    pod再起動:方式2:yamlファイルのないreplace方法
    実行コマンド:kubectl get pod名前-nネーミングスペース名-o yaml|kubectl replace--force-f-
    yamlファイルがない場合は-o yamlを使用して生成し、replaceを行い、サンプルログを次のように実行します.
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS      RESTARTS   AGE
    test-pod   0/1     Completed   0          5m15s
    [root@host131 ~]# kubectl get pod test-pod -n default -o yaml | kubectl replace --force -f -
    pod "test-pod" deleted
    pod/test-pod replaced
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          13s
    [root@host131 ~]#
    

    pod再起動:方式3:再作成
    上記replaceコマンドの手動実行に相当し、podに基づいてyamlファイルを生成して作成することができ、氏成が作成したyamlファイル
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS      RESTARTS   AGE
    test-pod   0/1     Completed   0          3m13s
    [root@host131 ~]# kubectl get pod test-pod -n default -o yaml >ttt.yml
    [root@host131 ~]#
    

    次にpodを削除します
    [root@host131 ~]# kubectl delete pod test-pod
    pod "test-pod" deleted
    [root@host131 ~]# kubectl get pods
    No resources found in default namespace.
    [root@host131 ~]#
    

    podを再作成します
    [root@host131 ~]# kubectl create -f ttt.yml 
    pod/test-pod created
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          6s
    [root@host131 ~]# 
    

    pod再起動:方式4:restartPolicyの設定
    Deploymentを使用しているか、restartPolicyの設定がNeverではないことを前提としています.例えばAlwaysです.例は以下の通りです.
    [root@host131 ~]# cat busybox-pod-test.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
        - name: busybox-container
          image: busybox:latest
          command: ["sleep", "15"]
      restartPolicy: Always
    [root@host131 ~]#
    

    実際に使ってみると、このrestartPolicyの作用でpodがcompletedになったときにすぐに再起動されることがわかります
    [root@host131 ~]# kubectl get pods
    No resources found in default namespace.
    [root@host131 ~]# kubectl create -f busybox-pod-test.yaml 
    pod/test-pod created
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          7s
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS      RESTARTS   AGE
    test-pod   0/1     Completed   0          25s
    [root@host131 ~]# kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   1          28s
    [root@host131 ~]#
    

    pod再起動:方式5:Podを直接削除する
    前提:Deploymentなどを使用する場合、podの上にまた1階を閉じることに相当するので、この場合podを直接削除すると、Deploymentがポリシーに従って管理制御し、一般的に直接削除すればよいし、replicaを調整して類似の効果を実現することもできる.