taint 命令做什么
kubectl taint 给节点打污点,配合 Pod 的 tolerations 实现「把某些 Pod 赶走或挡在外面」的调度控制。三种 effect 强度不同:NoSchedule 只阻止新 Pod 调度上来,已经在跑的 Pod 不受影响;PreferNoSchedule 是软性倾向;NoExecute 会驱逐节点上不容忍该污点的既有 Pod。移除污点的写法是在同一个表达式后追加连字符,表达式必须与原污点完全一致。
三种 effect 的差别
| effect | 对已有 Pod | 对新 Pod | 典型用途 |
|---|---|---|---|
| NoSchedule | 不影响 | 不容忍则不调度 | 节点维护前阻止新副本落上来 |
| PreferNoSchedule | 不影响 | 尽量不调度,但可被挤上来 | 弱隔离,允许作为兜底位置 |
| NoExecute | 驱逐不容忍的 Pod | 不容忍则不调度 | 彻底腾空节点,常用于下线与专用节点 |
典型使用场景
- 节点维护:先打 NoSchedule 阻止新副本上来,再按计划排水,影响面可控
- 专用节点:给 GPU 或高内存机器打污点,只让带对应容忍的业务使用
- 故障隔离:节点出现硬件问题时打 NoExecute 把 Pod 赶到其他节点
- 批次区分:为不同业务线划分节点池,用污点与容忍实现隔离
- 恢复开放:维护结束移除污点,节点重新参与正常调度
添加与移除
添加与移除
kubectl taint nodes node1 maintenance=true:NoSchedule # 添加污点
kubectl describe node node1 | grep -i -A2 taints # 复核当前污点列表
kubectl taint nodes node1 maintenance=true:NoSchedule- # 移除:末尾加连字符
kubectl taint nodes node1 dedicated- # 按 key 移除(不带 value 与 effect)
kubectl get pods -A -o wide --field-selector spec.nodeName=node1 # 看该节点上有哪些 Pod节点污点读法
| 观察点 | 含义 | 注意 |
|---|---|---|
| key=value:effect | 污点完整表达式 | 移除时必须逐字一致 |
| Taints 列表 | 节点当前全部污点 | 系统组件也会自动打污点 |
| Tolerations | Pod 的容忍声明 | 声明了容忍才允许落在该节点上 |
| Evicted 事件 | NoExecute 造成的驱逐 | 驱逐由节点侧执行,事件里能看到原因 |
给承载业务的节点打 NoExecute 污点会立刻驱逐不容忍的 Pod,可用容量同步下降。动手前先确认副本冗余与其他节点余量,并检查关键服务的 PodDisruptionBudget,避免一次性削减过多副本。
节点还有一类由系统自动维护的污点,例如未就绪或网络未就绪时打上的标记。日常看到的污点未必是人工添加的,清理前先确认来源,误删系统污点会让节点提前承接流量。