污点和容忍度
污点(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-ready和node.kubernetes.io/unreachable,效果为`NoExecute。如果你希望Pod能够容忍节点故障(例如节点未就绪或无法访问)而不被立即驱逐,你可以为Pod添加对这些污点的容忍度。
tolerationSeconds 的作用
这是一个可选字段,用于设置容忍的时间限制:
-
不设置
tolerationSeconds:Pod 将无限期容忍该污点,永远不会被驱逐 -
设置
tolerationSeconds: 3600:Pod 在污点添加后,会在节点上继续运行 3600 秒(1小时),然后被驱逐
-
NoSchedule:只影响调度过程,即不会将新的Pod调度到该节点上,但不会影响已经在该节点上运行的Pod。
-
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)相同(或者容忍度的效果为空,表示匹配所有效果
-
-
浙公网安备 33010602011771号