【Kubernetes】ローリングアップデートをやってみる
2022.02.19
2024.03.24
Kubernetes
RollingUpdate
はじめに
Kubernetesのデプロイ戦略として、ローリングアップデートを実際に動かして試してみます。
Kubernetesでの代表的なデプロイ戦略については、下記でざっくりまとめています。
【Kubernetes】デプロイ戦略についてざっくり理解する
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
ローリングアップデートとは
ローリングアップデートは、全てのPodが新しいバージョンになるまで1つずつ更新するデプロイ方法です。
KubernetesのDeploymentでは、デフォルトのデプロイ方法となっています。
メリット | デメリット |
---|---|
・ダウンタイムがゼロ | ・2つのバージョンが混在 ・比較的ゆっくりロールアウト |
オプション
ローリングアップデートでは、maxUnavailable
とmaxSurge
というオプションが設定可能です。それぞれの詳細は下記の通りです。
オプション | 内容 | 設定できる値 | デフォルト |
---|---|---|---|
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)となっているのがわかります。
参考
Share
関連記事
【Kubernetes】DNSについて知る
2022.03.12
Kubernetesクラスタざっくり解説
2021.10.11
【Backstage】ローカルでKubernetesと連携してみる
2024.06.21