(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】MasterノードにPodがスケジュールされない理由

スポンサーリンク

はじめに

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>

以上、ご参考になれば幸いです。