先建立成本口径

谈集群成本前,先确定口径:节点和系统实例、负载均衡、公网流量、存储、快照、日志、平台服务费,都要进入统计。只看节点费用会低估 20% 到 40% 的总成本,具体比例取决于工作负载类型。

第二步是确定分摊维度。常见做法是按命名空间、团队标签、业务服务或成本中心分摊。关键是选择一个与组织决策一致的维度,并保持标签强制校验。

# 成本标签示例
metadata:
  labels:
    app.kubernetes.io/part-of: content-platform
    team: cloud-notes
    cost-center: personal-site
    environment: production

Requests 是调度成本,Usage 是真实消耗

Kubernetes 根据 Requests 调度 Pod。请求值过高,集群会提前扩容,账单上升;请求值过低,节点超卖严重,高峰期出现驱逐或 CPU 节流。Limits 则影响突发能力和稳定性。

成本治理要同时看三个数字:请求值、实际使用率、 throttling 或 OOM 次数。只压低请求值而不看服务质量,会得到一份好看但不可靠的报表。

现象常见原因下一步
请求 CPU 远高于使用量历史经验值未回收按 P95 使用量分批调整
节点 CPU 利用率低但内存高内存请求碎片化检查可迁移 Pod 与节点规格
CPU 节流高Limit 过紧或突发负载区分稳态与峰值,调整限流策略
频繁 OOM内存 Limit 低或泄漏先看应用指标,再改限额

从压测到生产:调整请求值的流程

  1. 按容器收集至少一到两周的 CPU、内存 P95 和峰值。
  2. 区分在线服务、后台任务、定时任务和守护进程。
  3. 在预发环境验证新 Requests 和 Limits。
  4. 生产环境分批修改,同时观察重启、节流、延迟和错误率。
  5. 把最终值写回 Helm Values 或 IaC,禁止控制台手工漂移。
经验值:普通在线服务的 CPU 请求可以先参考 P95 到峰值之间,内存请求参考 P95 加一定余量。不要把峰值直接等同于请求值,否则集群会长期为极小概率流量付费。

识别三类闲置

第一类是低利用率工作负载。它们占用了调度资源,但实际使用很少。第二类是闲置对象:旧 Deployment、未使用的 PVC、长期保留的快照、测试命名空间。第三类是平台能力重复:多套网关、多套监控代理、重复的日志采集器。

我会每季度做一次清单:列出所有命名空间、Deployment、CronJob、PVC、LB 和公网 IP,标注负责人和最近使用时间。没有负责人的资源先停止再删除,并保留恢复窗口。

用命名空间和配额推动责任归属

ResourceQuota 限制命名空间总量,LimitRange 给未指定资源的对象默认值,两者配合可以防止新服务无边界占用资源。对多团队集群,还应该把命名空间与团队标签绑定,让报表能落到具体负责人。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-cloud-notes
  namespace: cloud-notes
spec:
  hard:
    requests.cpu: "8"
    requests.memory: 16Gi
    limits.cpu: "16"
    limits.memory: 32Gi
    persistentvolumeclaims: "10"

配额不是为了制造审批墙,而是让资源申请变成显式决策。超过配额时,负责人需要说明扩容原因或优化方案。

自动化只解决一部分问题

自动扩缩容、节点池整合、抢占式实例和混部都能降本,但前提是服务有明确的优先级和可观测性。对个人项目或小团队,优先做三件事更有价值:清理闲置资源、校准请求值、统一标签体系。之后再考虑更复杂的调度策略。

成本报表应有的字段

  • 命名空间、服务、环境、负责人。
  • 请求成本与实际利用率成本。
  • CPU 节流、OOM、重启次数。
  • 存储、流量、负载均衡等非节点费用。
  • 环比变化和异常说明。

当报表能回答“这个月为什么贵了”和“哪个服务浪费最多”,成本治理才真正进入工程流程。否则降本只会变成一次性删机器,几周后成本又悄悄回来。