Kubernetes 调度策略深度拆解:我如何帮团队省下 90% 的资源成本

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Kubernetes 调度策略深度拆解:我如何帮团队省下 90% 的资源成本

Kubernetes 调度策略深度拆解:我如何帮团队省下 90% 的资源成本

作者|Echo_Wish(爱算账的 K8s 打工人)

兄弟姐妹们,实话实说:很多公司的 Kubernetes 集群资源使用率真实情况只有 10%~30%。你没看错,就是这点儿。
大家不是技术不行,而是默认调度 + 一堆“看起来合理”的配置把钱烧没了。

我见过太多集群:节点 CPU 一直空着,Pod 却在横着扩;大部分 Deployment 的 request 都是拍脑袋写的;HPA 靠天吃饭;调度策略完全走默认;晚上没人访问服务,集群却和白天一样热火朝天地烧钱。

所以我想写一篇真正落地、接地气、能帮你 省真金白银 的调度策略指南。下面的招数都是我自己在生产环境试过的,省下来不仅是成本,更是 KPI 吧(你懂的)。


一、为什么默认调度会浪费资源?

Kubernetes 默认调度器(kube-scheduler)遵循一种“大家都能跑就行”的哲学,优先保证可靠性,但绝不帮你省钱。

默认的问题:

  • Request 填大了 → 导致 资源虚空占用(实际不需要那么多)。
  • Pod 分散调度 → 节点之间负载不均,出现大量 碎片化
  • 低峰期没有自动缩容 → 白白浪费节点成本
  • 没用 NodeAffinity / Taints → Pod 跑得乱七八糟 → 影响 bin-packing。

简单说:
默认调度不是为省钱设计的,而是为“不出事”设计的。


二、想省 90% 成本?先搞清楚资源是怎么烧掉的

来看一张典型“企业集群 CPU 使用情况”的 ASCII 图:

