kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Deployment の maxUnavailable と maxSurge : ロールアウト中の割合を設定する

Kubernetes で Deployment を使うと Pod を安全にデプロイ(ロールアウト)できる.そのときに更新する Pod の割合として Max UnavailableMax Surge という設定値があり,デフォルト値は以下のようにドキュメントに書いてある.今回は動作確認をしながら図解もしていく.

  • Max Unavailable(停止状態になる最大 Pod 数)
    • .spec.strategy.rollingUpdate.maxUnavailable
    • デフォルト値 : 25%(小数点切り捨て)
    • 値には 絶対値 or % を設定できる
  • Max Surge(宣言した Pod 数を超えて作れる Pod 数)
    • .spec.strategy.rollingUpdate.maxSurge
    • デフォルト値 : 25%(小数点切り上げ)
    • 値には 絶対値 or % を設定できる

kubernetes.io

デフォルト値を確認する

以下の Deployment (replicas: 10) を適用する. Max UnavailableMax Surge のデフォルト値である 25% を考慮すると 7.5 ~ 12.5 となるため,デプロイ時には「最低 8 Running Pod」「最高 13 Pod」になると期待できる.さっそく以下の Deploymentimagesnginx: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

流れを簡単に図解してみた🎨

f:id:kakku22:20210901222813p:plain

maxUnavailablemaxSurge を指定する

次に .spec.strategy.rollingUpdate.maxUnavailable: 0%.spec.strategy.rollingUpdate.maxSurge: 100% を追加する.そして nginx:1.20-alpinenginx: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

流れを簡単に図解してみた🎨

f:id:kakku22:20210901222833p:plain

まとめ

今回は Deployment に設定できる Max UnavailableMax Surge の挙動を試した.ドキュメントを読むだけでも把握できるけど,やっぱり実際に試すと理解が深まる.今後も手を動かすことを意識していくぞー💪