はじめに
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 myapppauseをしている場合は、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 pausedPodと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 restartedPodと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 backReplicaSetは新しいのは作られず、以前作成されたものが利用されているのがわかります。
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



