kubernetesでポッドをロールアウトする!(ローリングアップデート無停止更新)
はじめに
今回はkubernetesでコンテナを更新するためのロールアウトを勉強する。
概要
■ロールアウトとは
■デプロイメントマニフェストを変更してロールアウトする
をまとめた!(^^)!
■ロールアウトとは
kubernetesのロールアウトはアプリケーションコンテナの更新を意味する。新しいコンテナに更新するのには、更新したいコンテナイメージをリポジトリに登録し、マニフェストに新しいイメージを設定して再適用することでロールアウトが開始される。
ロールアウトではクライアントからのアクセスを継続しながらバージョンアップを行うためにリクエストに対応できるポッドを残しつつ、残りポッドを更新していき最終的に全てのポッドで新しいポッドが利用できるようにする。
今回はデプロイメントマニフェストで作成したnginxコンテナを新しいバージョンのnginxコンテナにロールアウトする。
■デプロイメントマニフェストを変更してロールアウトする
nginx(1.16)コンテナを10個レプリカするデプロイメントマニフェストを
nginx(1.17)コンテナを10個レプリカするデプロイメントマニフェストに変更して、ロールアウト(ローリングアップデート)更新をする。
そのために変更後のマニフェストを作成する。
web-deploy1.yamlの内容からweb-deploy2.yamlの内容に変更する。
現在実行中のデプロイメント↓
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web-deploy
name: web-deploy
spec:
replicas: 10
selector:
matchLabels:
app: web-deploy
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web-deploy
spec:
containers:
- image: nginx:1.16
name: nginx
resources: {}
status: {}
から↓に変更する。
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web-deploy
name: web-deploy
spec:
replicas: 10
selector:
matchLabels:
app: web-deploy
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web-deploy
spec:
containers:
- image: nginx:1.17
name: nginx
resources: {}
status: {}
差分を比較する。
$ diff web-deploy1.yaml web-deploy2.yaml
21c21
< - image: nginx:1.16
---
> - image: nginx:1.17
コンテナのバージョンアップを指定している。
現在のデプロイメントの詳細を確認する。
$ kubectl get では1リソースにつき1行で内容が表示されるが、
$ kubectl describe ならリソースの詳細が表示される。
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Tue, 23 Feb 2021 12:16:52 +0000
Labels: app=web-deploy
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=web-deploy
Replicas: 10 desired | 10 updated | 10 total | 0 available | 10 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web-deploy
Containers:
nginx:
Image: nginx:1.16
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing True ReplicaSetUpdated
OldReplicaSets: <none>
NewReplicaSet: web-deploy-56865ddd5c (10/10 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 26s deployment-controller Scaled up replica set web-deploy-56865ddd5c to 10
アップデートの詳細についてここを確認する。↓
StrategyType: RollingUpdate
略
RollingUpdateStrategy: 25% max unavailable, 25% max surge
マニフェストで「Strategy(更新計画)」を設定しないとデフォルトで更新タイプが「RollingUpdate」、
「RollingUpdate」の更新計画が「25% max unavailable, 25% max surge」になるようだ。
「25% max unavailable」は設定したレプリカ数の最大25%を停止することを許容、
「25% max surge」は設定したレプリカ数の最大25%が稼働することを許容する。
ここではレプリカ数を10と設定しているので、
「25% max unavailable」は10-10×0.25=7.5(四捨五入で8つポッドの停止を許容)
「25% max surge」は10×0.25=2.5(四捨五入で3つのポッドをレプリカ数の10に加え稼働を許容)するという意味になる。
更新するためのマニフェストを起動する
変更したマニフェストを適用する。
$ kubectl apply -f web-deploy2.yaml
deployment.apps/web-deploy configured
ポッドの稼働状態を確認する
|STATUS|意味|
|---|---|---|
|Pending|PodがKubernetesクラスターによって承認されたが、コンテナがセットアップされて稼働する準備ができていない。|
|Running|PodがNodeにバインドされ、すべてのコンテナが作成された。|
|Terminating|コンテナ終了中。|
$ kubectl get po
NAME READY STATUS RESTARTS AGE
web-deploy-56865ddd5c-9559n 1/1 Running 0 34m
web-deploy-56865ddd5c-gbrmw 1/1 Running 0 34m
web-deploy-56865ddd5c-gm56q 1/1 Running 0 93s
web-deploy-56865ddd5c-jxnqt 1/1 Running 0 34m
web-deploy-56865ddd5c-ljj8m 1/1 Running 0 34m
web-deploy-56865ddd5c-p4ct5 1/1 Running 0 92s
web-deploy-56865ddd5c-phtd9 1/1 Running 0 34m
web-deploy-56865ddd5c-r4mnk 1/1 Running 0 34m
web-deploy-56865ddd5c-s6h8h 1/1 Running 0 34m
web-deploy-56865ddd5c-wbvfq 1/1 Running 0 34m
$ kubectl get po
NAME READY STATUS RESTARTS AGE
web-deploy-56865ddd5c-9559n 1/1 Running 0 35m
web-deploy-56865ddd5c-gbrmw 1/1 Running 0 35m
web-deploy-56865ddd5c-gm56q 0/1 Terminating 0 2m34s
web-deploy-56865ddd5c-jxnqt 1/1 Running 0 35m
web-deploy-56865ddd5c-ljj8m 1/1 Running 0 35m
web-deploy-56865ddd5c-p4ct5 0/1 Terminating 0 2m33s
web-deploy-56865ddd5c-phtd9 1/1 Running 0 35m
web-deploy-56865ddd5c-r4mnk 1/1 Running 0 35m
web-deploy-56865ddd5c-s6h8h 1/1 Running 0 35m
web-deploy-56865ddd5c-wbvfq 1/1 Running 0 35m
web-deploy-859565657d-9cjsx 0/1 Pending 0 7s
web-deploy-859565657d-dwbr4 0/1 Pending 0 7s
web-deploy-859565657d-f7448 0/1 Pending 0 7s
web-deploy-859565657d-mr9lz 0/1 Pending 0 7s
web-deploy-859565657d-zvv5d 0/1 Pending 0 7s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
web-deploy-56865ddd5c-9559n 1/1 Running 0 35m
web-deploy-56865ddd5c-gbrmw 1/1 Running 0 35m
web-deploy-56865ddd5c-jxnqt 1/1 Running 0 35m
web-deploy-56865ddd5c-ljj8m 1/1 Running 0 35m
web-deploy-56865ddd5c-phtd9 1/1 Running 0 35m
web-deploy-56865ddd5c-r4mnk 1/1 Running 0 35m
web-deploy-56865ddd5c-s6h8h 1/1 Running 0 35m
web-deploy-56865ddd5c-wbvfq 1/1 Running 0 35m
web-deploy-859565657d-9cjsx 0/1 Pending 0 12s
web-deploy-859565657d-dwbr4 0/1 Pending 0 12s
web-deploy-859565657d-f7448 0/1 Pending 0 12s
web-deploy-859565657d-mr9lz 0/1 Pending 0 12s
web-deploy-859565657d-zvv5d 0/1 Pending 0 12s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
web-deploy-56865ddd5c-9559n 1/1 Running 0 37m
web-deploy-56865ddd5c-gbrmw 1/1 Running 0 37m
web-deploy-56865ddd5c-jxnqt 1/1 Running 0 37m
web-deploy-56865ddd5c-ljj8m 1/1 Running 0 37m
web-deploy-56865ddd5c-phtd9 1/1 Running 0 37m
web-deploy-56865ddd5c-r4mnk 1/1 Running 0 37m
web-deploy-56865ddd5c-s6h8h 1/1 Running 0 37m
web-deploy-56865ddd5c-wbvfq 1/1 Running 0 37m
web-deploy-859565657d-9cjsx 1/1 Running 0 2m15s
web-deploy-859565657d-dwbr4 1/1 Running 0 2m15s
web-deploy-859565657d-f7448 1/1 Running 0 2m15s
web-deploy-859565657d-mr9lz 1/1 Running 0 2m15s
web-deploy-859565657d-zvv5d 1/1 Running 0 2m15s
Running コンテナを8つ維持しながら更新をしているのがわかる。
デプロイメントの詳細を表示する
コンテナ更新中↓
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Tue, 23 Feb 2021 12:16:52 +0000
Labels: app=web-deploy
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=web-deploy
Replicas: 10 desired | 5 updated | 13 total | 8 available | 5 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web-deploy
Containers:
nginx:
Image: nginx:1.17
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: web-deploy-56865ddd5c (8/8 replicas created)
NewReplicaSet: web-deploy-859565657d (5/5 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 39m deployment-controller Scaled up replica set web-deploy-56865ddd5c to 10
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set web-deploy-859565657d to 3
Normal ScalingReplicaSet 10m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 8
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set web-deploy-859565657d to 5
Normal ScalingReplicaSet 6m26s deployment-controller Scaled down replica set web-deploy-859565657d to 0
Normal ScalingReplicaSet 6m26s deployment-controller Scaled up replica set web-deploy-56865ddd5c to 10
Normal ScalingReplicaSet 3m58s deployment-controller Scaled up replica set web-deploy-859565657d to 3
Normal ScalingReplicaSet 3m58s deployment-controller Scaled down replica set web-deploy-56865ddd5c to 8
Normal ScalingReplicaSet 3m58s deployment-controller Scaled up replica set web-deploy-859565657d to 5
コンテナ更新後↓
$ kubectl describe deployment web-deploy
Name: web-deploy
Namespace: default
CreationTimestamp: Tue, 23 Feb 2021 12:16:52 +0000
Labels: app=web-deploy
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=web-deploy
Replicas: 10 desired | 10 updated | 10 total | 10 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=web-deploy
Containers:
nginx:
Image: nginx:1.17
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: web-deploy-859565657d (10/10 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 40m deployment-controller Scaled up replica set web-deploy-859565657d to 3
Normal ScalingReplicaSet 40m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 8
Normal ScalingReplicaSet 40m deployment-controller Scaled up replica set web-deploy-859565657d to 5
Normal ScalingReplicaSet 36m deployment-controller Scaled down replica set web-deploy-859565657d to 0
Normal ScalingReplicaSet 36m deployment-controller Scaled up replica set web-deploy-56865ddd5c to 10
Normal ScalingReplicaSet 33m deployment-controller Scaled up replica set web-deploy-859565657d to 3
Normal ScalingReplicaSet 33m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 8
Normal ScalingReplicaSet 33m deployment-controller Scaled up replica set web-deploy-859565657d to 5
Normal ScalingReplicaSet 29m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 3
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 2
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set web-deploy-56865ddd5c to 0
時間はすこしかかったが稼働コンテナを8つ維持しながらnginx:1.17にすべて更新することができた。
デプロイメント詳細の変化
OldReplicaSets: <none>
NewReplicaSet: web-deploy-56865ddd5c (10/10 replicas created)
↓
OldReplicaSets: web-deploy-56865ddd5c (8/8 replicas created)
NewReplicaSet: web-deploy-859565657d (5/5 replicas created)
↓
NewReplicaSet: web-deploy-859565657d (10/10 replicas created)
まとめ
コンテナのローリングアップデートとアップデートの確認ができた。
Discussion