🌊

kubernetesでポッドをロールアウトする!(ローリングアップデート無停止更新)

2021/02/23に公開

はじめに

今回はkubernetesでコンテナを更新するためのロールアウトを勉強する。

概要

■ロールアウトとは
■デプロイメントマニフェストを変更してロールアウトする

をまとめた!(^^)!

■ロールアウトとは

kubernetesのロールアウトはアプリケーションコンテナの更新を意味する。新しいコンテナに更新するのには、更新したいコンテナイメージをリポジトリに登録し、マニフェストに新しいイメージを設定して再適用することでロールアウトが開始される。
ロールアウトではクライアントからのアクセスを継続しながらバージョンアップを行うためにリクエストに対応できるポッドを残しつつ、残りポッドを更新していき最終的に全てのポッドで新しいポッドが利用できるようにする。

今回はデプロイメントマニフェストで作成したnginxコンテナを新しいバージョンのnginxコンテナにロールアウトする。

■デプロイメントマニフェストを変更してロールアウトする

nginx(1.16)コンテナを10個レプリカするデプロイメントマニフェストを
nginx(1.17)コンテナを10個レプリカするデプロイメントマニフェストに変更して、ロールアウト(ローリングアップデート)更新をする。
そのために変更後のマニフェストを作成する。
web-deploy1.yamlの内容からweb-deploy2.yamlの内容に変更する。
現在実行中のデプロイメント↓

web-deploy1.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: {}

から↓に変更する。

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.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 ならリソースの詳細が表示される。

web-deployの詳細を表示する
$ 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

アップデートの詳細についてここを確認する。↓

web-deployの詳細一部
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
マニフェスト適用後その2
$ 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
マニフェスト適用後その3
$ 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つ維持しながら更新をしているのがわかる。

デプロイメントの詳細を表示する
コンテナ更新中↓

デプロイメント詳細その1(コンテナ更新中)                                                                                                                                                                                               
$ 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

コンテナ更新後↓

デプロイメント詳細その2(コンテナ更新後)
$ 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