节点1: [##########------------------------] 35%
节点2: [######----------------------------] 20%
节点3: [########--------------------------] 25%
节点4: [#---------------------------------] 5%
节点5: [#---------------------------------] 3%
节点6: [#################################] 90%(重点服务)

真实情况:三个节点能干这六个节点的活。

这就是 bin-packing 不好 + pod 分布不均 的结果。

下面我给你一个从“浪费”走向“极致省钱”的完整路径。


三、四大调度策略 + 实战配置(真正能省钱)


策略一:优化 Request / Limit(最有效的降本手段,没有之一)

很多团队 CPU request 全靠猜,写得特别大,比如:

resources:
  requests:
    cpu: 500m
    memory: 1Gi

实际上服务平均 CPU 可能就只有 30m。

Result:节点被虚假占满,真正的资源利用率低得可怜。

怎么解决?

步骤 1:用 metrics-server 或 Prometheus 查看真实资源使用

kubectl top pod

步骤 2:按照平均值 + 波动给 request,而不是盲目加大

例如你的服务平时使用 20–50m CPU,那么 request 给 50–80m 都很安全。


策略二:使用 Pod 优先级(PriorityClass)让重要服务先占坑

遇到资源紧张时,谁先被挤掉?
默认:大家地位一样 → 调度器乱来。

用 PriorityClass 能保证关键服务永远有资源:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: critical-app
value: 1000000
globalDefault: false
description: "关键服务,不可驱逐"

然后在 Pod 里使用:

priorityClassName: critical-app

这样 bin-packing 时关键服务先放,高优先级抢占低优先级 → 节点资源利用更紧凑。


策略三:Pod 亲和性/反亲和性,让调度真正“聪明”起来

让 Pod 尽量挤在一起(bin packing 强化版)

affinity:
  podAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchLabels:
            app: myservice
        topologyKey: kubernetes.io/hostname

效果:
Pod 越多,就越被安排在同一个节点,空出更多节点可供缩容。

反亲和性:防止相同 Pod 全堆一台(必要时启用)

例如高可用服务:

podAntiAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchLabels:
        app: gateway
    topologyKey: kubernetes.io/hostname

策略四:使用 Descheduler + Cluster Autoscaler(成本杀手锏)

光靠 scheduler 不够,因为 Pod 会随着时间推移变得不均衡,这就需要 Descheduler 来重新平衡

示意图:

初始:
节点1:80%
节点2:10%
节点3:15%

Descheduler 运行后:
节点1:60%
节点2:60%
节点3:25%

→ Cluster Autoscaler 自动把节点3缩掉 → 节省钱。

Descheduler 配置示例

profiles:
- name: Default
  pluginConfig:
  - name: "RemoveDuplicates"
  - name: "LowNodeUtilization"
    args:
      thresholds:
        cpu: 20
        memory: 20
      targetThresholds:
        cpu: 80
        memory: 80

Descheduler 会把“不满载”的节点 Pod 全挪走 → Autoscaler 自动缩容 → 真正省钱。


四、最容易忽视的关键:按时间动态调度(夜间成本减半)

不少服务晚上根本没多少访问量,但 Pod 仍然占着资源不松口。

👇 推荐用 HPA + CronJob 做“时间维度调度”:

例:夜间自动缩容,只保留 1 个 Pod

apiVersion: batch/v1
kind: CronJob
metadata:
  name: night-scale
spec:
  schedule: "0 1 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            command: ["kubectl", "scale", "deploy/myapp", "--replicas=1"]
          restartPolicy: OnFailure

白天流量恢复:

schedule: "0 7 * * *"
command: ["kubectl", "scale", "deploy/myapp", "--replicas=10"]

一个简单策略 → 节省 30–40% 的节点成本


五、我踩过的坑和真实感受

这些年从 50 台节点省到 15 台节点,不夸张说省了好几百万——但这个过程不轻松。

我见过这些坑:

  • 开发随便填 request,导致整集群被“虚空占用”
  • 调度策略写得很复杂,却没人维护
  • Autoscaler 配置错误 → 峰值瞬间崩
  • SRE 只看 CPU,不看内存,结果内存 OOM 把 Pod 全踢下线

也见过好的情况:

  • 用好 bin-packing → 节点减少 50%
  • 夜间缩容策略 → 再省 30%
  • 优先级 + 节点池分层 → 再省 10%

真正让我省下 90% 成本的不是某个神技,而是这四件事:

  1. 请求值填准确
  2. Pod 调度更聪明
  3. 持续重平衡
  4. 自动缩容策略完善

没有玄学,就是扎实的工程方法。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
数字人实践案例分享
# 数字人实践案例分享:从概念到落地的全面解析 在人工智能技术飞速发展的今天,数字人已不再是科幻电影中的概念。据统计,2024年全球数字人市场规模已突破千亿元,年复合增长率高达67%。作为AI技术的
数字人实践案例分享
|
5月前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
3452 90
大厂CIO独家分享:AI如何重塑开发者未来十年
|
5月前
|
Prometheus 运维 监控
监控没做好,DevOps等于裸奔:Prometheus + ELK 的“稳态运营秘籍”
监控没做好,DevOps等于裸奔:Prometheus + ELK 的“稳态运营秘籍”
305 26
|
4月前
|
机器学习/深度学习 人工智能 运维
AIOps已逝,欢迎进入AgenticOps(运维智能体)时代
GenAI和智能体技术的爆发,为IT运维打开了一扇新的大门,一个更具主动性、自治性和协作性的新时代已经来临,这就是AgenticOps(基于智能体的IT运维)。
|
5月前
|
人工智能 IDE 开发工具
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
1157 1
Visual Studio 2026 正式版发布 - 适用于 Windows 上 .NET 和 C++ 开发人员的最全面 IDE
|
5月前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
524 1
|
4月前
|
存储 小程序 应用服务中间件
阿里云200Mbps轻量应用服务器详细介绍,看完一目了然
阿里云轻量应用服务器2核2G,40GB ESSD云盘,200M峰值带宽,不限流量,仅需68元/年,秒杀价38元/年。支持Windows/Linux,预装宝塔、WordPress等应用,适用于建站、小程序、开发测试等场景。详细参考阿里云活动中心 https://t.aliyun.com/U/emyGuZ
573 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
2141 38
|
5月前
|
运维 Prometheus 监控
以 SLI/SLO 为驱动的可观测性:从定义到告警策略 — 写给在值班室里泡过夜的你
以 SLI/SLO 为驱动的可观测性:从定义到告警策略 — 写给在值班室里泡过夜的你
380 11
以 SLI/SLO 为驱动的可观测性:从定义到告警策略 — 写给在值班室里泡过夜的你
|
7月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
236 4