内容提要
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不会被调度。