(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】SchedulingDisabledとなっているNodeにDaemonSetが存在し続ける理由

スポンサーリンク

はじめに

以下記事のようにNodeに対してdrainを発行して

NodeのステータスをSchedulingDisabledとしているにもかかわらずDaemonSetに紐づくPodはそのNode上で削除をしても動作し続けます。

本記事ではその理由について説明しました。

環境情報
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0"..

DaemonSet Podへの暗黙的なTolerations

結論としてはDaemonSetに紐づくPodsには以下のTolerationsが自動的に付与されます。

Tolerations:
node.kubernetes.io/disk-pressure:NoSchedule op=Exists
node.kubernetes.io/memory-pressure:NoSchedule op=Exists
node.kubernetes.io/not-ready:NoExecute op=Exists
node.kubernetes.io/pid-pressure:NoSchedule op=Exists
node.kubernetes.io/unreachable:NoExecute op=Exists
node.kubernetes.io/unschedulable:NoSchedule op=Exists

Tolerationsに関しては以下記事の通りでNodeが汚染されていた場合にそれをコンテナに容認させる設定であり

実際にControlled By: DaemonSetとなっているPodのspec情報を見に行くと以下のようになっています。

  tolerations:
  - effect: NoSchedule
    key: node.kubernetes.io/unschedulable
    operator: Exists

同設定により、drainによってNode側がSchedulingDisabled (unschedulable に設定)になってもTaintとTolerationが一致してPodがNodeにスケジューリングされたままとなるわけです。

終わりに

このあたりのTaint関連はKubernetes側でデフォルトで管理されているため

一般的なスケジューリングルールに反することがあるので注意が必要です。

以上です。