污点与容忍是什么
污点是节点上的一段声明,表示「不希望某类对象被调度到这里」;容忍是对象上的一段声明,表示「我可以接受这个污点」。两者配合使用:节点打上污点后,只有带上对应容忍的对象才能被调度上去,其余对象会被挡在外面。这是把特定设备或特殊规格节点留给指定业务的标准做法。
容忍只代表可以被调度
关键区别在于容忍是「准入」而不是「定向」:带上容忍只说明这个对象允许落到该节点,并不保证它会去那里。想让业务真正落在特定节点上,还要配合节点选择器或亲和规则,两者组合使用才能同时达到「别人进不来」和「自己一定去」的效果。
基本信息
| 适用环境 | 任何 Kubernetes 发行版 |
|---|---|
| 作用对象 | 污点打在节点上,容忍写在对象模板里 |
| 效果类型 | 分不影响调度、尽量不调度与不可调度三种 |
| 匹配方式 | 按键值对匹配,或按键是否存在匹配 |
| 与亲和的区别 | 污点是节点拒绝,亲和是对象挑选,方向相反 |
| 典型用途 | 专用节点隔离、特殊硬件保留、独占资源 |
典型使用场景
- 专用节点:把带特殊硬件的节点留给需要的业务,其他服务不得占用
- 独占资源:为授权类业务保留节点,避免与普通负载争抢
- 节点维护前:临时阻止新对象调度到待维护的机器上
- 系统组件隔离:控制面节点默认带污点,只允许系统组件与显式容忍的业务
- 成本分层:把不同规格节点分配给不同优先级的服务
- 分批调度:对目标节点打上污点,逐步放行新版本实例
给节点打污点
给节点打污点
kubectl taint nodes node-1 dedicated=gpu:NoSchedule # 打上专用污点
kubectl taint nodes node-1 dedicated=gpu:NoSchedule- # 末尾加减号即移除
kubectl describe node node-1 | grep -i taints # 核对现有污点
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints对象上的容忍
对象上的容忍
spec:
tolerations:
- key: dedicated
operator: Equal
value: gpu
effect: NoSchedule
nodeSelector: # 配合选择器才能真正定向
node-pool: gpu效果类型对比
| 效果 | 含义 | 适用场景 |
|---|---|---|
| 不可调度 | 不允许新的对象调度上来 | 常用,隔离专用节点 |
| 尽量不调度 | 尽量避开,必要时仍可上去 | 软性偏好场景 |
| 不可执行 | 已在节点上的对象也要被驱逐 | 节点下线或故障处理 |
容忍只影响能否被调度,不能把对象定向到某个节点;需要定向要额外配置节点选择器或亲和规则。
给节点打上污点后,部署在该节点上的系统组件如果没有对应容忍,也会被一起挡在外面,操作前先确认影响范围。