在 AWS EKS 和 ECS 上优化容器工作负载成本
Source: Dev.to
大家好!
让我们来聊聊大家都关心的事情:在云账单上省钱。我最近深入研究了在 AWS 上优化容器成本的方式,我真希望早点知道这些见解。
为什么容器成本优化很重要
容器在扩展和部署方面优势巨大,但如果不加以监控,它们可能会悄悄吞噬你的预算。好消息是?AWS 提供了多种方法,让成本魔法消失而不影响性能——甚至常常还能提升性能。
Spot 实例:你的秘密武器
Spot 实例可能是 AWS 给我的最大收获。与按需实例相比,你可以节省 最高 90 %。是的,90 %!它们非常适合能够容忍间歇性中断的容错应用。
- EKS 使得在 Spot 实例上使用托管节点组相对容易。
- 你可以在同一个 EKS 集群中混合使用 Spot 实例和普通实例:对关键工作负载使用普通实例,对不太关键的工作负载使用 Spot 实例。
我们成功的做法:
将批处理工作负载和 CI/CD 流水线迁移到 Spot 实例后,我们立刻节省了成本。这些工作负载本身就可以被中断,因此成本优势立竿见影。只要确保你的应用能够优雅地关闭,就可以放心使用。
Fargate vs EC2: 明智选择
| Fargate | EC2 | |
|---|---|---|
| 成本 | 每计算单元较高,但只为实际使用的资源付费(精确到秒)。 | 每计算单元较低(在适当规模时);通过预留实例或 Savings Plans 可更便宜。 |
| 运维开销 | 无需管理基础设施——AWS 负责底层服务器。 | 需要自行管理实例(打补丁、扩容等)。 |
| 适用场景 | 流量不可预测、小型工作负载,或希望零运维的情况。 | 流量可预测、稳定的生产工作负载,可进行规模优化并保持高利用率。 |
我的当前做法
- Fargate 用于开发环境和偶发工作负载。
- EC2(经过良好优化,可能搭配预留实例/ Savings Plans)用于接收持续流量的生产工作负载。
本质上是为不同任务选择合适的工具。
Source: …
自动伸缩:动态二人组
有两个组件改变了我对资源分配的思考方式:
- Cluster Autoscaler – 根据待调度的 Pod 自动扩缩节点数量。不再为闲置节点付费。
- 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 的资源请求设得过高,导致为从未使用的资源付费。
调整规模的步骤:
- 测量实际消耗 – 使用 Kubernetes Metrics Server(或 Prometheus)查看真实使用情况。
- 调整请求和限制 – 例如,如果一个 pod 实际使用约 100 MiB 内存,但你请求了 512 MiB,则会产生额外费用。
- 保守迭代 – 在更改后监控一到两周,然后进一步微调。
即使是小幅度的调整,累计到数十或数百个 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"
}
}
]
}
全屏控制(示例)
- 进入全屏模式
- 退出全屏模式
这是一件小事,但如果你在处理多个仓库时,磁盘空间的节省会累计起来。

Source: …
汇总要点
成本优化并非一次性任务。先从快速收益入手——自动伸缩、Spot 实例和 Kubecost。
-
快速收益
- 自动伸缩
- Spot 实例
- Kubecost
-
后续步骤
- 合理规模化(Rightsizing)
- 清理旧镜像
- 在 Fargate 与 EC2 之间做决定
监控进展并在过程中庆祝成功。我们在 三个月内将容器成本降低了约 45 %。
接下来要解决的领域
- 基础设施
- IRSA(IAM Roles for Service Accounts)
记住,每省下的一美元都可以重新投入到构建更好功能或改进基础设施上。
你尝试过哪些成本优化方法并取得了成功?
欢迎分享你的经验,这样我就不会错过任何技巧。提前感谢,让我们彼此学习进步!
在下方评论区分享你的“削减成本最佳技巧”,帮助大家共同应对云账单!