3、资源画像基础:什么是资源画像(Resource Profiling)、CPU/内存/网络/存储的度量指标、画像数据的采集来源(Prometheus、cAdvisor、Kube-state-metrics)

3.1 什么是资源画像(Resource Profiling)

资源画像是指通过持续观测、采集和分析云原生工作负载在 CPU、内存、网络、存储等维度上的实际使用数据,形成对应用资源需求特征的结构化描述。它不同于简单的“峰值监控”,而是从时间序列、分布规律、关联性等角度,揭示应用的真实资源消耗模式。

在 FinOps 实践中,资源画像是成本优化的基础——只有准确理解“应用到底需要多少资源”,才能避免过度配置(Over-provisioning)导致的浪费,以及配置不足(Under-provisioning)引发的性能风险。

核心价值:资源画像将“猜测式资源分配”转变为“数据驱动的资源决策”,是云原生成本治理的第一道关卡。
资源画像概念框架 资源画像 数据采集层 指标聚合层 分析建模层 CPU 画像 内存画像 网络/存储画像 输出:资源需求基线、波动特征、峰值/均值比、资源利用率分布

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"}
资源画像数据采集架构 Kubernetes 集群 Node 1 Pod A Pod B Node 2 Pod C Pod D Node 3 Pod E Pod F cAdvisor(内嵌 kubelet) cAdvisor(内嵌 kubelet) cAdvisor(内嵌 kubelet) Prometheus Server Kube-state-metrics PromQL 查询 → 资源画像数据集 cAdvisor 提供容器运行时指标(实际使用量) Kube-state-metrics 提供资源声明指标(Request / Limit)

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% 的资源波动特征。