污点与容忍
想象一个场景:你有一些 GPU 计算节点,只想运行机器学习任务。但普通的 Pod 也可能被调度到这些节点上。
污点(Taint)和容忍(Toleration)机制,让你能够「排斥」某些 Pod 到特定节点。
污点与容忍概述
污点应用于节点,表示这些节点「排斥」某些 Pod。
容忍应用于 Pod,表示 Pod 能够「容忍」节点的污点。
污点(Taint)
添加污点
污点效果(Effect)
移除污点
常见使用场景
容忍(Toleration)
基本语法
操作符
匹配所有污点
NoExecute 容忍时间
实际应用
场景一:数据库专用节点
database-pod.yaml
场景二:GPU 计算节点
gpu-training-pod.yaml
场景三:临时扩展节点
tolerations-pod.yaml
内置污点
Kubernetes 提供了一些内置污点:
DaemonSet 自动容忍
DaemonSet 的 Pod 自动容忍所有污点:
Master 节点隔离
默认污点
Master 节点默认有污点,防止用户 Pod 调度到 Master:
自定义 Master 污点
常见问题
Pod 仍然调度到污点节点
污点与亲和性冲突
NoExecute 驱逐问题
最佳实践
1. 使用有意义的键名
2. 配合节点标签使用
3. 合理设置 NoExecute 容忍时间
4. 记录污点用途
污点 vs 亲和性
延伸思考
污点和容忍是 Kubernetes 资源隔离的重要机制:
- 节点专用化:让特定节点运行特定工作负载
- 故障隔离:防止不稳定 Pod 影响核心组件
- 成本优化:利用 Spot/Preemptible 节点
但也要避免滥用:
- 过多的污点:可能导致调度困难
- 复杂的容忍:增加运维复杂度
- 忽视 NoExecute:可能导致意外驱逐
延伸阅读
- 调度策略与亲和性:亲和性机制
- Kubernetes 调度器原理:调度器内部
- Node 组件:节点管理