AKS集群Pod均调度至同一节点,如何实现跨节点均衡调度?
解决多Deployment Pod跨节点均衡分布问题及集群排查方向
一、集群可能存在的问题排查
- 节点亲和性/污点容忍配置异常:检查所有Deployment的Pod模板,是否统一配置了指向某一节点的
nodeAffinity,或者所有Pod都添加了针对某节点污点的tolerations(比如控制节点的污点),导致调度器只能选择该节点。执行kubectl get deployment <deploy-name> -o yaml查看spec.template.spec.affinity和tolerations字段。 - 节点可分配资源差异过大:两个节点的
allocatable资源(尤其是内存)可能差距明显,调度器会优先选择资源更充足的节点。执行kubectl describe node <node-name>查看Allocatable和Capacity字段,同时检查kubelet的资源预留参数(--kube-reserved、--system-reserved)是否配置不均。 - 调度器策略配置问题:默认调度器的
SpreadPriority插件被禁用,或者NodeResourcesFit插件权重过高,导致调度器优先选择资源充足的节点而非均衡分布。检查调度器配置(如果是kubeadm部署,查看kube-scheduler的ConfigMap),确认PodSpreadPriority是否启用,以及各插件的权重设置。 - Pod资源请求配置不合理:所有Pod的内存请求值设置过高,导致其中一个节点的可分配资源无法容纳多个Pod的请求总和,只能集中调度到另一个节点。检查Pod模板的
resources.requests.memory字段,对比节点的可分配内存计算是否存在这个问题。
二、实现Pod跨节点均衡分布的方法
- 配置全局Pod反亲和性:给所有Deployment的Pod添加一个统一标签(比如
app-group: shared-services),然后配置Pod反亲和性规则,让调度器优先将同组Pod打散到不同节点。示例配置:
apiVersion: apps/v1 kind: Deployment metadata: name: example-deploy spec: replicas: 1 template: metadata: labels: app: example app-group: shared-services # 统一标签 spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app-group: shared-services topologyKey: kubernetes.io/hostname # 按节点hostname打散 containers: - name: example-container image: nginx resources: requests: memory: "256Mi" limits: memory: "512Mi"
- 调整调度器均衡策略:启用
NodeResourcesBalancedAllocation插件,该插件会优先选择CPU和内存使用率更均衡的节点;同时调高PodSpreadPriority的权重,让调度器更倾向于分散Pod。修改调度器ConfigMap后重启kube-scheduler生效。 - 手动触发Pod重调度:对负载过高的节点执行
kubectl drain <node-name> --ignore-daemonsets(临时驱逐所有Pod,让Deployment重建时重新调度),或者直接删除集中在该节点的Pod:kubectl delete pod -n <namespace> -l <pod-label>,注意操作前确保业务有高可用能力。 - 均衡节点可分配资源:调整两个节点的kubelet资源预留参数,让它们的
allocatable内存、CPU尽量一致,消除调度器的资源倾斜选择倾向。
内容的提问来源于stack exchange,提问作者Manish Bansal
相关产品推荐
相关产品推荐

