StatefulSet の PodDisruptionBudget 構成の確認

ステートフルなアプリケーションが許容できる自発的な中断数を決めてください。

説明

ノードのドレインなどで複数の StatefulSet Pod が自発的に退避すると、可用性やレプリケーションのクォーラムに影響する場合があります。PodDisruptionBudget(PDB)は、Eviction API を使う中断に対して利用可能な Pod 数の基準を設定します。

PDB はノード障害を防いだり、すべての Pod 削除を制限したりするものではありません。StatefulSet 自体のローリング更新には別途更新戦略が必要です。

想定される影響

  • メンテナンス中にサービスやクォーラムを維持できなくなる場合があります。
  • 厳しすぎる PDB は、ノードのドレインやメンテナンスを妨げる場合があります。

対処方法

  • 同じ名前空間で実際の StatefulSet Pod を選択する PDB を定義し、max_unavailable または min_available のいずれかをサービスとクォーラムの要件に合わせて指定してください。
  • 正常なレプリカ数、readiness、代替容量を確認してドレインをテストしてください。障害領域への分散とローリング更新は別途管理してください。

例

Pod template や Headless Service などを省略した既存の抜粋です。現在の API には kubernetes_pod_disruption_budget_v1 を使ってください。レプリカが二つの場合、max_unavailable 20% は切り上げにより一つの中断を許可するため、クォーラム要件に適合するか確認してください。

変更前

hcl
resource "kubernetes_stateful_set" "example" {
  metadata {
    name = "prometheus"
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        app = "prometheus"
      }
    }

    service_name = "prometheus"
  }
}

変更後

hcl
resource "kubernetes_stateful_set" "example" {
  metadata {
    name = "prometheus"
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        app = "prometheus"
      }
    }

    service_name = "prometheus"
  }
}

resource "kubernetes_pod_disruption_budget" "example" {
  metadata {
    name = "prometheus-pdb"
  }

  spec {
    max_unavailable = "20%"

    selector {
      match_labels = {
        app = "prometheus"
      }
    }
  }
}

補足:

  • 変更前: PDB を設定せずに二つのレプリカを構成します。許容する中断範囲を別途決める必要があります。
  • 変更後: app=prometheus の Pod を選択する PDB を追加します。省略した Pod ラベルも一致させる必要があり、すべての中断を防ぐ設定ではありません。

参考資料