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がスケジュールされない」というトラブルは現場で非常によくあります。ラベルやアノテーションを活用して、ノードの役割を明確に管理しておきましょう。