説明
PodDisruptionBudget(PDB)は、ノードのドレインなど Eviction API を使う自発的な中断を制限します。StatefulSet の可用性要件に合う予算がないと、保守中に複数のレプリカが同時に中断する場合があります。PDB は、Pod の直接削除、ノード障害、StatefulSet 自体のローリング更新を防ぐものではありません。
想定される影響
- 計画的なノード作業で利用可能なレプリカが減り、サービスやクォーラムの維持に影響する場合があります。
- 予算が厳しすぎたり代替配置の容量が不足したりすると、ノードのドレインが進まない場合があります。
対処方法
- 同じネームスペースに、実際の Pod ラベルと一致するセレクターを持つ PDB を設定してください。サービスやクォーラムの要件に合わせ、minAvailable または maxUnavailable のどちらかを指定してください。
- Pod の準備状態と代替配置の容量を確認し、ドレインを試してください。障害復旧、レプリカの分散、ローリング更新のポリシーは別途設定してください。
例
既存の nginx StatefulSet に PDB を追加する比較です。nginx Headless Service などの環境は別途用意する必要があります。
変更前
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
3 レプリカを定義しますが、この抜粋には PDB がありません。他に適用される PDB があるか確認する必要があります。
変更後
yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
app: nginx の Pod に maxUnavailable: 1 を適用します。既に利用できない Pod も予算に含まれ、予算が許す場合にだけ Eviction API による中断を許可します。