在 AWS EKS 和 ECS 上优化容器工作负载成本

发布: (2025年12月25日 GMT+8 00:46)
9 min read
原文: Dev.to

Source: Dev.to

大家好!
让我们来聊聊大家都关心的事情:在云账单上省钱。我最近深入研究了在 AWS 上优化容器成本的方式,我真希望早点知道这些见解。

为什么容器成本优化很重要

容器在扩展和部署方面优势巨大,但如果不加以监控,它们可能会悄悄吞噬你的预算。好消息是?AWS 提供了多种方法,让成本魔法消失而不影响性能——甚至常常还能提升性能。

Spot 实例:你的秘密武器

Spot 实例可能是 AWS 给我的最大收获。与按需实例相比,你可以节省 最高 90 %。是的,90 %!它们非常适合能够容忍间歇性中断的容错应用。

  • EKS 使得在 Spot 实例上使用托管节点组相对容易。
  • 你可以在同一个 EKS 集群中混合使用 Spot 实例和普通实例:对关键工作负载使用普通实例,对不太关键的工作负载使用 Spot 实例。

我们成功的做法:
将批处理工作负载和 CI/CD 流水线迁移到 Spot 实例后,我们立刻节省了成本。这些工作负载本身就可以被中断,因此成本优势立竿见影。只要确保你的应用能够优雅地关闭,就可以放心使用。

Fargate vs EC2: 明智选择

FargateEC2
成本每计算单元较高,但只为实际使用的资源付费(精确到秒)。每计算单元较低(在适当规模时);通过预留实例或 Savings Plans 可更便宜。
运维开销无需管理基础设施——AWS 负责底层服务器。需要自行管理实例(打补丁、扩容等)。
适用场景流量不可预测、小型工作负载,或希望零运维的情况。流量可预测、稳定的生产工作负载,可进行规模优化并保持高利用率。

我的当前做法

  • Fargate 用于开发环境和偶发工作负载。
  • EC2(经过良好优化,可能搭配预留实例/ Savings Plans)用于接收持续流量的生产工作负载。

本质上是为不同任务选择合适的工具。

Source:

自动伸缩:动态二人组

有两个组件改变了我对资源分配的思考方式:

  1. Cluster Autoscaler – 根据待调度的 Pod 自动扩缩节点数量。不再为闲置节点付费。
  2. Horizontal Pod Autoscaler (HPA) – 在应用层面根据 CPU、内存或自定义指标对 Pod 进行伸缩。

它们共同构成了一场“宏伟的效率交响曲”。我们的集群在流量高峰时自动扩容,在流量下降时自动缩容,消除过度配置,节省约 30 % 的成本。

HPA 示例清单

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Rightsizing: Stop Wasting Resources

我曾因为“以防万一”而把 pod 的资源请求设得过高,导致为从未使用的资源付费。

调整规模的步骤:

  1. 测量实际消耗 – 使用 Kubernetes Metrics Server(或 Prometheus)查看真实使用情况。
  2. 调整请求和限制 – 例如,如果一个 pod 实际使用约 100 MiB 内存,但你请求了 512 MiB,则会产生额外费用。
  3. 保守迭代 – 在更改后监控一到两周,然后进一步微调。

即使是小幅度的调整,累计到数十或数百个 pod 也能产生显著的节省。

Kubecost: 您的财务可视化合作伙伴

Kubecost 为 Kubernetes 工作负载提供实时成本可视化。它能够精确显示资金的去向——细化到命名空间或 Pod 级别。

我喜欢 Kubecost 的原因

  • 按团队、应用或环境进行成本拆分。
  • 当支出超过设定阈值时触发警报。
  • 社区版免费且非常适合入门者。

在集群上安装后,您即可获得成本分配、优化机会和警报的洞察——相当于为您的 Kubernetes fleet 配备了一位财务分析师。

ECR 生命周期策略:清理与节省

存储在 Amazon ECR 中的容器镜像会逐渐产生费用,尤其是那些旧的、未使用的版本。ECR 生命周期策略可以让您根据镜像的年龄或数量自动裁剪镜像。

简单策略示例: 保留最近的 10 个镜像,并删除任何超过 30 天且未被拉取的镜像。

{
  "rules": [
    {
      "rulePriority": 1,
      "description": "Keep last 10 images",
      "selection": {
        "tagStatus": "any",
        "countType": "imageCountMoreThan",
        "countNumber": 10
      },
      "action": {
        "type": "expire"
      }
    },
    {
      "rulePriority": 2,
      "description": "Delete images older than 30 days",
      "selection": {
        "tagStatus": "any",
        "countType": "sinceImagePushed",
        "countUnit": "days",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}

应用此类策略可防止未使用的镜像悄悄消耗费用。

TL;DR

  • Spot Instances → 对于可中断工作负载可节省高达 90 %。
  • Fargate vs EC2 → 根据可预测性、运维开销和成本模型进行选择。
  • Autoscaling (Cluster Autoscaler + HPA) → 消除空闲容量,节省约 30 %。
  • Rightsizing → 将请求/限制与实际使用情况对齐。
  • Kubecost → 实时成本可视化和警报。
  • ECR Lifecycle Policies → 自动清理旧镜像,防止存储浪费。

实施这些实践后,您将看到 AWS 容器费用的显著下降,而不会牺牲性能。祝优化愉快!

{
  "rules": [
    {
      "id": 1,
      "description": "Keep last 10 images",
      "selection": {
        "tagStatus": "any",
        "countType": "imageCountMoreThan",
        "countNumber": 10
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}

全屏控制(示例)

  • 进入全屏模式
  • 退出全屏模式

这是一件小事,但如果你在处理多个仓库时,磁盘空间的节省会累计起来。

Cost Optimization

Source:

汇总要点

成本优化并非一次性任务。先从快速收益入手——自动伸缩、Spot 实例和 Kubecost。

  1. 快速收益

    • 自动伸缩
    • Spot 实例
    • Kubecost
  2. 后续步骤

    • 合理规模化(Rightsizing)
    • 清理旧镜像
    • 在 Fargate 与 EC2 之间做决定

监控进展并在过程中庆祝成功。我们在 三个月内将容器成本降低了约 45 %

接下来要解决的领域

  • 基础设施
  • IRSA(IAM Roles for Service Accounts)

记住,每省下的一美元都可以重新投入到构建更好功能或改进基础设施上。


你尝试过哪些成本优化方法并取得了成功?
欢迎分享你的经验,这样我就不会错过任何技巧。提前感谢,让我们彼此学习进步!

在下方评论区分享你的“削减成本最佳技巧”,帮助大家共同应对云账单!

Back to Blog

相关文章

阅读更多 »