💰 第34课:成本优化

核心概念

成本优化(FinOps):让每分钱花在刀刃上

云成本是DevOps最容易被忽视的方面。FinOps将成本可视化、责任化、优化。

成本优化策略

1. 右键化(Right-sizing):匹配实例规格与需求
2. 弹性伸缩:按负载自动扩缩容
3. Spot/抢占式实例:非关键工作负载低价
4. 保留实例(RI):长期稳定负载买预留
5. 存储分层:热→冷→归档自动降级
6. 清理闲置资源:未挂载磁盘、未使用IP

命令实操

1. AWS成本分析 ✅

AWS成本
# 月度成本
aws ce get-cost-and-usage \
  --time-period Start=2026-05-01,End=2026-05-19 \
  --granularity DAILY --metrics BlendedCost \
  --group-by Type=SERVICE

# 闲置资源
aws ec2 describe-volumes --filters Name=status,Values=available \
  --query 'Volumes[].[VolumeId,Size,State]' --output table

aws ec2 describe-addresses --query 'Addresses[].[PublicIp,AssociationId]' --output table

# Right-sizing建议
aws compute-optimizer get-ec2-recommendation-summary --account-ids 

2. K8s资源优化 ✅

K8s资源优化
# 资源使用 vs 请求
kubectl top pods -A --sort-by=memory

# VPA推荐(仅推荐不自动修改)
cat > vpa-recommendation.yaml << 'EOF'
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata: {name: myapp-vpa}
spec:
  targetRef: {apiVersion: apps/v1, kind: Deployment, name: myapp}
  updatePolicy: {updateMode: "Off"}
EOF
kubectl apply -f vpa-recommendation.yaml
kubectl get vpa myapp-vpa -o jsonpath='{.status.recommendation}' | jq .

# Kubecost
helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost --create-namespace \
  --set kubecostToken="devops@company.com" 

3. Spot实例与成本告警 ✅

Spot与告警
# Spot Fleet
aws ec2 request-spot-fleet --spot-fleet-request-config file://spot-fleet.json

# 月度预算告警
aws budgets create-budget \
  --account-id 123456789 \
  --budget '{"BudgetLimit":{"Amount":"5000","Unit":"USD"},"TimeUnit":"MONTHLY","BudgetType":"COST"}' \
  --notifications-with-subscribers '[{"Notification":{"NotificationType":"ACTUAL","ComparisonOperator":"GREATER_THAN","Threshold":80},"Subscribers":[{"SubscriptionType":"EMAIL","Address":"devops@company.com"}]}]'

架构图

成本优化(FinOps):让每分钱花在刀刃上架构

┌──────────────────────────────────────────┐
│            FinOps三大支柱                │
│  可视化(看见钱) │ 责任化(谁花的) │ 优化(少花钱) │
└──────────────────┬───────────────────────┘
    ┌──────────────┼──────────────┐
    ▼              ▼              ▼
┌────────┐  ┌──────────┐  ┌──────────┐
│ Kubecost│ │AWS Cost  │ │ 成本告警  │
│(K8s成本)│ │Explorer  │ │(超预算)  │
└────────┘  └──────────┘  └──────────┘

故障排查

❌ 成本突然飙升

排查
aws ce get-cost-and-usage \
  --time-period Start=$(date -d '7 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity DAILY --metrics BlendedCost --group-by Type=SERVICE
# 常见:数据传输费/忘记关闭的测试实例/日志存储暴增/Spot回收后按需启动
💡 FinOps原则:成本可视化是第一步、每个团队对自己资源成本负责、Right-size优先于Reserved。

🏆 成就解锁:FinOps专家!

掌握AWS成本分析、K8s资源优化、Spot实例、预算告警——省钱也是一种工程能力

📝 FinOps成熟度模型

级别特征行动
L1 爬行不知道花了多少成本可视化
L2 行走知道谁花的标签+分账
L3 奔跑主动优化Right-size+Spot
L4 飞行成本驱动架构FinOps融入设计
💡 省钱速查:Right-size实例省30%、Spot实例省60%、RI预留省40%、存储分层省50%、清理闲置省20%。

🔧 Kubecost成本监控

Kubecost
# 安装Kubecost
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm install kubecost kubecost/cost-analyzer \
    --namespace kubecost --create-namespace \
    --set kubecostToken="devops@company.com" \
    --set prometheus.server.global.external_labels.cluster_id=prod

# 访问Dashboard
kubectl port-forward -n kubecost svc/kubecost-cost-analyzer 9090:80

# API查询成本
curl -s http://localhost:9090/api/v1/report/allocation | jq '.[0].TotalCost'

# 按命名空间查询
curl -s "http://localhost:9090/api/v1/report/allocation?window=7d&aggregate=namespace" | jq

# 按Label查询(团队成本)
curl -s "http://localhost:9090/api/v1/report/allocation?window=30d&aggregate=label:team" | jq

# 生成成本报告
curl -s "http://localhost:9090/api/v1/report/allocation?window=30d&format=csv" > cost-report.csv

📝 成本优化速查

优化项潜在节省实施难度风险
Right-sizing实例30-50%
Spot/抢占式实例60-90%中(可中断)
Reserved Instances30-60%低(承诺期)
自动扩缩容20-40%
存储分层40-70%
清理闲置资源10-30%
Graviton/ARM20-40%中(兼容性)
压缩/CDN缓存10-20%
💡 FinOps日常:每周Review成本趋势、每月出团队成本报告、每季度优化一轮、每年重新评估云厂商。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。

课前准备

课后巩固

进阶方向

📝 本课知识图谱

知识域核心技能验证方式
核心概念理解原理和架构能用自己的话解释
命令实操熟练使用相关工具能独立完成操作
故障排查定位和解决问题能在模拟故障中恢复
最佳实践遵循生产级标准能设计可靠方案
💡 持续学习:技术领域更新快,关注官方博客、GitHub Release、社区动态,保持知识新鲜度。

🔗 相关课程链接

前置课程后续课程关联课程
前几课基础内容下一课深入内容跨领域综合应用
⚠️ 实验环境安全:本课所有命令请在隔离的实验环境中执行,避免在生产环境直接操作。备份重要数据后再进行任何修改操作。

📌 记住:理论+实践=真正的掌握。每个概念都要动手验证,每个命令都要理解原理。