3. 容器运行时指标来源:cAdvisor、kubelet 内置 cAdvisor 与 CRI 指标

在 Kubernetes 集群中,容器运行时的资源指标并非由单一组件提供,而是由 cAdvisor、kubelet 内置 cAdvisor 以及 Container Runtime Interface (CRI) 三层数据源共同构成。理解这三者的数据流、覆盖范围与差异,是设计精准资源瓶颈预警规则的前提。

3.1 指标来源架构总览

下图展示了从容器运行时到 Prometheus 采集端的完整指标链路:

容器运行时指标来源架构 容器运行时 (Docker / containerd / CRI-O) CRI 指标接口 (ResourceMetrics / PodSandboxStats) cAdvisor 独立进程 (已弃用,仅参考) kubelet 内置 cAdvisor (默认启用,主数据源) Prometheus 采集 关键说明 • 独立 cAdvisor 已弃用,kubelet 内置 cAdvisor 是当前主流采集方式 • CRI 指标提供更细粒度的运行时统计

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 三种来源的选型建议

指标来源选型决策流程 选择指标来源 kubelet 内置 cAdvisor 推荐,覆盖全面 CRI 指标 精细化场景补充 独立 cAdvisor 已弃用,不推荐 建议 默认使用 kubelet 内置 cAdvisor;在需要 OOM 事件或 PodSandbox 级别统计时,补充 CRI 指标。

注意:独立部署的 cAdvisor DaemonSet 在 Kubernetes 1.20+ 中已不再维护,且与 kubelet 内置 cAdvisor 存在数据重复问题。请确保集群中不存在两套 cAdvisor 同时运行,以免造成 Prometheus 采集冲突和指标冗余。