Kubernetes で Deployment を使うと Pod を安全にデプロイ(ロールアウト)できる.そのときに更新する Pod の割合として Max Unavailable と Max Surge という設定値があり,デフォルト値は以下のようにドキュメントに書いてある.今回は動作確認をしながら図解もしていく.
- Max Unavailable(停止状態になる最大 Pod 数)
.spec.strategy.rollingUpdate.maxUnavailable
- デフォルト値 :
25%
(小数点切り捨て) - 値には 絶対値 or % を設定できる
- Max Surge(宣言した Pod 数を超えて作れる Pod 数)
.spec.strategy.rollingUpdate.maxSurge
- デフォルト値 :
25%
(小数点切り上げ) - 値には 絶対値 or % を設定できる
デフォルト値を確認する
以下の Deployment (replicas: 10
) を適用する. Max Unavailable と Max Surge のデフォルト値である 25%
を考慮すると 7.5 ~ 12.5
となるため,デプロイ時には「最低 8
Running Pod」と「最高 13
Pod」になると期待できる.さっそく以下の Deployment で images
を nginx:1.19-alpine
から nginx:1.20-alpine
に更新してデプロイをする.
apiVersion: apps/v1 kind: Deployment metadata: name: sandbox-rolling-update labels: app: sandbox-rolling-update spec: replicas: 10 selector: matchLabels: app: sandbox-rolling-update template: metadata: labels: app: sandbox-rolling-update spec: containers: - name: nginx image: nginx:1.19-alpine ports: - containerPort: 80
更新中の Pod の状態を確認すると以下のようになる.「10
Running Pod」から「8
Running Pod と 5
ContainerCreating Pod」になった.期待通りの挙動となる.
$ kubectl get pods -l app=sandbox-rolling-update --sort-by=.status.phase NAME READY STATUS RESTARTS AGE sandbox-rolling-update-59c54649f5-4p2ds 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-6gfps 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-97cvh 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-b4sl2 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-crnnc 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-h5l8q 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-jkcjk 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-jnwwr 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-t746f 1/1 Running 0 20s sandbox-rolling-update-59c54649f5-vdpkq 1/1 Running 0 20s $ kubectl get pods -l app=sandbox-rolling-update --sort-by=.status.phase NAME READY STATUS RESTARTS AGE sandbox-rolling-update-5d4d5d6884-wkrb8 0/1 ContainerCreating 0 0s sandbox-rolling-update-5d4d5d6884-sg8zc 0/1 ContainerCreating 0 0s sandbox-rolling-update-5d4d5d6884-fkmdm 0/1 ContainerCreating 0 0s sandbox-rolling-update-5d4d5d6884-bv9s6 0/1 ContainerCreating 0 0s sandbox-rolling-update-5d4d5d6884-bdbsx 0/1 ContainerCreating 0 0s sandbox-rolling-update-59c54649f5-t746f 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-jnwwr 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-vdpkq 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-h5l8q 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-crnnc 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-b4sl2 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-97cvh 1/1 Running 0 60s sandbox-rolling-update-59c54649f5-6gfps 1/1 Running 0 60s
流れを簡単に図解してみた🎨
maxUnavailable
と maxSurge
を指定する
次に .spec.strategy.rollingUpdate.maxUnavailable: 0%
と .spec.strategy.rollingUpdate.maxSurge: 100%
を追加する.そして nginx:1.20-alpine
を nginx:1.21-alpine
に更新してデプロイをする.ようするに「最低 10
Running Pod」を維持しつつ「最高 20
Pod」まで許容する.リソースは2倍必要になるけどパフォーマンスを落とすことなくデプロイできる.
apiVersion: apps/v1 kind: Deployment metadata: name: sandbox-rolling-update labels: app: sandbox-rolling-update spec: replicas: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0% maxSurge: 100% selector: matchLabels: app: sandbox-rolling-update template: metadata: labels: app: sandbox-rolling-update spec: containers: - name: nginx image: nginx:1.21-alpine ports: - containerPort: 80 terminationGracePeriodSeconds: 0
更新中の Pod の状態を確認すると以下のようになる.「10
Running Pod」から「10
Running Pod と 10
ContainerCreating Pod」になった.期待通りの挙動となる.
$ kubectl get pods -l app=sandbox-rolling-update --sort-by=.status.phase NAME READY STATUS RESTARTS AGE sandbox-rolling-update-5d4d5d6884-56q4g 1/1 Running 0 8m31s sandbox-rolling-update-5d4d5d6884-8d5gk 1/1 Running 0 8m30s sandbox-rolling-update-5d4d5d6884-8sf46 1/1 Running 0 8m31s sandbox-rolling-update-5d4d5d6884-bdbsx 1/1 Running 0 8m33s sandbox-rolling-update-5d4d5d6884-bv9s6 1/1 Running 0 8m33s sandbox-rolling-update-5d4d5d6884-fkmdm 1/1 Running 0 8m33s sandbox-rolling-update-5d4d5d6884-hlzfp 1/1 Running 0 8m31s sandbox-rolling-update-5d4d5d6884-sg8zc 1/1 Running 0 8m33s sandbox-rolling-update-5d4d5d6884-wkrb8 1/1 Running 0 8m33s sandbox-rolling-update-5d4d5d6884-z68nq 1/1 Running 0 8m31s $ kubectl get pods -l app=sandbox-rolling-update --sort-by=.status.phase NAME READY STATUS RESTARTS AGE sandbox-rolling-update-59c54649f5-4dzbg 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-5twh4 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-8gqkt 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-btcsd 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-cf8mc 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-dmmrq 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-l7nmj 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-pbwl5 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-s8dwc 0/1 ContainerCreating 0 5s sandbox-rolling-update-59c54649f5-x6hfz 0/1 ContainerCreating 0 5s sandbox-rolling-update-5d4d5d6884-56q4g 1/1 Running 0 8m46s sandbox-rolling-update-5d4d5d6884-8d5gk 1/1 Running 0 8m45s sandbox-rolling-update-5d4d5d6884-8sf46 1/1 Running 0 8m46s sandbox-rolling-update-5d4d5d6884-bdbsx 1/1 Running 0 8m48s sandbox-rolling-update-5d4d5d6884-bv9s6 1/1 Running 0 8m48s sandbox-rolling-update-5d4d5d6884-fkmdm 1/1 Running 0 8m48s sandbox-rolling-update-5d4d5d6884-hlzfp 1/1 Running 0 8m46s sandbox-rolling-update-5d4d5d6884-sg8zc 1/1 Running 0 8m48s sandbox-rolling-update-5d4d5d6884-wkrb8 1/1 Running 0 8m48s sandbox-rolling-update-5d4d5d6884-z68nq 1/1 Running 0 8m46s
流れを簡単に図解してみた🎨
まとめ
今回は Deployment に設定できる Max Unavailable と Max Surge の挙動を試した.ドキュメントを読むだけでも把握できるけど,やっぱり実際に試すと理解が深まる.今後も手を動かすことを意識していくぞー💪