4. 资源画像基础:Pod资源画像定义、CPU/Memory画像指标、画像数据采集源
资源画像是云原生成本优化的第一道工序。没有准确的资源画像,FinOps 协同就失去了数据锚点。本章聚焦 Pod 级别的资源画像定义、核心指标体系和数据采集源,为后续的画像分析与成本优化建立数据基础。
4.1 Pod资源画像定义
Pod 资源画像是指对 Kubernetes 集群中每个 Pod 及其容器的资源使用行为进行量化描述的过程。它不同于简单的“当前使用量”监控,而是通过时间序列数据提炼出 Pod 的资源使用特征,包括:
- 稳态使用量:Pod 在正常运行状态下的资源消耗基线。
- 峰值与谷值:资源使用的波动范围与频率。
- 资源利用率:实际使用量相对于 Request/Limit 的比例。
- 资源浪费量:已申请但未使用的资源量。
核心认知:资源画像不是一次性的快照,而是基于时间窗口(通常为 7 天或 30 天)的统计模型。画像的粒度越细、时间跨度越长,对 FinOps 决策的支撑越强。
4.2 CPU/Memory画像指标
CPU 和 Memory 是资源画像中最核心的两个维度。下表列出了每个维度的关键画像指标及其业务含义:
| 维度 | 指标名称 | 计算方式 | FinOps 含义 |
|---|---|---|---|
| CPU | CPU 平均使用率 | avg(container_cpu_usage_seconds_total) / Request | 判断 Request 是否过高,是否存在降配空间 |
| CPU P95 使用率 | percentile(0.95, cpu_usage) / Request | 识别突发负载,指导 Limit 设置 | |
| CPU 闲置率 | (Request - avg_usage) / Request | 量化资源浪费,驱动降配或缩副本 | |
| CPU 节流率 | throttled_time / (period * cpu_count) | 检测资源不足导致的性能瓶颈 | |
| Memory | Memory 平均使用量 | avg(container_memory_working_set_bytes) | 评估基础内存需求 |
| Memory 最大使用量 | max(container_memory_working_set_bytes) | 防止 OOM,指导 Limit 设定 | |
| Memory 利用率 | avg_usage / Request | 判断内存申请是否合理 | |
| Memory 浪费量 | Request - max_usage | 直接计算可回收资源量 |
常见误区:仅使用平均值做画像会导致对突发型 Pod 的误判。建议同时使用 P50、P95、P99 分位数,并结合时间维度(白天/夜间、工作日/周末)进行分层分析。
4.3 画像数据采集源
Kubernetes 生态中,Metrics Server 和 Prometheus 是最主流的两种数据采集源。它们在数据精度、存储周期和查询能力上存在显著差异,适用于不同的画像场景。
4.3.1 Metrics Server
- 定位:Kubernetes 内置的轻量级资源度量组件,用于 HPA 和 kubectl top 命令。
- 数据特点:仅保留当前时刻的瞬时数据,无历史存储。
- 采集指标:CPU 使用率(millicores)、Memory 使用量(bytes)。
- 适用场景:实时查看、快速诊断、HPA 动态扩缩容。
- 局限性:无法做历史趋势分析和分位数计算,不适合深度画像。
4.3.2 Prometheus
- 定位:云原生监控事实标准,支持多维数据模型和强大查询语言 PromQL。
- 数据特点:拉取模式,可配置保留周期(通常 15~30 天),支持聚合与降采样。
- 采集指标:container_cpu_usage_seconds_total、container_memory_working_set_bytes、container_network_receive_bytes_total 等。
- 适用场景:资源画像分析、成本分摊、历史趋势、异常检测。
- 优势:支持自定义标签、分位数计算、长时间窗口聚合。
生产建议:在 FinOps 实践中,Metrics Server 用于实时监控与告警,Prometheus 用于离线画像与成本分析。两者互补,缺一不可。建议将 Prometheus 数据保留周期设置为至少 30 天,以支持月度成本复盘。
4.4 数据采集架构
下图展示了从 Pod 到画像数据的完整采集链路,以及 Metrics Server 和 Prometheus 在架构中的位置:
4.5 关键采集指标清单
在进行资源画像时,需要从 Prometheus 中采集以下核心指标。建议在 Prometheus 的 scrape_config 中明确配置这些指标,避免采集过多无关数据:
| 指标名称 | 类型 | 标签示例 | 说明 |
|---|---|---|---|
container_cpu_usage_seconds_total |
Counter | pod, namespace, container | CPU 累计使用时间,用于计算 CPU 使用率 |
container_memory_working_set_bytes |
Gauge | pod, namespace, container | 容器当前工作集内存,最接近 OOM 判断 |
container_memory_rss |
Gauge | pod, namespace, container | 常驻内存,用于分析内存分配效率 |
container_network_receive_bytes_total |
Counter | pod, namespace | 网络入流量,辅助判断网络密集型 Pod |
container_network_transmit_bytes_total |
Counter | pod, namespace | 网络出流量 |
PromQL 示例:计算某个 Pod 过去 7 天的 CPU 平均使用率(相对于 Request)
avg(
rate(container_cpu_usage_seconds_total{namespace="production", pod="web-app-7d8f9c"}[5m])
) /
kube_pod_container_resource_requests{resource="cpu", namespace="production", pod="web-app-7d8f9c"}
* 100
4.6 数据采集最佳实践
- 采集频率:Prometheus 默认 15s 拉取一次,对于资源画像建议保持 30s 以内,避免数据稀疏导致分位数失真。
- 标签保留:确保 Prometheus 采集时保留
pod、namespace、container标签,这是后续按工作负载聚合画像的基础。 - 数据降采样:对于超过 30 天的历史数据,使用 Prometheus 的 recording rules 将原始数据降采样为 5 分钟或 1 小时粒度,平衡存储成本与查询性能。
- 避免指标爆炸:对于高基数标签(如
pod标签随 Deployment 滚动更新而变化),建议使用__meta_kubernetes_pod_annotation_*或kube_pod_labels进行关联,而非直接采集原始 pod 名称。
避坑提醒:不要直接使用
kubectl top pod 的输出作为资源画像的原始数据。该命令仅返回瞬时值,且受 Metrics Server 的聚合窗口影响,无法反映 Pod 的真实使用特征。所有正式的画像分析必须基于 Prometheus 的时间序列数据。