4、成本数据采集方法:Prometheus + kube-state-metrics + node-exporter + cost-analyzer 数据采集架构

在 Kubernetes 集群升级场景中,成本基线对比的准确性完全依赖于底层数据的采集质量。本章将深入剖析以 Prometheus 为核心、kube-state-metrics、node-exporter 和 cost-analyzer 为数据源的采集架构,确保每一笔资源消耗都能被精确捕获并关联到成本维度。

4.1 采集架构总览

该架构采用“拉取(Pull)”与“推送(Push)”混合模式,通过 Prometheus 作为时序数据库统一存储,再经由 cost-analyzer 进行成本分摊计算。整体数据流分为三层:基础设施指标层、Kubernetes 对象状态层、成本聚合层。

成本数据采集架构总览 基础设施指标层 node-exporter 采集:CPU / 内存 / 磁盘 / 网络 节点级别资源使用率 每秒采样一次 暴露端口 :9100 K8s 对象状态层 kube-state-metrics 监听 API Server Pod / Deployment / HPA 状态 资源请求与限制 暴露端口 :8080 成本聚合层 cost-analyzer 成本分摊计算引擎 集群 / 命名空间 / 标签维度 输出成本基线报表 暴露端口 :9001 Prometheus 时序数据库 统一存储 / 查询 / 告警 Pull /metrics Pull /metrics 查询历史数据 成本基线对比 & 异常检测 升级前后成本差异分析
架构要点:Prometheus 通过 ServiceMonitor 自动发现各 exporter 端点,无需手动配置每个目标。cost-analyzer 本身不直接采集原始指标,而是从 Prometheus 查询聚合后的数据,再结合云供应商定价模型计算成本。

4.2 核心组件详解

4.2.1 node-exporter:节点资源使用率

node-exporter 部署在每个 Kubernetes 节点上(DaemonSet),负责暴露操作系统级别的硬件与内核指标。它是判断升级后节点资源利用率是否异常的基础数据源。

指标类别 关键指标 用途
CPU node_cpu_seconds_total 计算 CPU 使用率,识别升级后 CPU 压力变化
内存 node_memory_MemTotal_bytes
node_memory_MemAvailable_bytes
检测内存泄漏或分配异常
磁盘 node_disk_io_time_seconds_total 分析 I/O 瓶颈,升级后存储驱动变化影响
网络 node_network_receive_bytes_total 追踪网络流量基线,识别异常突增
升级前后对比关键点:记录升级前 7 天的 node_cpu_seconds_total 和 node_memory_MemAvailable_bytes 均值,升级后若偏差超过 15%,则触发成本异常告警。

4.2.2 kube-state-metrics:K8s 对象状态

kube-state-metrics 通过监听 Kubernetes API Server,生成关于 Deployment、StatefulSet、Pod、HPA 等资源对象的元数据指标。它不直接采集资源使用率,而是提供“资源规格”与“副本数”等状态信息,是成本分摊计算中“资源请求量”的来源。

# 示例:kube-state-metrics 暴露的 Pod 资源请求指标
kube_pod_container_resource_requests{container="nginx", namespace="prod", resource="cpu", unit="core"} 0.5
kube_pod_container_resource_requests{container="nginx", namespace="prod", resource="memory", unit="byte"} 2.147483648e+09
kube_deployment_spec_replicas{deployment="web-app", namespace="prod"} 3
注意:kube-state-metrics 不采集实际使用量,只采集“期望状态”。实际使用量需要结合 node-exporter 或 cAdvisor 指标。成本基线对比时,必须同时使用“请求量”和“实际使用量”两个维度,避免因资源超分导致成本低估。

4.2.3 cost-analyzer:成本分摊引擎

cost-analyzer(Kubecost 开源核心组件)从 Prometheus 读取 node-exporter 和 kube-state-metrics 的数据,结合用户配置的云供应商价格模型(如 AWS EKS 节点单价、Azure AKS 实例费率),将集群总成本按 CPU、内存、存储、网络等维度分摊到每个命名空间、Deployment 甚至 Pod。

分摊维度 数据来源 分摊逻辑
命名空间 kube-state-metrics 按命名空间内所有 Pod 的资源请求量比例分摊节点成本
标签(Label) kube-state-metrics 支持自定义标签聚合,如 app、team、env
控制器 kube-state-metrics Deployment / StatefulSet 级别成本汇总
节点 node-exporter + 云价格 按节点类型(如 m5.large)的每小时单价计算

4.3 采集配置示例

以下为 Prometheus 采集配置的核心片段,展示如何通过 ServiceMonitor 自动发现各 exporter 端点:

# prometheus-adapter 或 Prometheus Operator 的 ServiceMonitor 配置
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: node-exporter-monitor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: node-exporter
  endpoints:
  - port: http-metrics
    interval: 30s
    scrapeTimeout: 10s
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-state-metrics-monitor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: kube-state-metrics
  endpoints:
  - port: http-metrics
    interval: 60s
    scrapeTimeout: 30s

4.4 数据采集质量保障

成本基线对比的可靠性取决于数据采集的完整性与一致性。升级前后必须确保以下条件:

  • 采集周期一致:升级前后使用相同的 scrape_interval(建议 30s),避免因采样粒度不同导致基线偏差。
  • 指标保留时长:Prometheus 本地存储建议保留至少 30 天数据,以便回看升级前基线。
  • 标签一致性:确保升级前后命名空间、标签命名规则不变,否则 cost-analyzer 的分摊逻辑会断裂。
  • 节点数量与规格:记录升级前后的节点列表(实例类型、数量),作为成本对比的固定参照系。
数据采集质量保障流程 步骤 1 确认采集周期 scrape_interval=30s 步骤 2 检查保留时长 ≥ 30 天 步骤 3 验证标签一致性 namespace / label 步骤 4 记录节点清单 实例类型 & 数量 可对比的成本基线 升级前后数据口径一致,异常检测可信

4.5 升级前后成本基线对比的数据准备

在升级操作执行前,必须完成以下数据采集与基线固化工作:

  1. 导出升级前 7 天成本快照:通过 cost-analyzer API 获取命名空间级别的每日成本 CSV。
  2. 标记基线时间窗口:在 Prometheus 中记录 upgrade_before_timestamp 标签,用于后续查询过滤。
  3. 备份 Prometheus 数据:使用 snapshot API 创建数据快照,防止升级过程中数据丢失。
  4. 部署升级后采集验证:升级完成后立即检查所有 exporter 端点是否正常返回数据,确保采集链路无中断。
实战建议:在升级前使用 cost-analyzer 的 /api/v1/allocation 接口导出 JSON 格式的成本分配数据,作为“黄金基线”存档。升级后若发现成本偏差超过 10%,优先检查 node-exporter 和 kube-state-metrics 的指标是否完整,而非直接怀疑升级本身。