はじめに
Kubernetesにてマスター&ワーカー構成を用意した際に
Podの展開はデフォルトではWorkerNodeに行われます。
本記事では「なぜMasterにはPodがスケジュールされないのか?」という素朴な疑問の解説を行います。
環境情報
NAME STATUS ROLES AGE VERSION master Ready master .. v1.18.0 worker01 Ready <none> .. v1.18.0
MasterにはTaintsが設定されている
結論から言えば、Masterノードにはnode-role.kubernetes.io/master:NoScheduleというTaintsが設定されています。よって、Podは展開されません。
$ kubectl describe nodes master | grep -i taint Taints: node-role.kubernetes.io/master:NoSchedule
逆にデフォルトのWorkerノードには値が何も設定されていないためPodが展開されます。
$ kubectl describe nodes worker01 | grep -i taint Taints: <none>
Workerノードに同様の制御をしたい場合は以下のように設定することで汚染状態を与えて
$ kubectl taint nodes worker01 key1=value1:NoSchedule
Pod側で明示的に以下のように設定することで上記Workerを選んで展開させます。
tolerations: - key: key1 operator: Equal value: value1 effect: NoSchedule
このMasterにTaintが入っているというのは重要で、Workerノードが落ちてしまえばMasterは生きているにもかかわらずPodが展開されない理由もここにあります。
MasterノードへのPodのスケジュール法
簡単なのは以下のコマンドでtaint情報を剥がす方法です。
$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule- node/master untainted
この設定のうちはPodが展開され、以下で再度設定を入れ直せます。
$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule node/master tainted
そうではなく、Pod側で対応する場合は以下をPodの設定にいれます。
tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule
終わりに
逆にDockerDesktopのようなMaster/Workerが一体型の場合はMasterのTaintが空になっているのでPodが展開されるというわけです。
$ kubectl describe node docker-desktop | grep -i taint Taints: <none>
以上、ご参考になれば幸いです。