(O+P)ut

アウトプット



(O+P)ut

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

【Kubernetes】Taints/TolerationsとNodeAffinityの違い

スポンサーリンク

はじめに

NodeにあるLabelを元にPodのスケジュールを行うのがNodeAffinityで、NodeにあるTaintを元にPodのスケジュールを行うのがTolerationsです。

この似通った「Taints/TolerationとNodeAffinityの違い」について分かりやすく解説します。尚、大まかな方針で説明しているのでご容赦ください。

本記事では触れませんが、Pod AffinityとPod Anti-Affinityは、既にスケジュールされているPodのラベルを元に自Podのスケジュールを行う機能なのでまったく別者です。

Taints/Tolerationの動き

ノードが3つあるとして、Node01には"Blue"というTaint(汚染)を与え、Node02には"Red"というTaintを与え、残りのNode03には何も与えません。

その場合、例えばPodにToleration(容認)が何も与えられていない場合はBlueやRedの汚れが受け入れられないので何も汚れがないNode03に展開されます。そして、Podに"Blue"の容認を与えた場合はNode01にも展開可能になりますが、Node03に展開される場合もあります。

NodeAffinityの動き

ノードが3つあるとして、Node01には"Blue"というLabel(ラベル)を与え、Node02には"Red"というLabelを与え、残りのNode03には何も与えません。

その場合、例えばPodにmatchExpressionsが何も設定されていないPodは全Nodeに展開される可能性があります。そして、matchExpressionsに"Blue"を指定した場合はNode01に展開されます。

Taints/TolerationsとNodeAffinityの違い

上の例を見ると分かりますが、Podをスケジュールする方針が異なります。
Taints/Tolerationsの場合は展開したくないNodeを明示的に指定することでそのNode以外にスケジューリングされ、NodeAffinityの場合は展開したいNodeを明示的に指定することでそのNodeにスケジューリングされます。

要は、MasterNodeにPodを展開させたくない場合はTaintでMasterを汚染させて置いたり、特定のGPUが積まれたNodeが必要なPod存在するのであればNodeAffinityでラベルを指定しにいく使い方をします。

ちなみにこれらは両方を設定することで"Blue"のNodeに”Blue"を許容&ラベル指定したPodが展開され、何もPodに指定がない場合は”Blue"や”Red"に汚染されていないNodeにPodを展開することができます。

終わりに

TolerationsにおいてPreferNoScheduleを指定することで条件にマッチしていないPodを受け入れたりと上記の例に即さない細かな制御は可能ですが、大きな方針として違いを理解する参考になれば幸いです。

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