如何配置Deployment让kube-scheduler将Pod调度至负载较低的节点?
如何让Deployment将Pod调度到低负载节点?
针对你的集群节点负载不均、节点动态删创的情况,可以通过以下几种方式实现需求:
1. 先给Pod配置资源请求/限制
Kubernetes默认调度器是基于Pod的resources.requests来计算节点剩余资源的,如果你的Pod没设置这个,调度器根本没法判断节点负载高低。所以先给Deployment的Pod模板加上资源配置:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app-deployment spec: template: spec: containers: - name: your-app-container image: your-image:latest resources: requests: cpu: "100m" # 根据实际Pod资源消耗调整 memory: "256Mi" limits: cpu: "500m" memory: "512Mi"
配置后,调度器会优先把新Pod调度到剩余资源(总资源-已分配请求)更多的节点,也就是负载更低的那些。
2. 调整默认调度器的评分逻辑
如果默认调度的效果不够理想,可以修改kube-scheduler的配置,让它更偏向选择低负载节点。比如调整资源相关评分插件的权重:
apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler plugins: score: enabled: - name: NodeResourcesFit weight: 2 # 优先选择剩余资源多的节点 - name: NodeResourcesBalancedAllocation weight: 3 # 优先选择CPU/内存负载均衡的节点
调高NodeResourcesBalancedAllocation的权重,调度器会更倾向于选择资源使用率更均衡的低负载节点。
3. 动态节点自动打标签+亲和性适配
因为节点会定期删创,手动加标签不现实,可以通过两种方式给节点自动打标签:
- 如果低负载节点是特定硬件规格(比如大内存/高CPU机型),可以在kubelet启动参数中添加
--node-labels=node-class=high-capacity,让新创建的高配置节点自动带上标签。然后在Deployment里配置节点亲和性,优先选择这类节点:
spec: template: spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: node-class operator: In values: - high-capacity
- 如果节点负载是动态变化的,可以用监控联动的自定义控制器(比如基于Prometheus的脚本/控制器),给CPU/内存使用率低于阈值的节点自动打上
load-level=low标签,然后Deployment配置亲和性优先选择带该标签的节点。
4. 用自定义调度器实现更灵活的逻辑
如果默认调度器满足不了需求,可以部署自定义调度器(比如Volcano,或者基于kube-scheduler扩展自定义插件),直接基于节点的实际负载数据(比如从metrics-server获取的实时使用率)来做调度决策,完全贴合你的负载判断标准。
额外优化:用Descheduler调整已有Pod
如果已经有大量Pod跑在高负载节点上,光靠新Pod调度还不够,可以部署Descheduler。它会定期扫描集群,把高负载节点上的Pod驱逐到低负载节点,配合新调度策略,实现集群整体负载均衡。
内容的提问来源于stack exchange,提问作者Crown43
相关产品推荐
相关产品推荐

