Kubernetes的污点和容忍(上篇) - 编程一生

Kubernetes的污点和容忍(上篇) - 编程一生

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

Kubernetes中,污点使节点排斥Pod,容忍使Pod可调度到带污点的节点。匹配需key和effect相同,operator为Exists或Equal且value相同;空key加Exists可容忍所有污点。effect包括NoSchedule、PreferNoSchedule和NoExecute,其中NoExecute可驱逐Pod,容忍可通过tolerationSeconds延迟驱逐。

🔎

延伸解读

污点与容忍的匹配逻辑

污点与容忍的匹配需要key和effect相同,并且operator为Exists(不指定value)或Equal且value相同。空key加Exists可容忍所有污点,空effect则匹配指定key的所有effect。这种设计让调度器能灵活控制Pod与节点的适配关系。

三种effect的实际影响

NoSchedule会阻止新Pod调度到节点;PreferNoSchedule是软性偏好,调度器尽量避免但不强制;NoExecute会驱逐节点上已运行且不容忍该污点的Pod。理解这些差异有助于在节点维护或故障隔离时选择合适策略。

NoExecute与tolerationSeconds的驱逐延迟

当节点添加NoExecute污点时,不容忍的Pod会被立即驱逐。但容忍规则可设置tolerationSeconds,让Pod在污点添加后继续运行指定秒数再被驱逐。若期间污点被移除,Pod则不会被驱逐,这为优雅终止提供了缓冲。

❓

Q&A

Kubernetes中污点和容忍的作用是什么?

污点允许节点排斥一组Pod,容忍则允许Pod被调度到带有相应污点的节点上。它们协作确保Pod不被调度到不合适的节点。

如何给节点添加和删除污点?

使用kubectl taint命令添加污点,例如:kubectl taint nodes node1 key=value:NoSchedule。删除污点则在命令末尾加减号,例如:kubectl taint nodes node1 key=value:NoSchedule-。

污点的effect有哪些类型?分别有什么含义?

effect有三种:NoSchedule(除非有容忍,否则不调度Pod到该节点)、PreferNoSchedule(尽量不调度,但非强制)、NoExecute(不能容忍的Pod会被驱逐,且新Pod不会被调度)。

Pod的容忍如何匹配节点的污点?

匹配条件:key相同、effect相同,且operator为Exists(此时不指定value)或operator为Equal且value相同。空key加Exists可容忍所有污点;空effect匹配所有effect。

NoExecute污点的tolerationSeconds有什么作用?

tolerationSeconds用于指定Pod在带有NoExecute污点的节点上可以继续运行的时间(秒)。超过该时间后Pod会被驱逐,如果期间污点被移除,则Pod不会被驱逐。

当节点有多个污点、Pod有多个容忍时,调度器如何处理?

调度器会过滤掉Pod能容忍的污点,剩余污点若包含NoSchedule则Pod不会被调度;若只有PreferNoSchedule则尽量不调度;若包含NoExecute则已运行的Pod会被驱逐,新Pod不会被调度。

🏷️

标签

➡️

继续阅读