はじめに
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