(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetesr】Nodeに対してdrainを行うもPodが起動しつづける

スポンサーリンク

事象

KubernetesのNodeに対してdrainコマンドを押下するも

$ kubectl drain worker01

以下のようなメッセージが標準出力に表示された上で

node/worker01 cordoned
...
error: unable to drain node "worker01", aborting command...
There are pending nodes to be drained:
 worker01
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): ...
cannot delete Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet (use --force to override):...
cannot delete Pods with local storage (use --delete-emptydir-data to override): ...

該当のNodeにPodは存在し続ける。

環境情報
  • Kubernetes v1.21

原因/解決策

標準出力にある通りでcordonには成功するもdrainには失敗している。
cordonが通ることでNode上に新規Podの生成はされないものの

$ kubectl get node
NAME            STATUS                     ROLES    AGE    VERSION
...
worker01   Ready,SchedulingDisabled   <none>   ...
worker02   Ready                      <none>   ...

Node上で動いているPodはそのままとなっている。

よって以下の引数を付与することで

$ kubectl drain worker01 --ignore-daemonsets --force --delete-emptydir-data

Podを排除した上でnode/worker01 evictedという文言が確認できる。

...
pod/test-54b55d465f-snw8j evicted
pod/test-54b55d465f-xqffr evicted
node/worker01 evicted

以下、補足です。

補足

drainとuncordonの流れは下記に記載済ですが今回は--forceという引数が登場したので別記事にしました。

cordonもdrainもNodeの状態は同じく以下になりますが

Ready,SchedulingDisabled

drainをするためにPodを削除する部分がこけてしまうと以下の文言が確認できずdrainには失敗します。

node/worker01 evicted

Daemonsetは無視しているのでこれに紐づくPodは動き続けていますが、Deploymentのように数に縛りがあるものは別のNodeにてPodが展開されます。ちなみに別Nodeに空きがない場合は以下のようにPendingとなるのでdrain前には確認することをオススメします。

Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  2m19s  default-scheduler  0/3 nodes are available: 1 node(s) were unschedulable, 2 Insufficient cpu.

以上です。