4. 成本分摊数据采集:Metrics Server、Prometheus、kube-state-metrics 的数据采集机制

成本分摊模型的精度直接取决于底层数据采集的完整性与时效性。在云原生环境中,Metrics Server、Prometheus 与 kube-state-metrics 是三大核心数据源,分别负责资源指标、监控指标与状态元数据的采集。理解三者的采集机制,是构建可靠成本分摊管道的前提。

4.1 三大数据源的角色定位与数据差异

数据源 核心角色 采集对象 数据保留周期 典型指标示例
Metrics Server 集群资源聚合器 Pod / Node 的 CPU、内存实时用量 仅内存缓存(约 5-15 分钟) pod_cpu_usage_cores
Prometheus 监控与告警平台 容器、节点、应用自定义指标 本地存储(默认 15 天) container_cpu_usage_seconds_total
kube-state-metrics Kubernetes 对象状态导出器 Deployment、Pod、Namespace 等资源对象状态 随 Prometheus 拉取周期更新 kube_pod_container_resource_requests
关键认知: Metrics Server 提供的是“瞬时快照”,适合 HPA 等实时决策;Prometheus 提供“时间序列”,适合成本趋势分析;kube-state-metrics 提供“资源配置声明”,是计算资源请求(Requests)与限制(Limits)分摊比例的基础。

4.2 Metrics Server:轻量级资源聚合器

Metrics Server 通过 Kubelet Summary API 从每个 Node 上的 kubelet 收集 Pod 与 Node 的 CPU、内存使用数据。其采集链路如下:

  1. kubelet 内置 cAdvisor:在每个 Node 上采集容器级别的 cgroup 统计信息。
  2. Summary API 暴露:kubelet 在 /stats/summary 端点聚合本节点所有 Pod 的资源使用数据。
  3. Metrics Server 轮询:Metrics Server 通过 Node 列表,以 --kubelet-port(默认 10250)向每个 Node 发起 HTTPS 请求。
  4. 聚合与缓存:Metrics Server 将数据缓存在内存中,并通过 metrics.k8s.io API 对外暴露。
# Metrics Server 采集周期与端口配置示例(Deployment 环境变量)
--kubelet-preferred-address-types=InternalIP
--kubelet-insecure-tls
--metric-resolution=60s   # 默认 60 秒采集一次
安全注意: Metrics Server 默认使用 kubelet 的 10250 端口,该端口需要有效的 TLS 证书。在生产环境中,应避免使用 --kubelet-insecure-tls,建议配置证书轮换或使用 ServiceAccount 认证。

4.3 Prometheus:多维时间序列采集引擎

Prometheus 采用 Pull 模型,通过 Service Discovery 动态发现目标并抓取指标。在成本分摊场景中,Prometheus 主要采集两类指标:

  • 容器资源指标:通过 cadvisor 指标暴露,如 container_cpu_usage_seconds_total、container_memory_working_set_bytes。
  • Kubernetes 组件指标:kube-controller-manager、kube-scheduler 等组件的性能指标。

Prometheus 的采集配置核心在于 scrape_config,以下是一个针对容器指标与 kube-state-metrics 的典型配置片段:

scrape_configs:
  - job_name: 'kubernetes-cadvisor'
    scheme: https
    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    bearer__file: /var/run/secrets/kubernetes.io/serviceaccount/
    kubernetes_sd_configs:
      - role: node
    relabel_configs:
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

  - job_name: 'kube-state-metrics'
    static_configs:
      - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']

4.4 kube-state-metrics:资源状态元数据导出器

kube-state-metrics 本身不采集运行时指标,而是监听 Kubernetes API Server,将资源对象的状态转换为 Prometheus 指标。其核心价值在于提供 资源声明量,这是成本分摊中计算“请求分摊比例”的关键输入。

资源对象 关键指标 成本分摊用途
Pod kube_pod_container_resource_requests{resource="cpu"} 计算 Pod 的 CPU 请求量,用于按比例分摊节点成本
Namespace kube_namespace_created 关联资源归属,实现按 Namespace 维度的成本聚合
Deployment kube_deployment_spec_replicas 计算工作负载的期望副本数,用于预算预测
Node kube_node_status_capacity{resource="cpu"} 获取节点总容量,用于计算资源利用率与闲置成本

4.5 数据采集链路与安全权限映射

下图展示了从数据源到成本分摊引擎的完整采集链路,以及各环节涉及的安全权限点:

成本分摊数据采集链路与安全权限映射 成本分摊数据采集链路与安全权限映射 Metrics Server kubelet:10250 Prometheus cadvisor:4194 / 10250 kube-state-metrics API Server 监听 成本分摊数据管道 Prometheus TSDB / Thanos / VictoriaMetrics 成本分摊计算引擎 按 Request / Usage 比例分摊 安全权限映射 • Metrics Server → ClusterRole: system:metrics-server, 需访问 nodes/stats 子资源 • Prometheus → ClusterRole: nodes/proxy, pods, services (get/list/watch), 需挂载 ServiceAccount • kube-state-metrics → ClusterRole: 所有核心资源对象的 get/list/watch 权限

4.6 采集机制对比与选型建议

对比维度 Metrics Server Prometheus kube-state-metrics
数据精度 秒级瞬时值 秒级累计值 / 直方图 状态快照(随事件更新)
存储开销 极低(仅内存) 较高(本地磁盘 / 远端存储) 低(仅当前状态)
适用分摊模型 实时分摊(近实时) 历史趋势分摊(T+1 / 月结) 资源声明分摊(Request 基准)
安全配置复杂度 低(默认 RBAC) 中(需配置 ServiceAccount + TLS) 低(仅需 API 只读权限)
最佳实践: 在成本分摊系统中,建议同时采集 Prometheus 的容器运行时指标(用于实际用量分摊)与 kube-state-metrics 的资源声明指标(用于请求量分摊)。Metrics Server 的数据可作为实时校验的辅助参考,但不建议作为月结成本分摊的唯一数据源,因其数据保留周期过短。