【Kubernetes】ローリングアップデートをやってみる

スポンサーリンク

はじめに

Kubernetesのデプロイ戦略として、ローリングアップデートを実際に動かして試してみます。

Kubernetesでの代表的なデプロイ戦略については、下記でざっくりまとめています。

【Kubernetes】デプロイ戦略についてざっくり理解する
はじめにKubernetesにおけるデプロイ戦略をざっくりまとめてみたいと思います。デプロイ戦略ここで紹介するデプロイ戦略は下記になります。ローリングアップデートRecreateブルーグリーンデプロイレインボーデプロイカナ...

ローリングアップデートとは

ローリングアップデートは、全てのPodが新しいバージョンになるまで1つずつ更新するデプロイ方法です。

KubernetesのDeploymentでは、デフォルトのデプロイ方法となっています。

メリットデメリット
・ダウンタイムがゼロ・2つのバージョンが混在
・比較的ゆっくりロールアウト

オプション

ローリングアップデートでは、maxUnavailablemaxSurgeというオプションが設定可能です。それぞれの詳細は下記の通りです。

オプション内容設定できる値デフォルト
maxUnavailable利用できないPodの最大数絶対数(例:2)
レプリカ数の割合(例:30%)
25%
maxSurgeレプリカ数を超えて起動できるPodの最大数絶対数(例:2)
レプリカ数の割合(例:30%)
25%

小数は切り捨てされます。

実際に試してみる

まずは下記のマニフェスト(deployment.yml)からDeploymentを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 10 # レプリカ数
  strategy:
    rollingUpdate:
      maxUnavailable: 25% # 利用できないPodの最大数
      maxSurge: 2 # レプリカ数を超えて起動できるPodの最大数
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: web-container
        image: nginx:1.20
        ports:
          - containerPort: 80

マニフェストを適用します。

kubectl apply -f deployment.yml

下記のようにREADYが全て揃えば準備完了です。

❯ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   10/10   10           10          22m

アップデートが動くようにマニフェストを変更します。今回はイメージのバージョンを変更します。

image: nginx:1.21

再度、マニフェストを適用します。

kubectl apply -f deployment.yml

kubectl get rs -wで変更の経過を見てみます。

❯ kubectl get rs -w
NAME              DESIRED   CURRENT   READY   AGE
myapp-6c4fc699f   10        10        10      28s  # nginx1.20
myapp-6dfb64b584   2         0         0       0s  # nginx1.21 2Pod追加要求
myapp-6c4fc699f    8         10        10      45s # nginx1.20 2Pod削除要求
myapp-6dfb64b584   4         0         0       0s  # nginx1.21 4Pod追加要求(合計12Pod)
myapp-6c4fc699f    8         8         8       45s # nginx1.20 2Pod削除完了(利用可能8Pod)
myapp-6dfb64b584   4         2         0       0s  # nginx1.21
myapp-6dfb64b584   4         4         0       0s  # nginx1.21
myapp-6dfb64b584   4         4         1       3s  # nginx1.21
myapp-6c4fc699f    7         8         8       48s # nginx1.20
myapp-6dfb64b584   4         4         2       3s  # nginx1.21
myapp-6dfb64b584   4         4         3       3s  # nginx1.21
myapp-6c4fc699f    7         8         8       48s # nginx1.20
myapp-6dfb64b584   5         4         3       3s  # nginx1.21
myapp-6c4fc699f    7         7         7       48s # nginx1.20
myapp-6dfb64b584   5         4         3       3s  # nginx1.21
myapp-6c4fc699f    5         7         7       48s # nginx1.20
myapp-6dfb64b584   5         5         3       3s  # nginx1.21
myapp-6dfb64b584   7         5         3       3s  # nginx1.21
myapp-6c4fc699f    5         7         7       48s # nginx1.20
myapp-6c4fc699f    5         5         5       48s # nginx1.20
myapp-6dfb64b584   7         5         3       3s  # nginx1.21
myapp-6dfb64b584   7         7         4       3s  # nginx1.21
myapp-6c4fc699f    4         5         5       49s # nginx1.20
myapp-6c4fc699f    4         4         4       49s # nginx1.20
myapp-6dfb64b584   8         7         4       4s  # nginx1.21
myapp-6dfb64b584   8         8         4       4s  # nginx1.21
myapp-6dfb64b584   8         8         5       8s  # nginx1.21
myapp-6c4fc699f    3         4         4       53s # nginx1.20
myapp-6dfb64b584   9         8         5       8s  # nginx1.21
myapp-6c4fc699f    3         4         4       53s # nginx1.20
myapp-6c4fc699f    3         3         3       53s # nginx1.20
myapp-6dfb64b584   9         8         5       8s  # nginx1.21
myapp-6dfb64b584   9         9         5       8s  # nginx1.21
myapp-6dfb64b584   9         9         6       10s # nginx1.21
myapp-6c4fc699f    2         3         3       55s # nginx1.20
myapp-6dfb64b584   10        9         6       10s # nginx1.21
myapp-6c4fc699f    2         3         3       55s # nginx1.20
myapp-6c4fc699f    2         2         2       55s # nginx1.20
myapp-6dfb64b584   10        9         6       10s # nginx1.21
myapp-6dfb64b584   10        10        6       10s # nginx1.21
myapp-6dfb64b584   10        10        7       11s # nginx1.21
myapp-6c4fc699f    1         2         2       56s # nginx1.20
myapp-6c4fc699f    1         2         2       56s # nginx1.20
myapp-6c4fc699f    1         1         1       56s # nginx1.20
myapp-6dfb64b584   10        10        8       12s # nginx1.21
myapp-6c4fc699f    0         1         1       57s # nginx1.20
myapp-6c4fc699f    0         1         1       57s # nginx1.20
myapp-6c4fc699f    0         0         0       57s # nginx1.20 0Podに
myapp-6dfb64b584   10        10        9       15s # nginx1.21
myapp-6dfb64b584   10        10        10      17s # nginx1.21 全てのバージョンが入れ替え

利用できないPodは多くても2Pod(レプリカ10 * 0.25 = 2.5)、起動しようとしているPodは最大で12Pod(レプリカ10 + 2 = 12)となっているのがわかります。

参考

タイトルとURLをコピーしました