3. 容器运行时指标来源:cAdvisor、kubelet 内置 cAdvisor 与 CRI 指标
在 Kubernetes 集群中,容器运行时的资源指标并非由单一组件提供,而是由 cAdvisor、kubelet 内置 cAdvisor 以及 Container Runtime Interface (CRI) 三层数据源共同构成。理解这三者的数据流、覆盖范围与差异,是设计精准资源瓶颈预警规则的前提。
3.1 指标来源架构总览
下图展示了从容器运行时到 Prometheus 采集端的完整指标链路:
3.2 三种指标来源的详细对比
| 指标来源 | 数据提供方式 | 覆盖范围 | Prometheus 采集端点 | 当前状态 |
|---|---|---|---|---|
| 独立 cAdvisor | DaemonSet 或二进制部署,独立 HTTP 服务 | 节点上所有容器 | /metrics (端口 4194) |
已弃用,不建议新部署 |
| kubelet 内置 cAdvisor | kubelet 进程内嵌,默认启用 | 节点上所有容器 + Pod 级别 | /metrics/cadvisor (端口 10250) |
推荐使用,Kubernetes 默认方案 |
| CRI 指标 | 通过 CRI 接口从运行时直接获取 | PodSandbox + 容器级别资源统计 | kubelet 内部聚合后暴露 | 增强指标,用于精细化监控 |
3.3 kubelet 内置 cAdvisor:核心指标详解
kubelet 内置 cAdvisor 是当前 Prometheus 采集容器指标的主要途径。它暴露的指标以 container_ 为前缀,涵盖 CPU、内存、磁盘、网络四大类:
- CPU 指标:
container_cpu_usage_seconds_total、container_cpu_cfs_periods_total、container_cpu_cfs_throttled_periods_total - 内存指标:
container_memory_usage_bytes、container_memory_working_set_bytes、container_memory_rss - 磁盘指标:
container_fs_usage_bytes、container_fs_limit_bytes、container_fs_reads_total - 网络指标:
container_network_receive_bytes_total、container_network_transmit_bytes_total
关键标签说明:每个指标都带有 pod、namespace、container、image 等标签,用于精确关联到特定容器。其中 container="" 表示 pause 容器(sandbox),通常应过滤掉。
3.4 CRI 指标:精细化运行时统计
CRI 指标是 Kubernetes 1.20+ 引入的增强指标来源,通过 kubelet 的 /metrics/cadvisor 端点一并暴露。与 cAdvisor 指标相比,CRI 指标提供更贴近容器运行时视角的资源统计:
| 指标类别 | CRI 指标示例 | 说明 |
|---|---|---|
| CPU 统计 | container_cpu_usage_seconds_total |
与 cAdvisor 同名,但数据来源为 CRI 接口 |
| 内存统计 | container_memory_working_set_bytes |
更精确的活跃内存度量 |
| OOM 事件 | container_oom_events_total |
记录容器 OOM 次数,对预警非常关键 |
| PodSandbox 统计 | pod_sandbox_* 系列 |
Pod 沙箱级别的资源使用 |
最佳实践:在 Prometheus 采集配置中,建议同时启用 /metrics/cadvisor 和 /metrics/resource 两个端点。前者提供完整的 cAdvisor 指标,后者提供 kubelet 自身的资源指标,两者互补可覆盖所有容器运行时监控需求。
3.5 指标采集配置示例
以下 Prometheus 采集配置展示了如何从 kubelet 获取容器指标:
scrape_configs:
- job_name: 'kubelet-cadvisor'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer__file: /var/run/secrets/kubernetes.io/serviceaccount/
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:10250'
target_label: __address__
- source_labels: [__meta_kubernetes_node_name]
regex: '(.+)'
replacement: '/metrics/cadvisor'
target_label: __metrics_path__
- source_labels: [__meta_kubernetes_node_name]
regex: '(.+)'
replacement: '${1}'
target_label: node
3.6 三种来源的选型建议
注意:独立部署的 cAdvisor DaemonSet 在 Kubernetes 1.20+ 中已不再维护,且与 kubelet 内置 cAdvisor 存在数据重复问题。请确保集群中不存在两套 cAdvisor 同时运行,以免造成 Prometheus 采集冲突和指标冗余。