【Kubernetes】Deploymentのロールアウト関連操作まとめ
はじめに
KubernetesのDeploymentのロールアウトに関する操作についてまとめました。
Deploymentのロールアウトに関する操作
Deploymentのロールアウト系の操作は、kubectl rollout
コマンドを利用します。
履歴
history
は、ロールアウトの履歴を表示してくれます。
1kubectl rollout history [type] [name]
例:
1kubectl rollout history deployment myapp
停止
pause
は、現在実行中のロールアウトを停止させます。
1kubectl rollout pause [type] [name]
例:
1kubectl rollout pause deployment myapp
再実行
restart
は、直前に行ったロールアウトを再度実行します。
1kubectl rollout restart [type] [name]
例:
1kubectl rollout restart deployment myapp
pause
をしている場合は、restart
で再開できないので注意してください。
再開
resume
は、pause
している状態からロールアウトを再開できます。
1kubectl rollout resume [type] [name]
例:
1kubectl rollout resume deployment myapp
ステータス
status
は、ロールアウトの状況を確認できます。
1kubectl rollout status [type] [name]
例:
1kubectl rollout status deployment myapp
ロールバック
undo
は、以前のロールアウトに戻すことができます。
1kubectl rollout undo [type] [name]
例:
1kubectl rollout undo deployment myapp --to-revision=2
--to-revision
で特定のリビジョンを指定することができます。
試してみる
実際にkubectl rollout
のコマンドを試していきたいと思います。
Deploymentをデプロイ
まずは基本となるDeploymentをデプロイします。
マニフェストは下記の通りです。
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: myapp
5 labels:
6 app: myapp
7spec:
8 replicas: 3
9 selector:
10 matchLabels:
11 app: myapp
12 template:
13 metadata:
14 labels:
15 app: myapp
16 spec:
17 containers:
18 - name: web-container
19 image: nginx
20 ports:
21 - containerPort: 80
デプロイします。
1kubectl apply -f deployment.yml
ステータスの確認
すぐにステータスの確認をします。
1❯ kubectl rollout status deployment myapp
2Waiting for deployment "myapp" rollout to finish: 0 of 3 updated replicas are available...
3Waiting for deployment "myapp" rollout to finish: 1 of 3 updated replicas are available...
4Waiting for deployment "myapp" rollout to finish: 2 of 3 updated replicas are available...
5deployment "myapp" successfully rolled out
徐々にPodが立ち上がり、成功するとコマンドが終了します。
Deploymentの更新
イメージのバージョンを更新して、Deploymentをロールアウトさせます。
1 image: nginx:1.22.0
マニフェストを反映させて、ロールアウトさせます。
1kubectl apply -f deployment.yml
ロールアウトの停止
ロールアウト中に、pause
で停止させます。
1❯ kubectl rollout pause deployment myapp
2deployment.apps/myapp paused
PodとReplicaSetを確認すると、新しいPodとReplicaSetが作られた状態で止まっているのがわかります。
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3myapp-599c74f9fd-ffjvb 1/1 Running 0 4m40s
4myapp-599c74f9fd-ltvqv 1/1 Running 0 4m40s
5myapp-599c74f9fd-n27sp 1/1 Running 0 4m40s
6myapp-7fc86d84f7-zd87l 1/1 Running 0 76s # 新しく作成されたPod
7
8❯ kubectl get rs
9NAME DESIRED CURRENT READY AGE
10myapp-599c74f9fd 3 3 3 5m27s
11myapp-7fc86d84f7 1 1 1 2m3s # 新しく作成されたReplicaSet
ロールアウトの再開
resume
で停止したロールアウトを再開します。
1❯ kubectl rollout resume deployment myapp
2deployment.apps/myapp resumed
先ほど、作成途中だったPodとReplicaSetが作成されました。
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3myapp-7fc86d84f7-d69ck 1/1 Running 0 11s
4myapp-7fc86d84f7-r6sp8 1/1 Running 0 20s
5myapp-7fc86d84f7-zd87l 1/1 Running 0 29m
6
7❯ kubectl get rs
8NAME DESIRED CURRENT READY AGE
9myapp-599c74f9fd 0 0 0 33m
10myapp-7fc86d84f7 3 3 3 30m
ロールアウトの履歴確認
ロールアウトの履歴を確認してみます。
1❯ kubectl rollout history deployment myapp
2deployment.apps/myapp
3REVISION CHANGE-CAUSE
41 <none>
52 <none>
2つのリビジョンがあることがわかります。
ロールアウトの再実行
restart
で、ロールアウトを再実行します。
1❯ kubectl rollout restart deployment myapp
2deployment.apps/myapp restarted
PodとReplicaSetが再作成されました。
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3myapp-5d5b49b5ff-j4mkg 1/1 Running 0 31s
4myapp-5d5b49b5ff-j5jh5 1/1 Running 0 44s
5myapp-5d5b49b5ff-pv79m 1/1 Running 0 38s
6
7❯ kubectl get rs
8NAME DESIRED CURRENT READY AGE
9myapp-599c74f9fd 0 0 0 43m
10myapp-5d5b49b5ff 3 3 3 52s
11myapp-7fc86d84f7 0 0 0 39m
イメージのバージョンを確認すると、最後に更新したバージョンと同じものとなっているので、同じ内容のPodとReplicaSetが再作成されていることがわかります。
1❯ kubectl describe rs myapp-5d5b49b5ff | grep -i image
2 Image: nginx:1.22.0
ロールバック
リビジョンを指定して、ロールバックしてみます。
1❯ kubectl rollout undo deployment myapp --to-revision=1
2deployment.apps/myapp rolled back
ReplicaSetは新しいのは作られず、以前作成されたものが利用されているのがわかります。
1❯ kubectl get rs
2NAME DESIRED CURRENT READY AGE
3myapp-599c74f9fd 3 3 3 48m
4myapp-5d5b49b5ff 0 0 0 6m19s
5myapp-7fc86d84f7 0 0 0 45m