【Kubernetes 网络深度系列】nodeSelector 与节点放置:Filter、亲和性与拓扑打散
内容提要
本文介绍Kubernetes调度机制,解释Pod为何Pending。核心内容:nodeSelector、nodeAffinity、污点容忍和拓扑打散四类约束各自解决不同问题,分别在调度器的Filter和Score阶段起作用。常见坑包括:标签写对但仍有污点未容忍、硬约束叠加过多、误用软偏好等。排障应先看FailedScheduling事件,确认节点标签、污点和资源容量。
延伸解读
标签匹配与污点过滤是两条独立否决链
很多 Pod 卡在 Pending,是因为只检查了 nodeSelector 是否匹配,却忽略了节点上的污点。即使标签完全正确,只要节点带有 NoSchedule 污点而 Pod 没有对应 toleration,调度器依然会在 Filter 阶段否决该节点。排障时务必同时检查标签和污点,两者缺一不可。
软偏好不保证落点,别当硬约束用
preferredDuringScheduling 只在 Score 阶段影响节点排名,不会因不满足而阻止调度。如果依赖软偏好实现关键放置,可能发现 Pod 落在不符合预期的节点上。Cluster Autoscaler 对软约束的模拟也不完整,扩容时可能忽略这些偏好。关键场景应使用硬约束或专用节点池。
硬约束叠加过多,可行域可能被裁空
nodeSelector、required affinity、拓扑打散(DoNotSchedule)等硬约束会层层过滤节点。如果同时叠加多个硬约束,可能导致没有任何节点满足所有条件,Pod 一直 Pending。设计调度策略时,应权衡硬约束的严格性与集群资源的可用性,避免过度约束。
Q&A
Kubernetes中Pod一直Pending,事件显示0/N nodes are available,可能是什么原因?
可能原因包括:节点标签不匹配(nodeSelector或nodeAffinity硬约束)、节点有污点而Pod没有对应容忍、节点资源不足(CPU/内存/扩展资源)、拓扑打散约束不满足等。建议先用kubectl describe pod查看FailedScheduling事件,再检查节点标签、污点和资源容量。
nodeSelector和nodeAffinity有什么区别?
nodeSelector是简单的硬约束,要求节点必须包含所有指定的标签键值对。nodeAffinity功能更强大,支持硬约束(required)和软偏好(preferred),并支持In、NotIn、Exists等操作符,以及多条件组合。两者同时指定时,必须都满足才能调度。
Kubernetes中污点(Taint)和容忍(Toleration)的作用是什么?
污点用于标记节点,使其排斥某些Pod;容忍允许Pod声明可以忍受这些污点。污点有三种效果:NoSchedule(不调度)、PreferNoSchedule(尽量不调度)、NoExecute(不调度且驱逐已运行Pod)。常用于专用节点、GPU节点等场景。
拓扑打散约束(topologySpreadConstraints)解决什么问题?
拓扑打散约束用于将Pod均匀分布在不同拓扑域(如可用区、主机)中,以降低故障影响面。它根据已有Pod的分布情况,通过maxSkew等参数控制分布均匀度,可设为硬约束(DoNotSchedule)或软约束(ScheduleAnyway)。
为什么标签写对了Pod仍然Pending?
可能原因包括:节点有污点但Pod没有容忍、资源不足、拓扑打散约束不满足、nodeSelector与nodeAffinity同时要求但节点不满足全部条件、软偏好被误用为硬约束等。需要结合FailedScheduling事件和节点状态综合判断。
Kubernetes调度器中的Filter和Score阶段分别做什么?
Filter阶段(预选)过滤掉不满足硬约束的节点,如nodeSelector、required nodeAffinity、污点容忍、资源充足性等。Score阶段(优选)对通过过滤的节点打分,考虑软偏好(如preferred nodeAffinity)、资源分配等,选择得分最高的节点。
使用nodeSelector时有哪些常见坑?
常见坑包括:将污点误认为标签(污点不会自动生成标签)、nodeSelector与required affinity叠加过死、依赖可被kubelet修改的标签做隔离、手写spec.nodeName绕过调度器、将软偏好(preferred)当作硬约束使用、忽略IgnoredDuringExecution导致标签变更后Pod不迁移。
Cluster Autoscaler对软约束(preferred)支持不完整,运维上应该注意什么?
Cluster Autoscaler在模拟调度时通常只考虑Filter阶段的硬约束,preferred nodeAffinity等软约束在Score阶段,可能不被CA完整考虑。因此,如果依赖CA扩容,关键放置需求应使用硬约束或专用节点池,而不是仅依赖软偏好权重。