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

2022.05.26
2024.03.24
Kubernetes
Deploymentkubectl

はじめに

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee