一、什么是污点¶
Taint作用在节点上,能够使节点排斥一类特定的Pod,也就是不能“兼容”该节点的污点的Pod。
注意:一个节点可以部署多个污点!!!
二、污点出现背景¶
之所以出现污点,是因为要避免Pod被分配到不合适的节点,比如有一批GPU服务器只能部署要使用GPU的Pod。每个节点上都可以应用一个或多个Taint,这表示对于那些不能容忍这些Taint的Pod是不能部署在该服务器上的。如果Pod配置了Toleration,则表示这些Pod可以被调度到设置了Taint的节点上,当然没有设置Taint的节点也是可以部署的。
三、污点使用场景¶
污点使用场景如下:
- 节点维护:主动添加污点,优雅驱逐 Pod。
- 资源隔离:通过污点限制特殊资源节点的访问。
- 故障隔离:自动/手动污点隔离异常节点,保障服务可用性。
- 故障恢复:移除污点,恢复节点正常调度。
污点机制结合容忍(Toleration)和亲和性(Affinity),可实现集群资源的精细化控制与高可用性。
污点一般用于调度Pod部署的节点,常用调度场景如下:
- Pod不能部署在Master节点上
- 某个节点需要维护/升级,需要将该节点上的Pod迁移到其他节点
- GPU的Pod只能部署在GPU服务器上
- Pod不能部署在没有完成可用性测试的节点上
四、污点种类¶
污点分为外置污点和内置污点,主要说明如下:
- 外置污点:人工使用Taint命令给节点打上的污点
- 内置污点:系统自带的污点
当某种条件为真时,节点控制器会自动给节点添加一个污点。当前内置的污点包括:
node.kubernetes.io/not-ready:节点未准备好。这相当于节点状况Ready的值为 "False"。- 触发条件:节点状态为
NotReady(如 kubelet 无响应、节点故障)。 - 效果(Effect):
NoExecute - 行为:驱逐节点上未配置容忍的 Pod,并阻止新 Pod 调度到该节点。
node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状况Ready的值为 "Unknown"。- 触发条件:节点无法被 API Server 访问(如网络分区)。
- 效果:
NoExecute - 行为:立即驱逐现有 Pod,禁止新 Pod 调度。
node.kubernetes.io/out-of-disk:节点磁盘耗尽- 触发条件:节点磁盘空间不足。
- 效果:
NoSchedule - 行为:阻止新 Pod 调度到该节点,但不驱逐现有 Pod。
node.kubernetes.io/memory-pressure:节点存在内存压力。- 触发条件:节点内存资源紧张。
- 效果:
NoSchedule - 行为:禁止调度新 Pod,优先释放资源。
node.kubernetes.io/disk-pressure:节点存在磁盘压力。- 触发条件:节点磁盘 I/O 压力大或剩余空间不足。
- 效果:
NoSchedule - 行为:阻止新 Pod 调度到该节点。
node.kubernetes.io/pid-pressure: 节点的 PID 压力。- 触发条件:节点的 PID 压力大
- 效果:
NoSchedule - 行为:阻止新 Pod 调度到该节点。
node.kubernetes.io/network-unavailable:节点网络不可用。- 触发条件:节点网络不可用(如网卡故障)。
- 效果:
NoSchedule - 行为:禁止调度需要网络的 Pod。
node.kubernetes.io/unschedulable: 节点不可调度。- 触发条件:手动标记节点为不可调度(如
kubectl cordon)。 - 效果:
NoSchedule - 行为:阻止新 Pod 调度,但现有 Pod 不受影响。
node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。- 触发条件:节点由云提供商创建但尚未完成初始化。
- 效果:
NoSchedule - 行为:防止 Pod 调度到未就绪的云节点。
在节点被驱逐时,节点控制器或者 kubelet 会添加带有 NoExecute 效果的相关污点。 如果异常状态恢复正常,kubelet 或节点控制器能够移除相关的污点。但是被驱逐的Pod需要手动进行删除。