污点和容忍度

污点(Taint)和容忍度(Toleration)的机制是,当节点被标记了污点,只有那些容忍这些污点的Pod才可以被调度到该节点(对于已经运行的Pod,则可能被驱逐)。

污点有三个效果(effect):

  • NoSchedule:不会调度新的Pod到该节点(已运行的Pod不受影响)。

  • PreferNoSchedule:尽量避免调度新的Pod到该节点(已运行的Pod不受影响)。

  • NoExecute:不会调度新的Pod到该节点,并且会驱逐节点上已运行但不能容忍该污点的Pod。

污点效果对调度的影响对运行中Pod的影响
NoExecute 阻止调度 + 驱逐现有Pod 立即驱逐不容忍的Pod
NoSchedule 阻止调度 不驱逐现有Pod
PreferNoSchedule 尽量避免调度 不驱逐现有Pod

所以,回到你的问题:如果Pod设置了容忍度来容忍标记有NoExecute污点的节点,那么Pod将不会被该污点驱逐(除非设置了tolerationSeconds且超时)。这意味着Pod可以继续在该节点上运行,即使节点被标记了NoExecute污点。

注意:一个节点可以有多个污点,Pod需要容忍节点上的所有污点(或者至少是效果为NoExecute的污点)才能不被驱逐。如果Pod只容忍了部分污点,那么那些未被容忍的NoExecute污点仍然会导致Pod被驱逐。

另外,系统默认会为节点添加一些污点,例如node.kubernetes.io/not-readynode.kubernetes.io/unreachable,效果为`NoExecute。如果你希望Pod能够容忍节点故障(例如节点未就绪或无法访问)而不被立即驱逐,你可以为Pod添加对这些污点的容忍度。

tolerationSeconds 的作用

这是一个可选字段,用于设置容忍的时间限制:

  • 不设置 tolerationSeconds:Pod 将无限期容忍该污点,永远不会被驱逐

  • 设置 tolerationSeconds: 3600:Pod 在污点添加后,会在节点上继续运行 3600 秒(1小时),然后被驱逐

  1. NoSchedule:只影响调度过程,即不会将新的Pod调度到该节点上,但不会影响已经在该节点上运行的Pod。

  2. NoExecute:既影响调度(与NoSchedule类似,不会调度新的Pod),也会影响已经运行的Pod:如果Pod不能容忍NoExecute污点,则会被驱逐(即从节点上删除)。

情况1:Pod容忍度是NoSchedule,节点污点是PreferNoSchedule

  • 节点污点效果为 PreferNoSchedule:这意味着调度器会尽量避免将Pod调度到该节点,但不是强制性的。如果Pod没有容忍这个污点,调度器会尽量避免,但如果其他节点资源不足,仍然可能调度。

  • Pod的容忍度效果是 NoSchedule:这表示Pod可以容忍效果为 NoSchedule 的污点。

注意:容忍度的效果(effect)必须与污点的效果相匹配(或者使用 effect: "" 来匹配所有效果),否则容忍度不会生效。

因此,对于情况1:

  • 节点污点是 PreferNoSchedule,而Pod的容忍度是 NoSchedule,两者效果不匹配。

  • 所以,Pod不会容忍这个污点,调度器会按照 PreferNoSchedule 的语义处理:尽量避免调度,但如果没有其他可用节点,仍可能调度。

情况2:Pod容忍度是NoExecute,节点污点是NoSchedule

  • 节点污点效果为 NoSchedule:这只会影响调度,即如果Pod没有容忍这个污点,则不会被调度到该节点(强制性的)。

  • Pod的容忍度效果是 NoExecute:这表示Pod可以容忍效果为 NoExecute 的污点。

同样,效果不匹配。所以Pod不会容忍这个污点,因此调度器不会将Pod调度到该节点(因为节点有 NoSchedule 污点,而Pod没有容忍 NoSchedule 效果)。

 

情况2:Pod容忍度是NoExecute,节点污点是NoSchedule

  • 节点污点效果为 NoSchedule:这只会影响调度,即如果Pod没有容忍这个污点,则不会被调度到该节点(强制性的)。

  • Pod的容忍度效果是 NoExecute:这表示Pod可以容忍效果为 NoExecute 的污点。

同样,效果不匹配。所以Pod不会容忍这个污点,因此调度器不会将Pod调度到该节点(因为节点有 NoSchedule 污点,而Pod没有容忍 NoSchedule 效果)。

Effect类型调度行为运行时行为适用场景
NoSchedule 不允许新 Pod 调度到该节点(除非有对应的容忍度) 不影响已经在节点上运行的 Pod 用于保护特定节点资源,如 GPU 节点、特殊硬件节点等
PreferNoSchedule 尽量不调度新 Pod 到该节点,但不是强制性的 不影响已经在节点上运行的 Pod 用于非强制性的调度偏好,例如节点资源利用率较高时
NoExecute 不允许新 Pod 调度到该节点 会驱逐已经在节点上运行但没有对应容忍度的 Pod 用于节点维护、资源回收、节点状态异常等情况

总结规则

  • 容忍度与污点的匹配要求:

    • 键(key)相同

    • 操作符(operator)能够匹配值(value)

    • 效果(effect)相同(或者容忍度的效果为空,表示匹配所有效果

posted @ 2025-11-10 14:35  滴滴滴  阅读(4)  评论(0)    收藏  举报