【ツール活用|初心者向け】Kubernetesの「TaintsとTolerations」で特定のPodを特定のノードに配置する方法

1. 導入: なぜTaintsとTolerationsが必要なのか

Kubernetesでクラスタを運用していると、「特定のGPU搭載ノードには、機械学習の処理を行うPodだけを割り当てたい」「特定のアプリケーション専用のノードを用意したい」という状況が発生します。通常、Kubernetesのスケジューラは空いているノードに自由にPodを配置しますが、これでは重要な処理にリソースが回らなかったり、コストのかかるノードに不要なPodが紛れ込んだりしてしまいます。
この課題を解決するのがTaints(汚れ)とTolerations(許容)です。これを使うと、ノードに「汚れ」をつけ、その汚れを「許容」できるPodだけを配置するという排他制御が可能になります。

2. 基礎知識: TaintsとTolerationsの仕組み

・Taints(テイント): ノード側に設定する「拒絶反応」です。Taintが設定されたノードには、原則としてPodは配置されません。
・Tolerations(トレレーション): Pod側に設定する「許可証」です。特定のTaintを許容する設定を持つPodだけが、そのノードに配置される権利を得ます。
・Node Affinityとの違い: Node Affinityは「このノードを選んでください(希望)」というPod側からの指名ですが、Taintsは「汚れているから来ないでください(拒絶)」というノード側からの防衛線である点が大きく異なります。

3. 実装/解決策: 設定の手順

設定は以下の2ステップで行います。
1. ノードにTaintを付与する(kubectl taintコマンドを使用)
2. Podの定義ファイル(YAML)にTolerationを記述する

4. サンプルプログラム: 設定例

まずはノードに「GPUが必要」というTaintを設定します。

コマンド実行例:
kubectl taint nodes node01 gpu=true:NoSchedule

次に、このノードに配置するためのPod定義ファイルです。

apiVersion: v1
kind: Pod
metadata:
name: gpu-workload-pod
spec:
containers:

  • name: app-container

image: nginx
# ここでTaintに対する許容(Toleration)を設定します
tolerations:

  • key: “gpu” # ノードのTaintのキーと一致させる

operator: “Equal” # 値が完全に一致する場合に許容
value: “true” # ノードのTaintの値と一致させる
effect: “NoSchedule” # ノードのTaintの効果(NoScheduleは配置させない)

5. 応用・注意点: 現場での運用ポイント

・Effectの種類に注意:
「NoSchedule」は新しいPodの配置を拒否しますが、既に動いているPodには影響しません。逆に「NoExecute」を指定すると、そのTaintを許容しない既存のPodをノードから追い出す(Evictする)ことができます。
・Node Affinityとの併用:
Taintsだけでは「そのノードに配置すること」を保証するものではなく、「配置可能にする」だけです。確実に特定のノードへスケジュールしたい場合は、Node Affinityと組み合わせて、「このノードを優先し、かつTolerationで許可されている」という状態を作るのがベストプラクティスです。
・設定の忘れに注意:
Taintを設定したことを忘れてしまい、「なぜかPodがスケジュールされない」というトラブルは現場で非常によくあります。ラベルやアノテーションを活用して、ノードの役割を明確に管理しておきましょう。

タイトルとURLをコピーしました