Kubernetes中1节点1Pod部署异常:节点未自动扩容排查求助
嘿,咱们来一步步拆解你遇到的问题——Pod全挤在一个节点、节点自动扩缩容没触发,这俩其实是连锁反应:现有配置没强制Pod分散,调度器觉得单个节点能装下所有Pod,自然不会触发节点扩容。下面说你漏掉的关键配置和调整方向:
1. Pod反亲和性只是“建议”,不是“强制”
你现在用的preferredDuringSchedulingIgnoredDuringExecution类型的反亲和性,说白了就是告诉调度器“尽量把Pod分散开”,但如果目标节点(那2个打了namespace=A标签的节点)资源还够,调度器完全可以把所有Pod都塞到同一个节点里,压根不会理这个“建议”。
要真的强制Pod分散到不同节点,得把反亲和性改成requiredDuringSchedulingIgnoredDuringExecution,不过这里要踩个坑:如果你的StatefulSet副本数超过了现有可用节点数(比如你有2个A节点,副本数设成3),这种强制约束会导致多余的Pod调度失败——不过这也正好是触发节点自动扩缩容的前提。
调整后的反亲和性配置大概是这样:
podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - prometheus topologyKey: kubernetes.io/hostname
2. 用拓扑分布约束实现更灵活的均匀分布
其实Kubernetes 1.19之后有个更适合的特性——Pod拓扑分布约束,它专门用来控制Pod在节点、可用区这类拓扑域上的均匀分布,比反亲和性灵活多了,还能避免反亲和性在副本数超节点数时的调度阻塞问题。
你可以在Pod模板里加这么一段配置,让prometheus Pod在节点维度上尽量均匀分布,最多允许两个节点的Pod数量差1个:
topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: prometheus
maxSkew:1:意思是任意两个节点上的Pod数量差不能超过1whenUnsatisfiable: DoNotSchedule:如果没法满足均匀分布,就先不调度这个Pod——这时候如果现有节点都满了,Cluster Autoscaler就会自动扩容新节点了- 要是你不想太强硬,也可以把
whenUnsatisfiable改成ScheduleAnyway,让调度器尽量满足但不强制
3. 节点自动扩缩容的触发逻辑你得搞懂
Cluster Autoscaler(CA)可不是随便就扩容的,它只有在有Pending状态的Pod(也就是调度器找不到合适节点放Pod)的时候才会触发。你现在的Pod都能塞进一个节点,说明这个节点的CPU、内存还剩不少,CA当然不会动。
要让CA触发,得满足这俩条件:
- 你的Pod的
resources.requests配置要合理(你现在设的100m CPU/200Mi内存没问题,但如果节点本身资源特别大,比如4核8G,那能装好多Pod,自然不会触发扩容) - 当Pod数量增加到现有节点没法均匀容纳(结合上面的拓扑约束或反亲和性),出现Pending Pod时,CA才会扩容节点——注意哦,扩容出来的节点必须带有
namespace=A标签,不然节点亲和性会拒绝调度,所以你得确保节点池的配置里会自动给新节点打这个标签
4. 别搞混Pod扩缩容和节点扩缩容
你说“随需求自动扩容”,这里得分清楚Pod自动扩缩容(HPA)和节点自动扩缩容(CA):
- CA是帮你加节点的
- HPA是帮你加Pod副本数的
如果想让Pod数量跟着需求涨,得配置HorizontalPodAutoscaler(HPA)来自动调整StatefulSet的副本数,当副本数多到现有节点没法均匀放下时,再触发CA扩容节点。
给你个HPA的配置示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: prometheus-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: StatefulSet name: prometheus minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 75
最后给你理个调整步骤
- 把Pod反亲和性改成
required类型,或者直接用拓扑分布约束,强制Pod分散到不同节点 - 配置拓扑分布约束,让Pod在节点上均匀分布
- 配好HPA,让Pod数量能随需求自动增加
- 检查Cluster Autoscaler的配置:确保节点池能扩容出带
namespace=A标签的节点,并且CA能正常检测Pending Pod
内容的提问来源于stack exchange,提问作者Olahzzz

