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、内存使用数据。其采集链路如下:
- kubelet 内置 cAdvisor:在每个 Node 上采集容器级别的 cgroup 统计信息。
- Summary API 暴露:kubelet 在
/stats/summary端点聚合本节点所有 Pod 的资源使用数据。 - Metrics Server 轮询:Metrics Server 通过 Node 列表,以
--kubelet-port(默认 10250)向每个 Node 发起 HTTPS 请求。 - 聚合与缓存:Metrics Server 将数据缓存在内存中,并通过
metrics.k8s.ioAPI 对外暴露。
# 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 数据采集链路与安全权限映射
下图展示了从数据源到成本分摊引擎的完整采集链路,以及各环节涉及的安全权限点:
4.6 采集机制对比与选型建议
| 对比维度 | Metrics Server | Prometheus | kube-state-metrics |
|---|---|---|---|
| 数据精度 | 秒级瞬时值 | 秒级累计值 / 直方图 | 状态快照(随事件更新) |
| 存储开销 | 极低(仅内存) | 较高(本地磁盘 / 远端存储) | 低(仅当前状态) |
| 适用分摊模型 | 实时分摊(近实时) | 历史趋势分摊(T+1 / 月结) | 资源声明分摊(Request 基准) |
| 安全配置复杂度 | 低(默认 RBAC) | 中(需配置 ServiceAccount + TLS) | 低(仅需 API 只读权限) |
最佳实践: 在成本分摊系统中,建议同时采集 Prometheus 的容器运行时指标(用于实际用量分摊)与 kube-state-metrics 的资源声明指标(用于请求量分摊)。Metrics Server 的数据可作为实时校验的辅助参考,但不建议作为月结成本分摊的唯一数据源,因其数据保留周期过短。