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

2022.02.19
2024.03.24
Kubernetes
RollingUpdate

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

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

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

【Kubernetes】デプロイ戦略についてざっくり理解する

【Kubernetes】デプロイ戦略についてざっくり理解する

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

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

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

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

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

オプション

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

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

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

実際に試してみる

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

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  replicas: 10 # レプリカ数
9  strategy:
10    rollingUpdate:
11      maxUnavailable: 25% # 利用できないPodの最大数
12      maxSurge: 2 # レプリカ数を超えて起動できるPodの最大数
13  selector:
14    matchLabels:
15      app: myapp
16  template:
17    metadata:
18      labels:
19        app: myapp
20    spec:
21      containers:
22      - name: web-container
23        image: nginx:1.20
24        ports:
25          - containerPort: 80

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

1kubectl apply -f deployment.yml

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

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

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

1image: nginx:1.21

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

1kubectl apply -f deployment.yml

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

1❯ kubectl get rs -w
2NAME              DESIRED   CURRENT   READY   AGE
3myapp-6c4fc699f   10        10        10      28s  # nginx1.20
4myapp-6dfb64b584   2         0         0       0s  # nginx1.21 2Pod追加要求
5myapp-6c4fc699f    8         10        10      45s # nginx1.20 2Pod削除要求
6myapp-6dfb64b584   4         0         0       0s  # nginx1.21 4Pod追加要求(合計12Pod)
7myapp-6c4fc699f    8         8         8       45s # nginx1.20 2Pod削除完了(利用可能8Pod)
8myapp-6dfb64b584   4         2         0       0s  # nginx1.21
9myapp-6dfb64b584   4         4         0       0s  # nginx1.21
10myapp-6dfb64b584   4         4         1       3s  # nginx1.21
11myapp-6c4fc699f    7         8         8       48s # nginx1.20
12myapp-6dfb64b584   4         4         2       3s  # nginx1.21
13myapp-6dfb64b584   4         4         3       3s  # nginx1.21
14myapp-6c4fc699f    7         8         8       48s # nginx1.20
15myapp-6dfb64b584   5         4         3       3s  # nginx1.21
16myapp-6c4fc699f    7         7         7       48s # nginx1.20
17myapp-6dfb64b584   5         4         3       3s  # nginx1.21
18myapp-6c4fc699f    5         7         7       48s # nginx1.20
19myapp-6dfb64b584   5         5         3       3s  # nginx1.21
20myapp-6dfb64b584   7         5         3       3s  # nginx1.21
21myapp-6c4fc699f    5         7         7       48s # nginx1.20
22myapp-6c4fc699f    5         5         5       48s # nginx1.20
23myapp-6dfb64b584   7         5         3       3s  # nginx1.21
24myapp-6dfb64b584   7         7         4       3s  # nginx1.21
25myapp-6c4fc699f    4         5         5       49s # nginx1.20
26myapp-6c4fc699f    4         4         4       49s # nginx1.20
27myapp-6dfb64b584   8         7         4       4s  # nginx1.21
28myapp-6dfb64b584   8         8         4       4s  # nginx1.21
29myapp-6dfb64b584   8         8         5       8s  # nginx1.21
30myapp-6c4fc699f    3         4         4       53s # nginx1.20
31myapp-6dfb64b584   9         8         5       8s  # nginx1.21
32myapp-6c4fc699f    3         4         4       53s # nginx1.20
33myapp-6c4fc699f    3         3         3       53s # nginx1.20
34myapp-6dfb64b584   9         8         5       8s  # nginx1.21
35myapp-6dfb64b584   9         9         5       8s  # nginx1.21
36myapp-6dfb64b584   9         9         6       10s # nginx1.21
37myapp-6c4fc699f    2         3         3       55s # nginx1.20
38myapp-6dfb64b584   10        9         6       10s # nginx1.21
39myapp-6c4fc699f    2         3         3       55s # nginx1.20
40myapp-6c4fc699f    2         2         2       55s # nginx1.20
41myapp-6dfb64b584   10        9         6       10s # nginx1.21
42myapp-6dfb64b584   10        10        6       10s # nginx1.21
43myapp-6dfb64b584   10        10        7       11s # nginx1.21
44myapp-6c4fc699f    1         2         2       56s # nginx1.20
45myapp-6c4fc699f    1         2         2       56s # nginx1.20
46myapp-6c4fc699f    1         1         1       56s # nginx1.20
47myapp-6dfb64b584   10        10        8       12s # nginx1.21
48myapp-6c4fc699f    0         1         1       57s # nginx1.20
49myapp-6c4fc699f    0         1         1       57s # nginx1.20
50myapp-6c4fc699f    0         0         0       57s # nginx1.20 0Podに
51myapp-6dfb64b584   10        10        9       15s # nginx1.21
52myapp-6dfb64b584   10        10        10      17s # nginx1.21 全てのバージョンが入れ替え

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee