
一、什么是污点
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需要手动进行删除。






暂无评论内容