TL

ローリング更新の数理と可用性制約

更新中に何台まで落ちるかを勘で決めるのを卒業。maxSurge と maxUnavailable から最小可用台数とロールアウト時間を計算で出せるようになり、サージ容量とコストのトレードオフを根拠を持って設計できます。

応用Kubernetesローリング更新可用性キャパシティプランニングデプロイ最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.更新中の最小可用台数は おおよそ replicas − maxUnavailable。ここが必要キャパシティを割ると、デプロイ自体が障害になる。
  • 2.ロールアウト時間は おおよそ (置換すべき台数 ÷ 1ステップで進む台数) × ステップ所要時間。並列度はサージ容量と maxUnavailable で決まる。
  • 3.maxSurge を上げると速く・可用性は高いがリソースを余分に食う。maxUnavailable を上げると速いが可用性が下がる。両者はゼロにできない。

ローリング更新を数で捉える

デプロイ戦略 のローリング更新は「数台ずつ入れ替える」と説明されますが、その「数台」を決めるのが maxSurgemaxUnavailable という2つのパラメータです。Kubernetes の Deployment では、この2つが更新中に許される 台数の上限と下限の窓 を定義します。記号を整理します。

R  = desired replicas(目標レプリカ数)
S  = maxSurge(一時的に R を超えて作れる Pod 数の上限)
U  = maxUnavailable(更新中に不足してよい Pod 数の上限)

SU はパーセント指定もでき、その場合は R を掛けて Pod 数に変換します。maxSurge は切り上げ(ceil)、maxUnavailable は切り捨て(floor)で丸められる点が重要です。たとえば R=4maxSurge=25%maxUnavailable=25% なら S = ceil(1.0) = 1U = floor(1.0) = 1 です。この丸めの非対称は安全側、つまり「サージはやや多め、不足はやや少なめ」に倒すための仕様です。

両方を同時に 0 にはできない

maxSurgemaxUnavailableどちらも 0 にすると、コントローラは「新しい Pod を増やすことも、古い Pod を減らすこともできない」状態になり、更新が進みません。Kubernetes はこの組み合わせをバリデーションで拒否します。少なくとも一方は 1 以上(または 0% 超)である必要があります。

更新中の可用性:下限を支配するのは maxUnavailable

ローリング更新中、コントローラが保証する 利用可能 Pod 数の下限 は次式で近似できます。

最小可用台数 ≒ R − U

R=10U=2 なら、更新の全工程を通じて少なくとも 8 台は Ready であり続けます。ここが設計の一次制約です。サービスがピーク時に「7 台では捌けない」とわかっているのに U=4 と設定すれば、デプロイそのものがキャパシティ不足、すなわち自己誘発的な障害になります。可用性の床は maxSurge ではなく maxUnavailable が支配する、と覚えてください。

ただし「最小可用台数」は Ready とカウントされた Pod の数 であって、実際に流量を受けられる台数とは限りません。新しい Pod が起動直後でまだウォームアップ中だと、Ready 判定は通っていても性能が出ません。SRE と SLO の観点では、必要キャパシティに安全マージンを足した値を R − U が下回らないよう設計します。

Readiness プローブが床を決める

R − U はあくまで「Ready とみなされた台数」の下限です。Readiness プローブが甘い(早く Ready を返す)と、まだ温まっていない Pod に流量が向き、R − U 台あっても実効容量は不足します。逆にプローブが厳格すぎると Ready が遅れ、ロールアウトが想定より長引きます。床の質はプローブ設計で決まります。

ロールアウト時間:1ステップで何台進むか

ロールアウトに要する時間は「全 R 台を入れ替えるのに、1回のステップで何台進めるか」で決まります。1ステップで前進できる台数 P は、サージ枠と不足枠の合計に支配されます。

1ステップで前進できる台数 P ≒ S + U
(ただし新規 Pod の起動と古い Pod の終了が並行するため)

直感は次の通りです。コントローラは古い Pod を最大 U 台まで先に削れ、同時にサージ枠 S で新しい Pod を S 台余分に立てられます。つまり1サイクルあたり最大で S + U 台ぶんの置換が並行します。総ロールアウト時間は次のように近似できます。

ロールアウト時間 ≒ ceil(R ÷ (S + U)) × T_step

T_step = 新 Pod が起動して Ready になるまでの時間
         (イメージ pull + 起動 + Readiness 待ち)

