フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

PodDisruptionBudget設定時にでる「Cannot evict pod as it would violate the pod's disruption budget.」の解消法

f:id:lirlia:20210712165026p:plain

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 disruptions1 となっているので、最大で 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 disruptions0 になっている可能性があります。

❯ 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とする)

  1. pdb.min_available = 75% なら、4 x 75 % = 3 なので、 4 - 3 = 1 で 1Pod は移動できる
  2. pdb.min_available = 80% なら、4 x 80 % = 3.2 ≒ 4 なので、 4 - 4 = 0 で Pod は移動できない