KubernetesのPodDisruptionBudget (PDB) は、クラスタ内で必ず起動しておくべきPodの最小数を定義することで、計画的なノードのメンテナンスや予期せぬ障害の際にもサービスの可用性を維持するための重要な機能です。PDBは指定されたPodセレクタに一致するPodの最小または最大稼働数を設定し、DeploymentやReplicaSetなどのリソースに適用されます。PDBとkubectl drainコマンドが連携することで、ノードを安全にメンテナンスでき、Kubernetesクラスタの可用性とパフォーマンスを保てます。
PDBのわかりやすい説明
PodDisruptionBudget (PDB) は、Kubernetesクラスタ内で常に利用可能であるべきPodの最小数を定義する仕組みです。これにより、計画メンテナンスや予期せぬ障害の際にもアプリケーションの可用性を維持できます。例えば、PDBでminAvailable: 3
と指定すると、対象のPodは常に3つ以上起動している状態になります。kubectl drain
でノードを停止する際も、PDBの予算を満たせる場合のみPodの退避が許可されるため、無秩序なPod削除によるサービス停止を防げます。このようにPDBは、シンプルな設定でKubernetesクラスタの可用性を高められる強力な機能なのです。本番運用では積極的に活用し、アプリケーションを安定稼働させましょう。
PodDisruptionBudget (PDB) は、Kubernetesクラスタ内のPodへの自発的な中断を制御するリソースです。PDBは指定されたPodセレクタに一致するPodの最小または最大稼働数を定義します。PDBでは、.spec.minAvailable
か.spec.maxUnavailable
のどちらかを指定する必要があります。minAvailable
は常に利用可能であるべきPodの最小数を絶対値またはパーセンテージで指定し、maxUnavailable
は無効状態でも良いPodの最大数を指定します。PDBはラベルセレクタを使って、Deployment、ReplicaSet、StatefulSetなどの他のリソースを対象とします。典型的なPDBの定義は以下のようになります。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: nginx
この例では、app: nginx
ラベルを持つPodに対し、最小1つのPodが常に利用可能であるべきことを定義しています。PDBはKubernetesの1.21でpolicy/v1 APIに昇格し、以前のpolicy/v1beta1 APIは非推奨となりました。PDBの基本概念を理解することは、Kubernetesクラスタの可用性を維持するために重要です。
PDBの実際の使用例
PodDisruptionBudget (PDB) は、Kubernetesクラスタの運用で、様々な場面で役立ちます。以下に代表的な使用例を紹介します。
- ローリングアップデート時の可用性維持: DeploymentのローリングアップデートではPDBを設定することで、アップデート中も一定数のPodが常に利用可能な状態を保てます。例えば
minAvailable: 50%
と指定すれば、アップデート中も常にPodの半数以上が稼働し続けるため、サービス停止を防げます - ノードメンテナンス時の安全性確保:
kubectl drain
でノードを計画的にメンテナンスする際、PDBと連携させることで、メンテナンス中もサービス可用性を維持できます。PDBの予算を満たす場合のみPodの退避が許可されるため、無秩序なPod削除によるダウンタイムを防止できます。 - クラスタオートスケーラとの併用: クラスタオートスケーラ(CA)によるノード削除時もPDBを設定しておけば、必要最低限のPod数を確保しつつスケールダウンできます。CAはPDBの予算を考慮してノード削除を行うため、サービス可用性を損なわずにコスト最適化が実現できます
- ゾーン障害時の影響緩和: マルチゾーンクラスタではPDBを用いることで、単一ゾーンの障害時にもサービス全体の可用性を維持できます。複数ゾーンにPodを分散させつつ、PDBで全体の最小Pod数を定義しておけば、1ゾーンが停止してもサービスは継続できます
このようにPDBはKubernetesクラスタのあらゆる局面で、サービス可用性と安定性の向上に寄与します。適切なPDBを設定し、クラスタ運用に役立てていきましょう。
PDBとkubectl drainの連携
PDBとkubectl drainコマンドは連携して動作し、ノードのメンテナンス時にサービスの可用性を維持します。kubectl drainでノードを排除する際、PDBで定義された予算を満たしている場合のみPodの退避が許可されます。
例えばPDBでminAvailableを4に設定している場合、kubectl drainによってPod数が4未満になる退避は拒否されます。一方maxUnavailableを1に設定した場合、kubectl drainは常に1つのPodのみ退避可能です。ただし、maxUnavailableの場合はPod数が1の時に一時的に全てのPodが利用不可となるリスクがあるため注意が必要です。
また、kubectl drainは設定したタイムアウト時間までPDBの予算を満たすまで退避要求を再試行し続けます。タイムアウトは--timeout
フラグで指定でき、デフォルトは0s(無期限)です。再試行の間隔は--delete-local-data
フラグで調整できます。
このようにPDBとkubectl drainが連携することで、Kubernetes上で安全で確実なノードメンテナンスが実現できます。