【Kubernetes】Deploymentのロールアウト関連操作まとめ

スポンサーリンク

はじめに

KubernetesのDeploymentのロールアウトに関する操作についてまとめました。

Deploymentのロールアウトに関する操作

Deploymentのロールアウト系の操作は、kubectl rolloutコマンドを利用します。

履歴

historyは、ロールアウトの履歴を表示してくれます。

kubectl rollout history [type] [name]

例:

kubectl rollout history deployment myapp

停止

pauseは、現在実行中のロールアウトを停止させます。

kubectl rollout pause [type] [name]

例:

kubectl rollout pause deployment myapp

再実行

restartは、直前に行ったロールアウトを再度実行します。

kubectl rollout restart [type] [name]

例:

kubectl rollout restart deployment myapp

pauseをしている場合は、restartで再開できないので注意してください。

再開

resumeは、pauseしている状態からロールアウトを再開できます。

kubectl rollout resume [type] [name]

例:

kubectl rollout resume deployment myapp

ステータス

statusは、ロールアウトの状況を確認できます。

kubectl rollout status [type] [name]

例:

kubectl rollout status deployment myapp

ロールバック

undoは、以前のロールアウトに戻すことができます。

kubectl rollout undo [type] [name]

例:

kubectl rollout undo deployment myapp --to-revision=2

--to-revisionで特定のリビジョンを指定することができます。

試してみる

実際にkubectl rolloutのコマンドを試していきたいと思います。

Deploymentをデプロイ

まずは基本となるDeploymentをデプロイします。

マニフェストは下記の通りです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: web-container
        image: nginx
        ports:
          - containerPort: 80

デプロイします。

kubectl apply -f deployment.yml

ステータスの確認

すぐにステータスの確認をします。

❯ kubectl rollout status deployment myapp
Waiting for deployment "myapp" rollout to finish: 0 of 3 updated replicas are available...
Waiting for deployment "myapp" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "myapp" rollout to finish: 2 of 3 updated replicas are available...
deployment "myapp" successfully rolled out

徐々にPodが立ち上がり、成功するとコマンドが終了します。

Deploymentの更新

イメージのバージョンを更新して、Deploymentをロールアウトさせます。

        image: nginx:1.22.0

マニフェストを反映させて、ロールアウトさせます。

kubectl apply -f deployment.yml

ロールアウトの停止

ロールアウト中に、pauseで停止させます。

❯ kubectl rollout pause deployment myapp
deployment.apps/myapp paused

PodとReplicaSetを確認すると、新しいPodとReplicaSetが作られた状態で止まっているのがわかります。

❯ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-599c74f9fd-ffjvb   1/1     Running   0          4m40s
myapp-599c74f9fd-ltvqv   1/1     Running   0          4m40s
myapp-599c74f9fd-n27sp   1/1     Running   0          4m40s
myapp-7fc86d84f7-zd87l   1/1     Running   0          76s    # 新しく作成されたPod

❯ kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
myapp-599c74f9fd   3         3         3       5m27s
myapp-7fc86d84f7   1         1         1       2m3s   # 新しく作成されたReplicaSet

ロールアウトの再開

resumeで停止したロールアウトを再開します。

❯ kubectl rollout resume deployment myapp
deployment.apps/myapp resumed

先ほど、作成途中だったPodとReplicaSetが作成されました。

❯ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-7fc86d84f7-d69ck   1/1     Running   0          11s
myapp-7fc86d84f7-r6sp8   1/1     Running   0          20s
myapp-7fc86d84f7-zd87l   1/1     Running   0          29m

❯ kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
myapp-599c74f9fd   0         0         0       33m
myapp-7fc86d84f7   3         3         3       30m

ロールアウトの履歴確認

ロールアウトの履歴を確認してみます。

❯ kubectl rollout history deployment myapp
deployment.apps/myapp
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

2つのリビジョンがあることがわかります。

ロールアウトの再実行

restartで、ロールアウトを再実行します。

❯ kubectl rollout restart deployment myapp
deployment.apps/myapp restarted

PodとReplicaSetが再作成されました。

❯ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-5d5b49b5ff-j4mkg   1/1     Running   0          31s
myapp-5d5b49b5ff-j5jh5   1/1     Running   0          44s
myapp-5d5b49b5ff-pv79m   1/1     Running   0          38s

❯ kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
myapp-599c74f9fd   0         0         0       43m
myapp-5d5b49b5ff   3         3         3       52s
myapp-7fc86d84f7   0         0         0       39m

イメージのバージョンを確認すると、最後に更新したバージョンと同じものとなっているので、同じ内容のPodとReplicaSetが再作成されていることがわかります。

❯ kubectl describe rs myapp-5d5b49b5ff | grep -i image
    Image:        nginx:1.22.0

ロールバック

リビジョンを指定して、ロールバックしてみます。

❯ kubectl rollout undo deployment myapp --to-revision=1
deployment.apps/myapp rolled back

ReplicaSetは新しいのは作られず、以前作成されたものが利用されているのがわかります。

❯ kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
myapp-599c74f9fd   3         3         3       48m
myapp-5d5b49b5ff   0         0         0       6m19s
myapp-7fc86d84f7   0         0         0       45m

参考

タイトルとURLをコピーしました