はじめに
Kubernetesのデプロイ戦略として、ローリングアップデートを実際に動かして試してみます。
Kubernetesでの代表的なデプロイ戦略については、下記でざっくりまとめています。

【Kubernetes】デプロイ戦略についてざっくり理解する
はじめにKubernetesにおけるデプロイ戦略をざっくりまとめてみたいと思います。デプロイ戦略ここで紹介するデプロイ戦略は下記になります。ローリングアップデートRecreateブルーグリーンデプロイレインボーデプロイカナ...
ローリングアップデートとは
ローリングアップデートは、全てのPodが新しいバージョンになるまで1つずつ更新するデプロイ方法です。
KubernetesのDeploymentでは、デフォルトのデプロイ方法となっています。
メリット | デメリット |
---|---|
・ダウンタイムがゼロ | ・2つのバージョンが混在 ・比較的ゆっくりロールアウト |
オプション
ローリングアップデートでは、maxUnavailable
とmaxSurge
というオプションが設定可能です。それぞれの詳細は下記の通りです。
オプション | 内容 | 設定できる値 | デフォルト |
---|---|---|---|
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)となっているのがわかります。