こんにちは。今回は Kubernetes における「ノードの状態管理」を自動化する2つの重要な機能
TaintNodesByCondition
と TaintBasedEviction
について、やさしく解説します。
🧠 はじめに:Taint(汚染)とは?
Kubernetesでは、ノードに「taint(テイント)=汚染」を付けることで、
特定のPodがそのノードにスケジューリングされないように制御できます。
taints:
- key: "key1"
effect: "NoSchedule"
一方、Podに「toleration(トレラレーション)=許容」を設定することで、
特定の taint を無視してスケジューリングすることが可能です。
📌 TaintNodesByConditionとは?
✅ 概要
Kubernetes v1.12 以降、TaintNodesByCondition
はデフォルトで有効です。
ノードの状態(メモリ不足・ディスク障害など)に応じて、自動的に taint を付与します。
つまり:
- ノードの状態(Node Condition)を直接チェックするのではなく、
- Taint としてラベル化して、Podのスケジューリング時にそれを使う
✅ 付与されるTaint一覧(効果: NoSchedule
)
ノードの状態 | Taintキー |
---|---|
メモリ不足 | node.kubernetes.io/memory-pressure |
ディスク不足 | node.kubernetes.io/disk-pressure |
ディスク使い切り | node.kubernetes.io/out-of-disk |
スケジューリング不可 | node.kubernetes.io/unschedulable |
ネットワーク不可 | node.kubernetes.io/network-unavailable |
これらの Taint があるノードには、toleration を設定していない Pod はスケジューリングされません。
📌 TaintBasedEvictionとは?
✅ 概要
Kubernetes v1.13 以降、TaintBasedEviction
はデフォルトで有効です。
ノードに異常があると、対応する NoExecute
taint を自動で追加し、
すでに動いている Pod も自動的に追い出されます(Eviction)。
つまり:
- 「既にノード上にいるPod」を対象にした動作です。
✅ 具体例
tolerations:
- key: "node.kubernetes.io/memory-pressure"
effect: "NoExecute"
tolerationSeconds: 3600
この設定があると:
「Podは、メモリ圧力のあるノードに移された後、3600秒間はそのまま滞在できる。
それ以降は強制的に退去させられる(Evicted)」
🚀 DaemonSetの場合は?
DaemonSet Pod には、Kubernetesが自動で以下のような NoSchedule
の toleration を追加してくれます:
node.kubernetes.io/memory-pressure
node.kubernetes.io/disk-pressure
node.kubernetes.io/out-of-disk
node.kubernetes.io/unschedulable
node.kubernetes.io/network-unavailable
これは、DaemonSet がノードに必ず配置されるべきであるための仕様です。
🧩 まとめ
機能名 | 目的 | 対象 | Taint効果 | 主な用途 |
---|---|---|---|---|
TaintNodesByCondition |
ノードの状態を元に Pod のスケジューリング制御 | 新しく配置されるPod | NoSchedule |
問題あるノードに Pod を置かない |
TaintBasedEviction |
ノードの状態を元に 既存のPod を退去させる | 既に配置されているPod | NoExecute |
問題あるノードから Pod を追い出す |
🎯 参考
📝 おわりに
Kubernetes の taint
と toleration
を使いこなすことで、
障害発生時の耐障害性(フェイルオーバー)を高め、より安定した運用が可能になります。
質問や補足があれば、ぜひコメントください 😊