K8s污点与容忍怎么配:让Pod避开特定节点的实操方法
K8s污点与容忍怎么配:让Pod避开特定节点的实操方法
Kubernetes 的污点(Taint)和容忍(Toleration)是控制 Pod 能否调度到某个节点的机制。
简单说,节点打上污点表示“这里不欢迎普通 Pod”,Pod 声明对应容忍表示“我可以接受这个条件”。
它常用于把专用节点留给特定业务、隔离故障节点或在维护前阻止新 Pod 进入。
本文面向零基础用户,用 kubectl 命令演示完整操作流程。
你需要一个可用的 K8s 集群(版本差异不影响基本命令),以及具备操作节点和 Pod 的权限。
先理解污点的三个效果和容忍的匹配规则
一个污点由三部分组成:key、value、effect。
effect 决定 Pod 不匹配时的行为:
- NoSchedule:新 Pod 不会调度到该节点,已运行的 Pod 不受影响。
- PreferNoSchedule:调度器尽量不往该节点放,但没有其他选择时仍可能调度。
- NoExecute:不仅阻止新 Pod,还会驱逐节点上不容忍该污点的已有 Pod。
容忍写在 Pod 的 spec.tolerations 中,需要匹配污点的 key、value 和 effect。
operator 为 Equal 时要求 value 一致,为 Exists 时只要求 key 存在。
effect 留空表示匹配所有 effect。
查看节点已有的污点
先确认目标节点当前状态,避免重复添加或误删:
kubectl describe node <节点名> | grep Taints
输出类似 Taints: node-role.kubernetes.io/control-plane:NoSchedule。
如果显示 ,说明该节点没有污点。
给节点添加、修改和删除污点
添加一个 NoSchedule 污点,key 为 dedicated,value 为 gpu:
kubectl taint nodes <节点名> dedicated=gpu:NoSchedule
如果只想用 key 标记,不指定 value:
kubectl taint nodes <节点名> dedicated:NoSchedule
删除污点时在末尾加一个减号,注意 key、value、effect 要和添加时完全一致:
kubectl taint nodes <节点名> dedicated=gpu:NoSchedule-
修改污点没有直接命令,通常先删除旧污点再添加新污点。
操作前建议记录原污点内容,便于回滚。
在 Pod 中声明容忍
以下 YAML 片段声明了一个容忍,匹配上面添加的污点:
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
如果只按 key 匹配,可以用 Exists:
tolerations:
- key: "dedicated"
operator: "Exists"
effect: "NoSchedule"
要让 Pod 容忍节点上所有污点,可以省略 key 并使用 Exists:
tolerations:
- operator: "Exists"
这种写法适合临时排错,不建议在生产环境中长期使用。
操作后的验证和常见调度失败排查
应用配置后,确认 Pod 是否调度到预期节点:
kubectl get pod -o wide
查看 Pod 的调度事件,定位失败原因:
kubectl describe pod | grep -A 10 Events
如果事件中出现 untolerated taint,说明容忍没有匹配上污点。
逐项核对 key、value、effect 拼写和大小写,尤其是 effect 必须完全一致。
如果节点被标记为不可调度(node.kubernetes.io/unschedulable),
那是 cordon 操作产生的,
不是普通污点,
需要用 kubectl uncordon <节点名> 恢复。
另外注意,污点和容忍只影响调度决策,不改变资源配额、亲和性等其他约束。
Pod 不调度时,要同时检查节点资源是否足够、是否有 nodeSelector 或亲和性冲突。
使用时的几个注意点
- 给节点加 NoExecute 污点前,先确认节点上运行的 Pod 是否都声明了容忍,否则它们会被驱逐。
- 生产环境修改污点前建议先在小范围节点验证,并保留回滚命令。
- 容忍只是允许调度,不保证一定调度到该节点。如果希望 Pod 优先或必须去某个节点,还需要配合 nodeSelector 或 nodeAffinity。
- 删除污点时如果参数写错,命令会报错而不是静默失败,按提示核对即可。
掌握污点与容忍的配置和验证方法后,你可以更精确地控制 Pod 落在哪些节点上。
遇到调度异常时,优先用 describe 查看事件,再逐项比对污点和容忍的字段。