概述
官方文档:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/taint-and-toleration/
污点是作用在k8s集群节点上的(包括worker和master),Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。
污点类似于Label标签,但是污点是在节点上的。定义的语法结构也有点类似,但也存在一定区别
学习Label标签可以阅读这篇文章:K8s新手系列之Label标签和Label选择器
污点的组成结构
一个污点由以下三部分组成:
- key:污点的键(自定义,如 node-type)。
- value:污点的值(可选,如 special)。
- effect:污点的效果,决定 Pod 如何被影响,可选值:
- PreferNoSchedule:尽量避免 Pod 调度到该节点(非强制,调度器会尝试寻找其他节点,但若没有合适节点仍会调度)。
- NoSchedule:禁止 Pod 调度到该节点(除非 Pod 有对应的容忍)。
- NoExecute:不仅禁止调度,还会驱逐已存在的不满足容忍的 Pod(适用于节点维护、故障处理等场景)。
污点的作用
污点(Taint) 是一种节点级别的属性,用于 阻止特定 Pod 调度到节点,或使节点对 Pod 具有 “排斥性”。它通常与 容忍度(Toleration) 配合使用,实现更精细的资源调度策略。以下是污点的核心作用、应用场景和工作机制
隔离节点
将节点标记为特定用途(如专用节点、性能节点),阻止普通 Pod 调度到该节点,确保关键业务独占资源。
例如:将 GPU 节点、高内存节点标记为污点,仅允许特定业务的 Pod(如机器学习任务、数据库)通过容忍度调度至此。
驱逐非预期 Pod
通过 NoExecute 类型的污点,可强制驱逐节点上 不匹配容忍度的现有 Pod,常用于节点维护、升级或故障处理。
例如:节点需要重启时,添加 NoExecute 污点,驱逐所有不兼容的 Pod 到其他节点。
实现分层调度策略
结合容忍度,实现 “节点分组 + Pod 定向调度” 的分层管理,避免资源混用导致的性能干扰或安全问题。
例如:区分开发、测试、生产环境节点,通过污点限制不同环境的 Pod 只能调度到对应节点。
K8s集群中默认存在的污点
在 Kubernetes(K8s)集群中,控制平面节点(如 Master 节点)通常会自动添加默认污点,以避免普通业务 Pod 调度到这些节点,确保控制平面组件(如 API Server、Scheduler、Controller Manager 等)的资源不受干扰。
<ul>node-role.kubernetes.io/control-plane:NoSchedule
- 该污点阻止普通 Pod 调度到控制平面节点,但允许 K8s 系统组件(如 kube-apiserver、etcd)的 Pod 运行。
- 因为控制平面节点需专注于处理集群管理任务,普通业务 Pod(如 Web 服务、数据库)不应占用其资源。
node.kubernetes.io/not-ready:NoExecute
- 该污点是一个动态污点,由 K8s 自动管理的临时污点,当节点处于 NotReady 状态(如网络故障、节点失联)时自动添加,用于驱逐该节点上的 Pod。当节点恢复正常后,该污点会自动移除。
node.kubernetes.io/unreachable:NoExecute
- 该污点是一个动态污点,当节点与控制平面(API Server)失联(如网络分区、节点故障),且超过 pod-eviction-timeout(默认 5 分钟)时,节点会被标记为 Unreachable,并自动添加此污点。
- 当节点恢复通信,污点会自动移除,已调度到其他节点的 Pod 不会回迁。
node.kubernetes.io/out-of-disk:NoExecute
<ul>
该污点是一个动态污点,节点磁盘使用率超过阈值(如 kubelet 参数 --eviction-hard 配置的memory.available |