例として R=12S=2U=2T_step=30秒 なら、12 ÷ 4 = 3 ステップ、合計およそ 90 秒です。ここで効くのは S + U という 並列度 です。並列度を上げればステップ数は減りますが、後述するコストと可用性の制約に突き当たります。

T_step を縮めるほうが効く場合が多い

ロールアウトが遅い原因の多くは並列度ではなく T_step、すなわち1台が Ready になるまでの時間です。巨大なコンテナイメージの pull、長い起動処理、過剰に長い initialDelaySeconds が支配的なら、maxSurge を増やすより イメージレイヤ の最適化や起動高速化のほうが総時間を縮めます。並列度を上げても、各 Pod が遅ければステップ時間は縮みません。

サージ容量とリソースのトレードオフ

maxSurge を上げる最大の代償は 一時的なリソース消費 です。更新中、クラスタには最大で R + S 台ぶんの Pod が同時に存在し得ます。各 Pod の要求リソースを r(CPU・メモリ)とすると、ピーク時の追加要求は次の通りです。

更新中のピーク Pod 数 ≒ R + S
追加で必要なリソース ≒ S × r

maxSurge が大きいほど、この余剰枠をスケジュールできるだけの空きがノード側に必要です。空きがなければ新しい Pod は Pending のまま スケジューラ に弾かれ、ロールアウトはそこで停滞します。つまり maxSurge を上げる前提として、クラスタに S × r ぶんのヘッドルームを常時確保するか、Cluster Autoscaler でノードを増やせる構成が要ります。3つのパラメータ設定が何を最適化するかを整理します。

設定の傾向ロールアウト速度更新中の可用性余剰リソース
maxSurge 大・maxUnavailable 0速い高い(R 台を維持)多い(S 台ぶん常時確保)
maxSurge 0・maxUnavailable 大速い低い(R − U まで低下)なし(余剰不要)
両方を中程度
両方 1 など小さく遅い(ステップ多)高い少ない

要点は、速度・可用性・コストの3つを同時には最大化できない ことです。maxUnavailable=0 は可用性を保ったまま更新できますが、サージ枠なしでは1台も置換を始められないため maxSurge >= 1 が必須となり、その余剰リソースを払い続けます。逆に maxSurge=0 は余剰ゼロですが、maxUnavailable を上げないと進まず、可用性を削ることになります。

ステートフルや PDB との相互作用

ここまでの式は Deployment(ステートレス)を前提にしています。StatefulSet では順序保証のため並列度が制限され、S + U の直感はそのまま使えません。さらに PodDisruptionBudget(PDB)が minAvailable を別に課している場合、ローリング更新の maxUnavailable は PDB の制約と AND で効きます。どちらか厳しいほうが実効上限になり、矛盾すると更新が止まります。

まとめ

  • 更新中の 最小可用台数は おおよそ R − maxUnavailable。ここが必要キャパシティを割ると、デプロイが障害化する。可用性の床を支配するのは maxUnavailable
  • ロールアウト時間は おおよそ ceil(R ÷ (S + U)) × T_step。並列度 S + U を上げるとステップは減るが、多くの場合ボトルネックは1台あたりの T_step
  • maxSurge を上げると速く・可用性を保てるが、更新中ピークで R + maxSurge 台ぶん のリソースを食う。S × r のヘッドルームかオートスケールが前提。
  • 速度・可用性・コストは三すくみ。両方 0 は不可、少なくとも一方は 1 以上。Readiness プローブの質が可用性の床の質を決める。
  • ステートフルワークロードや PDB が絡むと並列度の前提が変わる。実効上限は最も厳しい制約で決まる。

DevOps/インフラ Article

ローリング更新の数理と可用性制約を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

Kubernetes

比較で見る軸

難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 5

導入後に効く点

ロールアウト時間は おおよそ (置換すべき台数 ÷ 1ステップで進む台数) × ステップ所要時間。並列度はサージ容量と maxUnavailable で決まる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
DevOps/インフラ
タグ数
5

判断チェックリスト

  • 自社の用途が「Kubernetes / ローリング更新」に近いか確認する。
  • 強みである「更新中の最小可用台数は おおよそ replicas − maxUnavailable。ここが必要キャパシティを割ると、デプロイ自体が障害になる。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

Kubernetesローリング更新可用性キャパシティプランニングデプロイKubernetesローリング更新可用性
参考: 公式情報