Kubernetes/Cluster-autoscaler:如何配置工作负载调度提升资源利用率?
优化CI作业集群调度与资源利用率的方案
1. 调整调度器Pod调度策略(替换默认轮询)
K8s默认的EvenPodsSpread策略会强制分散Pod到各节点,这正是你遇到“每个节点至少一个作业Pod”的核心原因。可以通过软约束降低分散优先级,实现紧凑调度:
- 给所有CI作业Pod添加如下亲和性配置,让调度器优先把Pod塞进已有作业的节点,直到资源耗尽再扩容新节点:
affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - ci-job topologyKey: kubernetes.io/hostname - 若集群版本在1.19+,也可直接在调度器配置中降低
EvenPodsSpread插件的权重,或禁用该插件。
2. 重置Cluster Autoscaler(CA)参数(替代极端阈值)
之前设置的scale-down-utilization-threshold=0过于激进,改用更平衡的参数组合:
- 设
scale-down-utilization-threshold=0.4(可根据作业资源需求调整,比如CPU/内存利用率低于40%时允许缩容) - 保留
scale-down-unneeded-time=1m,新增scale-down-delay-after-add=5m(扩容后等待5分钟再触发缩容,给作业足够时间调度到节点) - 设
scale-down-unready-time=20m(匹配作业最长运行时长,确保节点上的作业全部完成后再缩容) - 启用
skip-nodes-with-local-storage=false(若作业无本地存储依赖),扩大CA可缩容的节点范围
3. 配置Pod Disruption Budget(PDB)
通过PDB限制节点缩容时的Pod驱逐行为,避免作业被中途终止:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: ci-job-pdb spec: minAvailable: 0 selector: matchLabels: app: ci-job
该配置允许所有作业Pod被终止,但仅当Pod处于完成状态时,CA才会触发对应节点的缩容操作。
4. 启用调度器“Bin Packing”模式
K8s调度器的MostAllocated优先级函数会优先将Pod调度到资源利用率最高的节点,实现节点资源的紧凑打包。调整调度器配置,提高该函数的权重:
- 编辑
kube-scheduler的ConfigMap,修改优先级配置:
此配置让调度器优先填满已有节点,减少低利用率节点的产生,便于CA识别并缩容闲置节点。apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler plugins: score: enabled: - name: MostAllocated weight: 6 - name: EvenPodsSpread weight: 2
5. 固定Agent Pod到常驻节点
给Agent Pod添加节点亲和性,让其仅运行在少量常驻节点上,临时扩容的节点只承载作业Pod:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/ci-agent operator: Exists
给常驻节点打上node-role.kubernetes.io/ci-agent标签,确保临时节点仅运行作业Pod,作业完成后节点无负载,CA可快速触发缩容。
内容的提问来源于stack exchange,提问作者Ian Hansborough
相关产品推荐
相关产品推荐

