Pod に PodDisruptionBudget(PDB)設定時に以下のエラーがでました。
error when evicting pods/"nginx-deployment-bc88786fd-fq8wv" -n "pdb-test" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
この解消法について紹介します。
原因と対策
Pod を退避 (evict) するためには一時的に Pod の数を減らす必要があり、その数に応じて一度にいくつの Pod が evict できるのかが決まっています。(=これが PDB の設定です)
しかしこのエラーが出る場合は、Pod が移動できないことを意味しています。例えば以下のケースでは Allowed disruptions
が 1
となっているので、最大で 1Pod を evict することができます。
❯ kubectl describe poddisruptionbudgets.policy Name: nginx Namespace: pdb-test Min available: 75% Selector: app=nginx Status: Allowed disruptions: 1 Current: 4 Desired: 3 Total: 4 Events: <none>
そのため kubectl drain
コマンドを実行すると 1 Pod づつ移動します。このとき例えば Pod が 4 つあったとすると、1 つづつ移動するため最初は 1 Pod のみ処理が成功して、残りの 3 Pod は evict に失敗するのでこのメッセージ(Cannot evict pod as it would violate the pod's disruption budget
) が 3 回出力されます。
また Cannot evict pod as it would violate the pod's disruption budget
が出続けて 1 Pod も移動しない場合は Allowed disruptions
が 0
になっている可能性があります。
❯ kubectl describe poddisruptionbudgets.policy Name: nginx Namespace: pdb-test Min available: 80% Selector: app=nginx Status: Allowed disruptions: 0 Current: 4 Desired: 4 Total: 4 Events: <none>
そもそも Allowed disruptions
をどうやっているかと言うと、pdb.min_available x replica 数 を切り上げた値を使っています。(max_unavailable
もありますが今回は扱いません)
そのため以下のケースに注意してください。(replica数 が 4とする)
- pdb.min_available = 75% なら、4 x 75 % = 3 なので、 4 - 3 = 1 で 1Pod は移動できる
- pdb.min_available = 80% なら、4 x 80 % = 3.2 ≒ 4 なので、 4 - 4 = 0 で Pod は移動できない