深色模式
FinOps 工具
工具分三类:云厂商原生(看账单)、开源(分摊与建议)、商业(跨云治理)。选型的依据是"你现在处在哪个阶段"。
适用环境
- 已有云账号或 Kubernetes 集群
- 有导出账单的能力
- 有部署开源组件的权限
bash
# 先确认集群可部署 Helm chart
helm version
kubectl get ns1
2
3
2
3
操作步骤
1. 按阶段选工具
| 阶段 | 首要需求 | 推荐工具 |
|---|---|---|
| 起步 | 看清账单 | 云平台成本管理器 |
| 可见 | 标签分摊 | 云平台 + 标签治理工具 |
| 优化 | 建议与执行 | OpenCost、VPA、Kubecost 开源版 |
| 运营 | 跨云与流程 | 商业 FinOps 平台 |
不要一上来就上商业平台:没有标签和流程,平台也只能展示一堆无法归属的数字。
2. 云平台原生工具(必开)
bash
# 各云都有成本分析控制台,核心功能基本一致:
# 1) 成本与用量报告导出(CSV/Parquet 到对象存储)
# 2) 预算与告警
# 3) 优化建议(闲置实例、低利用率、预留购买建议)1
2
3
4
2
3
4
bash
# 开启账单导出后定期同步到本地
aws s3 sync s3://billing-export/cur/ finops/bills/ --exclude '*' --include '*.csv.gz'1
2
2
3. 开源:OpenCost(K8s 成本分摊)
bash
helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm install opencost opencost/opencost \
--namespace opencost --create-namespace \
--set opencost.exporter.defaultClusterId=prod-cluster1
2
3
4
2
3
4
bash
# 查看按 namespace/pod 分摊的成本
kubectl port-forward -n opencost svc/opencost 9003:9003 &
curl -s 'http://localhost:9003/allocation?window=1d&aggregate=namespace' | jq .1
2
3
2
3
OpenCost 解决的核心问题是:把节点成本按实际资源使用分摊到 namespace / pod / label。
4. 开源:Kubecost(OpenCost 的商业发行版)
bash
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost --create-namespace \
--set kubecostToken=""1
2
3
4
2
3
4
bash
kubectl port-forward -n kubecost svc/kubecost-cost-analyzer 9090:9090 &
# 浏览器打开 http://localhost:90901
2
2
提供 rightsizing 建议、闲置识别、预算告警;开源版功能有限,完整版需付费。
5. 开源:垂直/水平伸缩建议
bash
# VPA 给 requests 建议
kubectl apply -f - <<'EOF'
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: order-api-vpa
spec:
targetRef: {apiVersion: "apps/v1", kind: Deployment, name: order-api}
updatePolicy: {updateMode: "Off"}
EOF
kubectl get vpa order-api-vpa -o jsonpath='{.status.recommendation}' | jq .1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
bash
# Goldilocks 汇总多个 VPA 的建议成一个看板
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install goldilocks fairwinds-stable/goldilocks --namespace goldilocks --create-namespace
kubectl -n goldilocks port-forward svc/goldilocks-dashboard 8080:80 &1
2
3
4
2
3
4
6. 用 Prometheus + 自研 exporter 兜底
python
#!/usr/bin/env python3
# cost_exporter.py - 把每日账单金额暴露为 Prometheus 指标
import time
from prometheus_client import start_http_server, Gauge
DAILY = Gauge('daily_cost_yuan', '当日累计花费(元)', ['service'])
def fetch():
# 替换为真实的账单 API 调用
return {'compute': 12000.0, 'storage': 3400.0, 'network': 2100.0}
if __name__ == '__main__':
start_http_server(9108)
while True:
for svc, amt in fetch().items():
DAILY.labels(service=svc).set(amt)
time.sleep(3600)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bash
pip install prometheus-client && python3 cost_exporter.py &
curl -s localhost:9108/metrics | grep daily_cost1
2
2
自研 exporter 适合账单格式特殊、或需要把单位成本(元/订单)纳入监控的场景。
7. 商业平台的取舍
text
适合上商业平台的信号:
- 多云/混合云,需要统一视图
- 需要摊销、内部结算(showback/chargeback)
- 有专职 FinOps 团队推动流程
不适合的信号:
- 单云、资源规模小
- 标签治理尚未完成
- 没有流程承接平台给出的建议1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
8. 工具组合示例
text
阶段一(0~3 个月):
云成本控制台 + 标签规范 + 账单导出脚本 + Prometheus 预算告警
阶段二(3~9 个月):
+ OpenCost/Goldilocks 做分摊与 rightsizing 建议
+ 自动关机脚本、生命周期规则
阶段三(9 个月以后):
+ 商业平台做跨云归集与内部结算
+ 预算递减机制与自动化闭环1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
验证
bash
# 工具是否真的有用,看三点
# 1) 能否按团队/服务给出花费(归因)
curl -s 'http://localhost:9003/allocation?window=1d&aggregate=namespace' | jq '.data[0] | keys'
# 2) 能否给出可执行的建议(而非只有图表)
kubectl get vpa -A -o json | jq '.items[].status.recommendation'
# 3) 建议被采纳后账单是否真的下降1
2
3
4
5
6
2
3
4
5
6
常见坑
先买工具后做治理
没有标签和归属关系,任何工具都只能显示"总额 100 万"。工具是放大器,不是起点。
开源工具的版本兼容性
OpenCost/Kubecost 对 Kubernetes 版本和 Prometheus 版本有要求。部署前务必核对兼容矩阵,并在测试集群验证。
自研 exporter 暴露成本数据
成本数据属于敏感经营信息。自研 exporter 的 metrics 端点必须加访问控制,不要直接暴露在公网。
多个工具给出冲突建议
VPA、Kubecost、云平台建议可能不一致。做法:以压测实测为准,工具建议只作为候选清单,不要自动执行。