StatefulSet の PodDisruptionBudget 設定の確認

計画的な保守中も必要なレプリカ数を維持できるよう、中断予算を設定してください。

説明

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 による中断を許可します。

参考資料