事象
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.
以上です。