Kubernetes PodDisruptionBudget(PDB)の目的と動作
問題¶
What is the purpose of a PodDisruptionBudget?
解答¶
PodDisruptionBudget(PDB)は、自発的な中断(voluntary disruption)中にアプリケーションの可用性を保護するリソース。
解説¶
PDB の基本動作¶
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 4 # 最低 4 Pod は常に動いていること
selector:
matchLabels:
app: my-app
- レプリカ数 5 のアプリに
minAvailable: 4を設定した場合 - Kubernetes は一度に最大 1 Pod しか退避(evict)できない
- ノードドレインや Pod の eviction API が PDB を尊重する
minAvailable vs maxUnavailable¶
# パターン1: 最低N台を維持
spec:
minAvailable: 2 # 絶対数
# または
minAvailable: "80%" # パーセント指定
# パターン2: 最大N台まで停止を許容
spec:
maxUnavailable: 1
# または
maxUnavailable: "20%"
PDB が効く場面・効かない場面¶
| 状況 | PDB の効果 |
|---|---|
kubectl drain(ノードメンテナンス) |
有効(PDB が満たされなければ eviction をブロック) |
| Deployment のローリングアップデート | 有効 |
| Cluster Autoscaler によるスケールダウン | 有効 |
| OOMKilled(メモリ不足でのプロセス終了) | 無効 |
| ノード障害(突然の電源断など) | 無効 |
| Pod のクラッシュ・再起動 | 無効 |
重要: PDB は「Kubernetes や管理者が意図的に行う操作」だけを制御する。予期しない障害には効かない。
実践的な設定例¶
# ステートレスアプリ(Web サーバーなど)
spec:
maxUnavailable: 1 # 1台まで落としてOK
# ステートフルアプリ(DB など)
spec:
minAvailable: 2 # 2台以上は必ず生きていること
# 単一障害点を避けたいアプリ
spec:
minAvailable: 1 # 最低1台は動いていること
面接でのポイント¶
- PDB は voluntary disruption(自発的な中断)のみを制御することを明確に言えること
minAvailableとmaxUnavailableの違いと使い分けを説明できること- ノード障害や OOMKilled には効かないことを知っていること
kubectl drain時に PDB がどう機能するかを説明できると加点- Cluster Autoscaler との組み合わせ(スケールダウン時の保護)を知っていると高評価