LoginSignup
2
4

PodDisruptionBudget: Kubernetesの可用性を守る仕組み

Posted at

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上で安全で確実なノードメンテナンスが実現できます。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4