4.17 云成本优化——FinOps 实践与 Spot Instance 策略
预计阅读时间:20 分钟
📖 目录
4.15:Terraform 入门 介绍了 Terraform 管理云资源,6.10:云网络基础 讲了云网络基础。但上云之后,成本控制同样重要——云账单是持续支出。FinOps(Cloud Financial Operations)是一套将财务责任引入云支出决策的实践框架。
学习目标
学完本章,你将能够:
- 理解 FinOps 三阶段循环(Inform / Optimize / Operate)的核心思想
- 掌握资源标签规范与成本分摊、预算告警的落地方法
- 掌握资源右配(Right-Sizing)的识别手段与定时开关机自动化
- 理解 Spot Instance 的定价机制、适用场景与回收风险
- 掌握预留实例与混合计费策略的选购方法
- 理解"先建立可见性、再优化支出"的治理顺序
前置知识
- 4.15:Terraform 入门 Terraform 基础设施即代码入门——default_tags 与资源声明
- 6.10:云网络基础 云网络基础——VPC、安全组与 cloud-init
- 4.14:运维故障案例集 运维故障案例集——账单激增与资源泄漏事故复盘
- iac_adv01 IaC 进阶——Pulumi / CDKTF / Terragrunt 多环境管理
FinOps 框架
FinOps 基金会定义的三个阶段循环:
| 阶段 | 核心活动 | 指标 |
|---|---|---|
| Inform(可见) | 成本分配、预算告警、单位成本分析 | 总支出、按团队/项目分配 |
| Optimize(优化) | 资源右配、预留实例、Spot 使用 | 利用率、节省金额 |
| Operate(运营) | 自动化策略、持续改进 | 成本偏差、预测准确率 |
1. 成本可见性——先看清钱花在哪
# 阿里云:通过费用中心查看账单
# 按实例、项目、标签维度分析支出
# AWS:Cost Explorer + Cost Allocation Tags
# 启用标签后,按 team/project/env 维度汇总
# 资源标签规范(推荐)
Environment: production | staging | dev
Team: backend | frontend | data
Project: order-service | user-service
CostCenter: engineering
default_tags 强制统一标签。成本分摊模型
标签解决"谁拥有",分摊模型解决"钱怎么算"。三种常见模型:
| 模型 | 原理 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| 直接分摊 | 资源费用 100% 计入拥有团队 | 清晰无争议 | 共享资源无人认领 | 应用服务器、专有数据库 |
| 比例分摊 | 按用量/流量占比拆分共享成本 | 共享成本可追溯 | 拆分规则需持续维护 | 共享 K8s 集群、NAT 网关 |
| 阶梯分摊 | 基础量计入平台池,超额计入使用方 | 激励节省,平台责任明确 | 规则较复杂 | 大数据 / ML 算力池 |
云厂商成本分析工具
# AWS Cost Explorer API:按标签维度拉取月度成本
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-07-01 \
--granularity MONTHLY \
--metrics "UnblendedCost" \
--group-by Type=TAG,Key=Team
# 阿里云账单 API:按实例与标签维度查询
aliyun bssopenapi QueryInstanceBill \
--BillingCycle 2026-06 --Granularity Monthly \
--ProductCode ecs
# 腾讯云:DescribeBillDetailByUin 账单明细接口
# 建议将多云账单统一导入 ClickHouse / Grafana 成本面板,
# 用同一套 SQL 做跨云对账,避免在每家控制台反复下钻。
成本归因:从账单到责任人
账单明细是「资源」视角,归属需要「责任人」视角。三级归因把两者串起来:
- 资源 → 团队:靠 env / project / team 标签,先定位到哪个团队的资源
- 团队 → 服务:project 标签对应到具体服务与负责人(owner)
- 服务 → 用途:结合创建人、创建时间与用量日志确认是生产负载还是临时实验
每一级都能被脚本自动查证(标签 API + 实例元数据),第三级通常需要人工确认——所以归因链路的终点不是数据库,而是负责人的承诺。
多云成本看板
# 每周把三家云账单导入 ClickHouse 统一表结构:
# bill_date / cloud / product / team / env / project / amount_cny
# 用一套 SQL 做跨云对比与异常检测:
SELECT team, SUM(amount_cny) FROM bills
WHERE bill_date >= today() - 30 GROUP BY team ORDER BY 2 DESC;
# 异常检测:环比突增 > 20% 的产品自动打标进告警队列
SELECT product, SUM(amount_cny) AS cur
FROM bills WHERE bill_date >= today() - 7
GROUP BY product HAVING cur > 1.2 * (
SELECT SUM(amount_cny) FROM bills
WHERE bill_date BETWEEN today() - 14 AND today() - 7);
# Grafana 画月度趋势 + 单位成本线,周会直接打开看板讲数据
标签策略实战
标签规范必须先行定义并强制注入,否则三个月后账单又变回一团乱麻。以下是一套可以直接照抄的规范:
标签命名规范
| 标签键 | 取值示例 | 用途 | 必填 |
|---|---|---|---|
| env | prod / staging / dev | 区分环境,支撑分环境预算与定时开关机 | 是 |
| project | order-service / user-service | 项目级成本归集与产品对账 | 是 |
| team | backend / frontend / data | 团队责任归属与分摊口径 | 是 |
| owner | zhangwei | 个人责任人与告警接收人 | 是 |
| cost-center | eng / marketing / finance | 财务核算科目 | 选填 |
| ttl | 2026-12-31 | 临时资源到期自动回收日期 | 选填 |
强制标签策略
# Terraform 层:default_tags 兜底,新资源自动注入
provider "aws" {
region = "ap-southeast-1"
default_tags {
tags = {
env = "dev"
team = "backend"
project = "order-service"
owner = "zhangwei"
}
}
}
# 平台层:AWS Organizations SCP / Config 规则、阿里云标签策略
# 组织策略禁止创建"未带必填标签"的资源(标签自动继承)
# 事后再加一道扫描兜底(见下节)
未打标资源治理
- 识别——用云平台"未标记资源"报告 + 脚本定期扫描(AWS Resource Groups Tagging API、阿里云 TagResources 接口),生成未打标资源清单。
- 追责——按资源类型分组派给对应团队限期 3 天补标;到期未补且无归属的,费用计入公共池并在月度复盘中点名。
- 清理——超过 30 天仍无人认领的资源(孤立 EIP、未挂载云盘、空闲 NAT 网关)直接回收,这部分往往是账单里的隐形漏洞。
# 未打标资源扫描(AWS:拉取全部资源再与已打标清单对比)
aws resourcegroupstaggingapi get-resources --no-include-compliance-details \
| jq -r '.ResourceTagMappingList[].ResourceARN' > /tmp/all.txt
aws resourcegroupstaggingapi get-resources \
--tag-filters Key=team,Values=backend \
| jq -r '.ResourceTagMappingList[].ResourceARN' > /tmp/tagged.txt
comm -23 <(sort /tmp/all.txt) <(sort /tmp/tagged.txt)
账单分析案例
案例一:某月账单突增 40% 的排查过程
背景:6 月账单环比增长 40%,财务要求 3 天内定位原因。按"总 → 分"逐层下钻:
# 第 1 步:按服务下钻,找出增长最多的产品
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-06-30 \
--granularity MONTHLY --metrics UnblendedCost \
--group-by Type=DIMENSION,Key=SERVICE
# 第 2 步:锁定 EC2 后按 region 下钻
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-06-30 \
--granularity MONTHLY --metrics UnblendedCost \
--group-by Type=DIMENSION,Key=REGION \
--filter '{"Dimensions":{"Key":"SERVICE","Values":["Amazon EC2"]}}'
定位过程:EC2 增长 62% → 集中在 ap-southeast-1 → 按实例 ID 核对用量,发现一台 8C32G 实例自 6 月 10 日起 24x7 运行。该实例未打 owner 标签,账单系统无法自动定位归属,最终靠资源创建人联系方式找到使用者。
根因:数据分析师手动在控制台创建实例做临时实验后忘记删除;实例没有 ttl 标签,自动化回收任务将其视为正常资源跳过。修复:立即删除实例,补上"手动创建资源必须携带 ttl"的规范;为所有临时资源设置到期自动回收。复盘:新增"资源创建 24 小时内未打全必填标签"自动告警。
案例二:跨区域流量费异常
现象:某月 NAT 网关与跨区域流量费突增 25%,业务方确认没有发布新功能。
- 按产品对比:VPC 内网流量正常,NAT 网关出口流量异常 → 锁定出口方向。
- 结合 VPC Flow Logs 按目的 IP 聚合:大量流量指向某云厂商对象存储域名,单日超过 200GB。
- 根因:开发环境一个数据同步脚本写死了生产环境备份桶地址,并开启递归下载,把生产备份反复同步到开发区域,产生大量跨区域流量费。
- 修复:修正脚本配置、限制开发环境出网白名单。复盘:为跨区域与出网流量单独设预算,异常波动 3 天内必须排查。
案例三:云盘费用翻倍
现象:块存储账单翻倍,业务无感知。下钻发现大量"孤盘"——实例已删除但云盘未随删。根因:开发同学手动删除 ECS 实例时未勾选"同时释放云盘",一个月内反复创建/删除实例,留下 47 块 100GB SSD 云盘空转计费。修复:一键清理孤盘,并在 Terraform 中设置 delete_with_instance = true(或 delete_on_termination);复盘:定期拉取"未挂载云盘"报告自动回收。
账单分析的通用套路
无论哪种异常,都按「总 → 分 → 定位 → 修复 → 复盘」五步走,前两步用 API 下钻,后三步靠流程:
# 1. 总:月度环比对比,定位异常产品与区域(见案例一)
# 2. 分:按标签 / 实例 ID 拆分到具体资源
# 3. 定位:核对资源创建时间、owner 标签、运行时长与用量日志
# 4. 修复:删资源 / 改配置 / 加规范,并补上自动化兜底
# 5. 复盘:把新规则写进标签规范与告警配置,防止复发
# 关键:异常必须在 3 天内定位——账单数据 T+1~T+3 才出账,
# 拖过一周再追,创建者自己都想不起来这资源是干嘛的
2. 资源右配(Right-Sizing)
最常见的浪费:实例规格过大、磁盘过大、带宽闲置。
| 场景 | 问题 | 优化 |
|---|---|---|
| 开发环境 | 24x7 运行的 8C16G 实例 | 用 Schedule 脚本工作时间开机 |
| 数据库 | 4C8G 实例 CPU 利用率 < 10% | 降配到 2C4G |
| 磁盘 | 500GB SSD,使用 30GB | 缩容或换 HDD |
| 带宽 | 100Mbps 固定,峰值 10Mbps | 换按量计费 |
# 阿里云:通过 Terraform 自动化定时开关机
# 开发环境实例:工作日 9:00-20:00 开机
resource "alicloud_cms_rule" "dev_schedule" {
rule_name = "dev-instance-schedule"
group_id = alicloud_cms_group.default.id
rule_targets {
json_expression = <
3. Spot Instance(竞价实例)
Spot Instance 是云厂商用闲置资源以折扣价出售的实例,价格通常是按需价的 10%-30%。适合无状态、可中断、容错性好的工作负载。
| 适用 | 不适用 |
|---|---|
| K8s 工作节点(Pod 可被驱逐) | 数据库主节点 |
| CI/CD Runner(构建可重试) | 单点服务 |
| 批处理任务(可中断重跑) | 需要持续运行的 API 服务 |
| 开发/测试环境 | 生产核心链路 |
# K8s Spot 节点池配置(阿里云 ACK)
apiVersion: v1
kind: NodePool
metadata:
name: spot-pool
spec:
instanceTypes: ["ecs.g7.2xlarge", "ecs.g7.xlarge"]
scalingConfig:
minSize: 0
maxSize: 10
desiredSize: 3
labels:
node-type: spot
taints:
- key: spot
value: "true"
effect: NoSchedule
---
# 工作负载容忍 Spot 节点
apiVersion: apps/v1
kind: Deployment
metadata:
name: batch-worker
spec:
template:
spec:
tolerations:
- key: spot
operator: Equal
value: "true"
effect: NoSchedule
nodeSelector:
node-type: spot
Spot 回收应对:被回收不是事故
Spot 的意义在于「便宜但可能被回收」。回收前云平台会提前通知(AWS 约 2 分钟、阿里云约 5 分钟),应用只需回答一个问题:收到通知后能否在时限内优雅退出?
# K8s 侧三条防线:
# 1. PDB:保证回收时存活副本数不低于底线
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: batch-worker-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: batch-worker
# 2. 节点打污点 + topologySpreadConstraints 分散副本,避免单节点故障全灭
# 3. 工作负载监听 SIGTERM 优雅退出:批处理任务记录 checkpoint,
# 重启后从断点续跑——这是「可重试」的真正含义
4. 预留实例与节省计划
| 类型 | 折扣 | 承诺 | 适合 |
|---|---|---|---|
| 包年包月 | 30-50% | 1-3 年 | 确定长期运行的核心服务 |
| 预留实例 | 20-40% | 1 年 | 稳定工作负载 |
| 节省计划 | 15-30% | 1-3 年 | 灵活实例类型 |
| 按量 | 0% | 无 | 临时/弹性负载 |
5. 自动化成本治理
# 成本告警脚本(阿里云账单 API)
#!/bin/bash
# 每月 1 号检查上月支出
COST=$(aliyun bssopenapi QueryBill --BillingCycle 2026-01 \
| jq -r '.Data.OutstandingAmount')
if (( $(echo "$COST > 5000" | bc -l) )); then
echo "上月云支出 $COST 元,超过预算 5000 元" | \
curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=xxx" \
-H 'Content-Type: application/json' \
-d '{"msgtype":"text","text":{"content":"'"告警:云支出 $COST 元"'"}'
fi
开发环境定时开关机
# cron + 云 API:工作日 9 点开机、20 点关机(阿里云)
0 9 * * 1-5 ali sh ecs StartInstance --InstanceId i-xxx
0 20 * * 1-5 ali sh ecs StopInstance --InstanceId i-xxx
# AWS 版:aws ec2 start-instances / stop-instances
# 更稳的做法:按标签批量操作,新实例自动纳入,不用维护实例清单
aliyun ecs DescribeInstances --Tag key=env,value=dev \
| jq -r '.Instances.Instance[].InstanceId' | while read id; do
aliyun ecs StopInstance --InstanceId $id
done
# 批量停 20 台以上实例前先发群通知,防止误停有人正在用的
闲置资源回收 runbook
# 每周巡检四项,发现即回收(先发群通知,24 小时无人认领再执行):
# 0. 先导出本月全量资源清单,与上月的 diff 找出新增资源
# 1. 孤立 EIP / 弹性公网 IP:未绑定实例的按小时计费
aliyun ecs DescribeEipAddresses --Status Available \
| jq -r '.EipAddresses.EipAddress[].AllocationId' \
| xargs -r -I{} aliyun ecs ReleaseEipAddress --AllocationId {}
# 2. 未挂载云盘:删除实例未随删的孤盘
# 3. 空闲 NAT 网关 / SLB:7 天无流量(看监控指标)即回收
# 4. 未使用快照:超过 180 天的重复快照按策略删除
# 5. 回收后更新资源台账,月度汇总「自动化回收总节省」
# 巡检脚本放入 cron + 告警:每周一 9 点自动跑,
# 产出「待回收清单 + 预估节省金额」推到群,确认后执行
回收原则:先通知、再回收、后复盘。任何回收动作前 24 小时发群通知并附预估节省金额;回收后记录实际节省,月度复盘汇总自动化回收的总节省——这是治理效果最直观的证明。
进阶优化手段
RI / Spot / 按需混合策略
| 负载类型 | 建议组合 | 理由 |
|---|---|---|
| 核心数据库、网关 | 预留 100% | 必须稳定,锁定最大折扣 |
| K8s 在线服务节点 | 按需 60% + 预留 40% | 保留兜底容量,防止 Spot 回收引发雪崩 |
| CI/CD、批处理 | Spot 80% + 按需 20% | 任务可重试,Spot 优先 |
| 开发测试 | 按需 + 定时开关机 | 弹性最大,不做长期承诺 |
Karpenter 与 Cluster Autoscaler
集群按需扩缩容能直接消除空闲节点成本:Cluster Autoscaler 以"存在 Pending Pod"为信号增减节点;Karpenter 更进一步,按 Pod 实际资源请求直接选择最便宜的实例,原生支持 Spot 混合与碎片整理。
# Cluster Autoscaler:配合 HPA,按负载水平扩缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server
spec:
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
# Karpenter:NodePool 声明可用实例类型与预算
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"]
- key: node.kubernetes.io/instance-type
operator: In
values: ["m6i.large", "m6i.xlarge", "c6i.large"]
disruption:
consolidationPolicy: WhenUnderutilized
expireAfter: 720h
存储分层(S3 / OSS 生命周期)
# S3 生命周期:日志 30 天转低频、90 天转归档、临时目录 7 天删除
aws s3api put-bucket-lifecycle-configuration --bucket my-app-data \
--lifecycle-configuration '{
"Rules": [
{"ID": "tier-logs", "Status": "Enabled",
"Filter": {"Prefix": "logs/"},
"Transitions": [
{"Days": 30, "StorageClass": "STANDARD_IA"},
{"Days": 90, "StorageClass": "GLACIER"}]},
{"ID": "expire-tmp", "Status": "Enabled",
"Filter": {"Prefix": "tmp/"},
"Expiration": {"Days": 7}}
]}'
# 阿里云 OSS:控制台"生命周期管理"或 ossutil 配置
ossutil lifecycle --method put oss://my-bucket --config lifecycle.xml
日志类数据通常占对象存储费用的 60% 以上:按"30 天转低频、90 天转归档、180 天删除"落地,存储成本可下降 70-80%。
6. 单位成本(Unit Economics)
总成本会随业务增长自然上升,只有「单位成本」才能衡量优化是否真实有效——成本涨幅是否跑赢业务涨幅:
| 业务指标 | 单位成本定义 | 观察方式 |
|---|---|---|
| 电商 | 每笔订单的基础设施成本 | 月成本 / 订单量 |
| API 服务 | 每百万请求成本 | 月成本 / 请求数 |
| 数据分析 | 每 TB 处理成本 | 算力成本 / 处理数据量 |
| SaaS 租户 | 每活跃租户成本 | 月成本 / 活跃租户数 |
# 用 Cost Explorer 数据 + 业务表 JOIN 生成单位成本曲线
# 月成本(按 product/team 标签汇总)÷ 当月业务量(从业务库导出)
# 单位成本环比下降 → 优化有效;持平或上升 → 成本增速跑赢业务,立即复盘
# 建议把单位成本做成月度看板并写入周会,比绝对金额更能推动决策
FinOps 组织实践
FinOps 不是财务部门单方面的事,而是财务、技术、产品三方协作的持续流程。以下是可落地的组织运转方式:
责任矩阵
| 阶段 | 财务 | 技术 | 产品 |
|---|---|---|---|
| Inform | 出账、分摊规则、预算发布 | 标签注入、账单数据接入与清洗 | 确认业务归属与成本负责人 |
| Optimize | 测算节省收益、审核承诺采购 | 右配、Spot、预留、架构优化 | 评估优化动作对业务的影响 |
| Operate | 月度复盘、偏差报告 | 告警自动化、回收执行 | 需求变更前同步成本影响 |
例会节奏
- 每日(自动)——未打标资源、预算超支 120%、环比突增超过 20% 的异常自动推送到钉钉/企微群,无需人工开会。
- 每周——15 分钟站会:只过 Top 5 变化项与待办,技术侧汇报优化进度。
- 每月——成本复盘会:按团队/项目出趋势图,识别异常,确定下月优化目标并写入团队 OKR。
- 每季度——预留实例/节省计划利用率审查,决定续购或释放;同时检讨分摊模型是否仍然合理。
预算与告警机制
# 预算基线:历史 3 个月平均支出 +20% 作为预算上限
# 告警分级:
# 一级 90% 预算 → 通知团队负责人
# 二级 100% → 通知财务与 CTO
# 三级 120% → 自动执行降级动作(暂停开发环境、Spot 缩容)
# AWS Budgets 示例:月度 5 万美元预算,90% 触发邮件告警
aws budgets create-budget \
--account-id 123456789012 \
--budget '{"BudgetName":"monthly-cost",
"BudgetLimit":{"Amount":"50000","Unit":"USD"},
"TimeUnit":"MONTHLY","BudgetType":"COST"}' \
--notifications-with-subscribers \
'[{"Notification":{"ComparisonOperator":"GREATER_THAN",
"Threshold":90,"NotificationType":"ACTUAL"},
"Subscribers":[{"Address":"finops@example.com",
"SubscriptionType":"EMAIL"}]}]'
# 阿里云:费用中心"预算管理"同样支持按百分比分级通知
常见错误
- 资源未打标签导致无法分摊成本:部分云资源(如 ELB、NAT 网关)创建时未打标签,月底账单无法归属到团队。解决:在 Terraform 中用
default_tags强制统一标签,定期用云平台的"未标记资源"报告清理遗漏。 - Spot 实例频繁被回收导致服务中断:将有状态服务(如数据库)部署在 Spot 节点上。排查:检查云平台的回收通知,确认工作负载是否真正无状态;对核心服务使用按量或预留实例,Spot 仅用于可中断的批处理任务。
- 预留实例到期后费用飙升:忘记续费或业务缩减后预留实例闲置。排查:设置到期前 30 天告警,定期审查预留实例利用率,利用率低于 60% 的考虑在到期后切换为按量。
- 开发环境 24x7 运行浪费严重:开发/测试实例未设置定时开关机,下班和周末持续计费。排查:用云平台的"实例运行时长"报告识别高时长实例,配置 Terraform 或云监控定时任务在非工作时间自动关机。
- 成本告警阈值设置不合理:告警过于频繁导致"狼来了"效应,或过于宽松导致超支未发现。解决:按历史支出的 120% 设置一级告警,150% 设置二级告警并自动通知负责人,避免无效告警。
- 单位成本没有业务量分母:只看绝对金额,业务增长 30% 时成本增长 20% 会被误判为「控制住了」。必须把成本除以业务指标(订单/请求/租户数)再环比。
- Spot 回收前未做优雅退出演练:批处理任务没有 checkpoint,节点回收时任务从头重跑,Spot 节省的成本被重跑算力吃掉。定期手动回收节点验证。
最佳实践
- 标签规范先行:在创建任何云资源之前定义标签规范(Environment、Team、Project、CostCenter),并在 Terraform
provider块中用default_tags强制注入,从源头杜绝遗漏。 - 混合计费策略:核心稳定负载(数据库、API 网关)用预留/包年包月锁定折扣,弹性负载(CI/CD、批处理)用按量 + Spot 组合,开发环境用定时开关机。不要"一刀切"全用按量或全用预留。
- 定期做成本复盘:每月召开 FinOps 会议,拉出按团队/项目的成本趋势图,识别异常增长。将成本指标纳入团队 OKR,让"省钱"成为每个人的责任而不是财务部门的事。
- 自动化治理:用脚本或云平台原生工具实现:未标记资源自动告警、闲置资源自动回收、预算超支自动暂停非核心服务。减少人工干预,避免"知道该省但没人做"。
- 先看见,再优化:不要跳过 Inform 阶段直接砍资源。先花 2-4 周建立完整的成本可见性(标签、分账、告警),再基于数据做优化决策,否则可能误砍关键资源。
- 按标签批量治理:所有运维动作(关机、扩容、扫描)都按标签执行而非维护实例清单——实例是流动的,标签是稳定的。
- 单位成本进周报:把单位成本做成月度看板并写入周会,比绝对金额更能推动优化决策。
- 回收先通知再执行:任何闲置资源回收前 24 小时发群通知并附预估节省金额,无人认领再执行——回收是治理手段,不是惊喜。
练习题
- 用 Terraform 为你的云项目编写一个标签检查脚本:扫描所有 ECS 实例,输出未打
Team和Project标签的实例列表,并生成 CSV 报告。 - 设计一个 Spot + 按量混合的 K8s 节点池方案:编写 YAML 配置,要求批处理任务(
batch-worker)调度到 Spot 节点,API 服务(api-server)调度到按量节点,并配置相应的污点容忍和节点选择器。 - 编写一个成本告警脚本,每天检查云账户余额,当余额低于 1000 元时发送钉钉告警,低于 500 元时自动停止所有非生产环境实例。思考:如何避免误停生产环境?
- 给你的业务算一次单位成本:定义合适的业务指标(订单/请求/租户),画出最近 6 个月的单位成本曲线,找出成本增速跑赢业务增速的月份并归因。
- 写一个「Spot 回收演练」脚本:手动终止一台 Spot 节点,记录批处理任务的断点恢复行为,输出一份演练报告。
- 模拟一次账单突增排查:人为创建一台无标签实例并制造跨区域流量,用账单 API 从产品 → 区域 → 实例 ID 逐层下钻定位它,记录每一步耗时。
本章总结
FinOps 的核心是把云成本责任带回每个团队:先用标签与分账建立完整可见性,再通过右配、Spot 与预留实例的组合优化支出。优化决策必须基于数据,并配合预算告警、定期复盘与自动化治理持续运营。
延伸阅读
- 4.15:Terraform 入门 Terraform 基础设施即代码入门
- 6.10:云网络基础 云网络基础——VPC、安全组与 cloud-init
- k8s 自动扩缩容章节——HPA 与 Cluster Autoscaler
- 4.14:运维故障案例集 运维故障案例集——账单激增与资源泄漏事故复盘
- 4.7:压力测试实战 压力测试实战——容量规划与成本边界
- chaos01 混沌工程——故障注入与韧性验证