3、资源画像基础:什么是资源画像(Resource Profiling)、CPU/内存/网络/存储的度量指标、画像数据的采集来源(Prometheus、cAdvisor、Kube-state-metrics)
3.1 什么是资源画像(Resource Profiling)
资源画像是指通过持续观测、采集和分析云原生工作负载在 CPU、内存、网络、存储等维度上的实际使用数据,形成对应用资源需求特征的结构化描述。它不同于简单的“峰值监控”,而是从时间序列、分布规律、关联性等角度,揭示应用的真实资源消耗模式。
在 FinOps 实践中,资源画像是成本优化的基础——只有准确理解“应用到底需要多少资源”,才能避免过度配置(Over-provisioning)导致的浪费,以及配置不足(Under-provisioning)引发的性能风险。
核心价值:资源画像将“猜测式资源分配”转变为“数据驱动的资源决策”,是云原生成本治理的第一道关卡。
3.2 CPU / 内存 / 网络 / 存储的度量指标
资源画像的度量指标分为四个维度,每个维度关注不同的资源特征。以下是各维度的核心指标及其在 FinOps 中的意义:
| 维度 | 核心指标 | 单位 | FinOps 关注点 |
|---|---|---|---|
| CPU | container_cpu_usage_seconds_total node_cpu_seconds_total |
Core(核) millicore(m) |
CPU 利用率 vs Request 比例; 闲置核数浪费 |
| 内存 | container_memory_working_set_bytes container_memory_rss |
Bytes(GiB / MiB) | 内存实际占用 vs Limit 差距; OOM 风险与过度配置平衡 |
| 网络 | container_network_receive_bytes_total container_network_transmit_bytes_total |
Bytes/s Packets/s |
跨可用区流量成本; NAT / LB 带宽费用 |
| 存储 | container_fs_usage_bytes container_fs_writes_bytes_total |
Bytes IOPS |
持久卷(PV)容量利用率; 存储类型选择(SSD vs HDD) |
实践建议:在资源画像初期,优先关注 CPU 和内存指标,这两个维度通常占云原生环境总成本的 70% 以上。网络和存储指标在涉及跨区域流量或高 IO 场景时再重点分析。
3.3 画像数据的采集来源
Kubernetes 生态提供了三个核心数据采集组件,它们共同构成了资源画像的数据管道:
3.3.1 Prometheus —— 时序数据存储与查询引擎
Prometheus 是整个监控体系的核心,负责拉取(Pull)各暴露端点的指标数据,并提供 PromQL 查询语言用于画像分析。它通过 ServiceMonitor 或 PodMonitor 自动发现目标。
# 查询 Pod 级别 CPU 使用率(过去 5 分钟平均)
rate(container_cpu_usage_seconds_total{namespace="production", pod=~".+"}[5m])
# 查询内存工作集大小(按 Pod 聚合)
container_memory_working_set_bytes{namespace="production"}
3.3.2 cAdvisor —— 容器资源指标采集器
cAdvisor(Container Advisor)内嵌在 kubelet 中,自动采集每个容器的 CPU、内存、网络、文件系统等细粒度指标。它是 container_* 系列指标的来源,无需额外部署。
| 指标前缀 | 示例指标 | 说明 |
|---|---|---|
| container_cpu_ | container_cpu_usage_seconds_total | CPU 累计使用时间(用于 rate 计算) |
| container_memory_ | container_memory_working_set_bytes | 容器实际占用的物理内存(含缓存) |
| container_network_ | container_network_receive_bytes_total | 容器网络接口接收字节数 |
| container_fs_ | container_fs_usage_bytes | 容器文件系统已用空间 |
3.3.3 Kube-state-metrics —— 资源对象状态指标
Kube-state-metrics(KSM)不采集容器运行时指标,而是将 Kubernetes 资源对象(Pod、Deployment、Node、Namespace 等)的状态转换为 Prometheus 指标。它提供资源声明(Request / Limit)与调度状态信息,是资源画像中“期望值”与“实际值”对比的关键数据源。
# 查询 Pod 的 CPU Request 总量(按 Namespace 聚合)
sum(kube_pod_container_resource_requests{resource="cpu"}) by (namespace)
# 查询 Pod 的 CPU Limit 总量
sum(kube_pod_container_resource_limits{resource="cpu"}) by (namespace)
# 查询节点可分配资源
kube_node_status_allocatable{resource="cpu"}
3.4 三源数据对比:画像分析的关键
资源画像的核心分析逻辑是将三个数据源的信息进行交叉对比:
- 实际使用量(来自 cAdvisor):容器真实消耗的 CPU / 内存 / 网络 / 存储
- 资源声明量(来自 Kube-state-metrics):Pod 定义的 Request 和 Limit
- 节点容量(来自 Kube-state-metrics + Node Exporter):集群可分配资源总量
常见误区:仅依赖 cAdvisor 的实时指标做画像,忽略 Kube-state-metrics 的 Request/Limit 数据,会导致无法判断“资源浪费”的程度。例如:一个 Pod 实际只使用 100m CPU,但 Request 设置为 500m,浪费率高达 80%——这种信息只有通过对比才能发现。
3.5 资源画像数据采集清单
| 数据源 | 采集方式 | 关键指标 | 采集频率建议 |
|---|---|---|---|
| cAdvisor | kubelet 内置,Prometheus 自动拉取 | container_cpu_usage_seconds_total container_memory_working_set_bytes |
15s - 30s |
| Kube-state-metrics | 独立 Deployment,暴露 /metrics 端点 | kube_pod_container_resource_requests kube_pod_container_resource_limits |
30s - 60s |
| Node Exporter | DaemonSet 部署,暴露节点级指标 | node_cpu_seconds_total node_memory_MemTotal_bytes |
15s - 30s |
生产建议:采集频率不宜过高(< 10s),否则会增加 Prometheus 存储成本和 API Server 负载。对于资源画像场景,15s 的采集粒度足以捕捉 99% 的资源波动特征。