Try   HackMD

TaintsとTolerations

KubernetesのTaintsとTolerationsとは

Node SelectorやNode Affinityと同じく、特定のNodeにPodをscheduleする仕組み。
直訳するとTaintsは「汚れ」、Tolerationsは「許容」でいまいち意味わからない。
簡単に言うと汚れ(Taints)をどこまで許容(Tolerations)できるかを定義する。

Node SelectorやNode AffinityはPodをscheduleしたいNodeの設定を行なうが、TaintsとTolerationsはPodをscheduleしたくないNodeを設定する。
TaintsはNodeに設定し、TolerationsはPodに設定する。
本番用のNodeに他のPodをscheduleさせたくない時などに有効。

Taintsの付与

TaintsはKey=Value:Effectのように、3種類のパラメータで構成されている。
付与されたTaintsを確認するにはkubectl describe node <Node>を使用する。

# prod01ノードにenv=prod:NoScheduleのTaintsを付与
$ kubectl taint node prod01 env=prod:NoSchedule

EffectはTaintsとTolerationsがマッチしない際の挙動を定義している。

  • PreferNoSchedule: 可能な限りスケジューリングしない
  • NoSchedule: スケジューリングしない
  • NoExecute: 実行を許可しない

Tolerationsの指定

TolerationsはKey/Value/Effectを指定して、Taintsで付与されたKey/Value/Effectと一致した場合許容する。
完全一致だけでなく、Tolerationsの一部を未指定にすることでワイルドカードとして扱うこともできる。

Tolerationsを指定したPodの例

apiVersion: v1 kind: Pod metadata: name: sample-tolerations spec: containers: - name: sample-container image: nginx tolerations: - key: "env" operator: "Equal" value: "prod" effect: "NoSchedule"

オペレータは以下の2種類から選択可能。

  • Equal: keyとvalueが等しい
  • Exists: keyが存在する

Kubernetesが付与するその他のTaints

Nodeに以下のような問題が発生した場合に、対応するTaintsが自動で付与される。

  • ノードのメモリ不足時
  • ノードのディスク不足時
  • ノードのPID枯渇時
  • ノードのネットワーク不通時