説明
ノードのドレインなどで複数の 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 ラベルも一致させる必要があり、すべての中断を防ぐ設定ではありません。