はじめに
以下記事のように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側でデフォルトで管理されているため
一般的なスケジューリングルールに反することがあるので注意が必要です。
以上です。