19.10.3 成本模型、分摊与优化策略
成本模型、分摊与优化策略#
成本治理以“可度量、可归因、可优化”为目标,建立统一成本模型与分摊规则,形成从资源到业务的成本透明化链路,为预算编制与优化决策提供依据。
原理草图(资源→计量→分摊→优化)
1. 成本模型构成(示例口径与字段)
- 资源维度:CPU/内存/实例、存储容量与IOPS、带宽流量、公网IP、中间件实例规格与授权。
- 生命周期维度:CAPEX、OPEX、折旧摊销、云账单(预留/按需)。
- 服务维度:监控、日志、CI/CD平台成本与共享基础设施成本(机房/链路)。
示例:成本数据表结构(MySQL)
-- 文件: /opt/ops_cost/schema.sql
CREATE TABLE cost_usage (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
biz_tag VARCHAR(64),
proj_tag VARCHAR(64),
env_tag VARCHAR(16),
region VARCHAR(32),
resource_type VARCHAR(32), -- cpu/mem/volume/bandwidth/middleware
resource_id VARCHAR(64),
usage_qty DECIMAL(18,4),
unit VARCHAR(16), -- core-hour/GB/月/GB-流量
unit_price DECIMAL(18,4),
cost DECIMAL(18,4),
usage_date DATE
);
CREATE TABLE cost_share_rule (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
share_type VARCHAR(32), -- platform/shared
rule_key VARCHAR(64), -- 按业务占比/按实例数
rule_value DECIMAL(10,4)
);
2. 成本归集与分摊方法(含可执行示例)
2.1 标签校验与归集示例(Kubernetes)
# 检查资源是否带业务标签(biz)
kubectl get ns --show-labels | grep -v 'biz='
# 为命名空间补齐标签
kubectl label ns payment biz=pay proj=core env=prod
# 查询某业务资源
kubectl get pod -A -l biz=pay
2.2 成本分摊SQL(直接+间接)
-- 文件: /opt/ops_cost/allocate.sql
-- 直接分摊:按用量计费
SELECT biz_tag, proj_tag, SUM(cost) AS direct_cost
FROM cost_usage
WHERE usage_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY biz_tag, proj_tag;
-- 间接分摊:平台服务按业务占比分摊
-- 假设共享成本表汇总为 10000
SELECT c.biz_tag,
c.direct_cost,
10000 * c.direct_cost / t.total AS shared_cost,
c.direct_cost + 10000 * c.direct_cost / t.total AS total_cost
FROM (
SELECT biz_tag, SUM(cost) AS direct_cost
FROM cost_usage
WHERE usage_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY biz_tag
) c
JOIN (
SELECT SUM(cost) AS total
FROM cost_usage
WHERE usage_date BETWEEN '2024-01-01' AND '2024-01-31'
) t;
2.3 成本报表导出(CSV)
# 导出某业务成本报表
mysql -h 127.0.0.1 -uroot -p'pass' -e "source /opt/ops_cost/allocate.sql" > /opt/ops_cost/report.txt
# 只输出直接成本到CSV
mysql -h 127.0.0.1 -uroot -p'pass' -e \
"SELECT biz_tag, proj_tag, SUM(cost) AS direct_cost
FROM cost_usage
WHERE usage_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY biz_tag, proj_tag;" \
| sed 's/\t/,/g' > /opt/ops_cost/direct_cost.csv
3. 成本优化策略(含执行示例)
3.1 低利用率识别(Prometheus指标示例)
# 过去7天CPU平均利用率低于10%的节点
avg_over_time(rate(node_cpu_seconds_total{mode!="idle"}[5m])[7d:]) < 0.1
3.2 资源规格优化(Kubernetes)
# 文件: /opt/ops_cost/resize.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
namespace: payment
spec:
replicas: 2
template:
spec:
containers:
- name: api
image: example/api:v1
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
# 应用并观察资源变化
kubectl apply -f /opt/ops_cost/resize.yaml
kubectl top pod -n payment
3.3 生命周期治理(定时关停测试环境)
# 文件: /opt/ops_cost/stop_test_env.sh
#!/bin/bash
NS=test
kubectl scale deploy -n $NS --replicas=0 --all
kubectl get deploy -n $NS
# 加入crontab(每晚20:00)
0 20 * * * /bin/bash /opt/ops_cost/stop_test_env.sh
4. 安装与落地参考(示例栈)
- MySQL 用于成本明细存储
- Prometheus 用于资源利用率与成本优化指标
- Grafana 用于报表可视化
MySQL安装(示例)
# Ubuntu
apt-get update && apt-get install -y mysql-server
systemctl enable --now mysql
# 初始化库
mysql -uroot -e "CREATE DATABASE ops_cost;"
mysql -uroot ops_cost < /opt/ops_cost/schema.sql
Prometheus安装(示例)
useradd -r -s /bin/false prometheus
tar -zxvf prometheus-2.49.1.linux-amd64.tar.gz -C /opt
ln -s /opt/prometheus-2.49.1.linux-amd64 /opt/prometheus
/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml
5. 排错清单(成本归集不准)
- 标签缺失:kubectl get ns --show-labels | grep -v 'biz='
- 数据缺口:检查采集任务是否延迟/失败
- 单位口径不一致:检查 unit 和 unit_price 是否匹配
- 共享成本重复计入:对比分摊前后总额是否守恒
- 资源映射失败:检查 resource_id 与资产表是否匹配
排错示例命令
# 检查近7天是否有空值成本
mysql -uroot ops_cost -e "SELECT COUNT(*) FROM cost_usage WHERE cost IS NULL;"
# 检查标签缺失导致无法分摊
mysql -uroot ops_cost -e "SELECT COUNT(*) FROM cost_usage WHERE biz_tag IS NULL OR biz_tag='';"
6. 练习与检验
1. 为3个命名空间补齐 biz/proj/env 标签,并导出分摊报表。
2. 使用PromQL筛选低利用率节点,输出可能的降配清单。
3. 设计一条分摊规则:平台监控成本按业务直接成本占比分摊,并验证总额守恒。
4. 实现测试环境夜间关停脚本,并在第二天9点恢复运行。
关键指标
- 资源利用率、单位业务成本(如每万请求成本)、共享成本占比、闲置资源比例、月度成本波动率、优化节省金额。
通过统一成本模型与分摊体系,建立资源到业务的可追溯成本链路,形成“预算—执行—优化—反馈”的闭环治理机制。