一、什么是污点

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需要手动进行删除。