4. 数据采集策略:Prometheus与Metrics Server的指标采集、Node Exporter部署

节点资源画像的精度直接取决于底层指标数据的质量。Kubernetes 生态中,Metrics Server 提供轻量级的资源使用快照,Prometheus 结合 Node Exporter 则提供高维度、高精度的历史时序数据。本章详细阐述三者的部署策略、采集范围与数据差异,帮助你在容量规划中选择正确的数据源。

4.1 采集架构总览

下图展示了三种采集组件在 Kubernetes 集群中的协作关系:

Kubernetes 节点指标采集架构 kubelet / cAdvisor Node Exporter Kubernetes API Metrics Server Resource Metrics API Prometheus Server PromQL / TSDB kubectl top / HPA 画像引擎 / 告警 Metrics Server 提供实时快照,Prometheus + Node Exporter 提供历史趋势与细粒度指标

4.2 Metrics Server:轻量级实时快照

Metrics Server 是 Kubernetes 核心组件,通过 metrics.k8s.io API 聚合节点与 Pod 的 CPU、内存使用数据。它不存储历史数据,仅保留内存中的最新快照,适合 HPA 与 kubectl top 实时查看。

4.2.1 部署与配置

# 使用官方 YAML 部署(适用于大多数集群)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 验证部署状态
kubectl get deployment metrics-server -n kube-system
kubectl get apiservice v1beta1.metrics.k8s.io
生产环境建议:如果集群使用自签名证书,需在 Metrics Server 启动参数中添加 --kubelet-insecure-tls。对于大规模集群(节点数 > 100),建议增加 --metric-resolution=30s 降低采集频率。

4.2.2 采集指标范围

指标类别 指标名称 粒度 用途
节点 CPU node_cpu_usage_cores 节点级 节点资源利用率监控
节点内存 node_memory_usage_bytes 节点级 节点内存压力判断
Pod CPU pod_cpu_usage_cores Pod 级 HPA 弹性伸缩
Pod 内存 pod_memory_usage_bytes Pod 级 HPA 与资源限制校验
局限性:Metrics Server 不采集磁盘 I/O、网络流量、GPU 使用率等指标。对于容量规划所需的长期趋势分析,必须依赖 Prometheus 体系。

4.3 Node Exporter:硬件与操作系统级指标

Node Exporter 是 Prometheus 生态的标准节点监控代理,部署在每个 Kubernetes 节点上,以 DaemonSet 形式运行。它暴露丰富的系统级指标,涵盖 CPU、内存、磁盘、网络、文件系统、负载等。

4.3.1 DaemonSet 部署

# 创建命名空间
kubectl create namespace monitoring

# 部署 Node Exporter DaemonSet
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true
      hostPID: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.7.0
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host/root
        - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)
        ports:
        - containerPort: 9100
          hostPort: 9100
        volumeMounts:
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: root
          mountPath: /host/root
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: root
        hostPath:
          path: /
EOF

4.3.2 核心指标分类

分类 关键指标 说明
CPU node_cpu_seconds_total 按 mode (user/system/iowait) 细分,用于计算 CPU 使用率
内存 node_memory_MemTotal_bytes
node_memory_MemAvailable_bytes
可用内存比 free 更准确,包含缓存与缓冲区
磁盘 node_disk_io_time_seconds_total
node_disk_read_bytes_total
磁盘 I/O 延迟与吞吐量,识别存储瓶颈
网络 node_network_receive_bytes_total
node_network_transmit_bytes_total
网络带宽使用量,按接口区分
文件系统 node_filesystem_size_bytes
node_filesystem_avail_bytes
磁盘分区使用率,排除伪文件系统
负载 node_load1 / node_load5 / node_load15 系统平均负载,辅助 CPU 饱和度判断

4.4 Prometheus Server:时序数据存储与查询

Prometheus 通过 服务发现 自动发现 Node Exporter 端点,以固定间隔(默认 15s)拉取指标,并存储在本地 TSDB 中。对于节点资源画像,Prometheus 提供以下关键能力:

  • 长期趋势分析:保留数周至数月的历史数据,支持容量趋势预测。
  • 高基数维度:按节点、Pod、容器、磁盘、网络接口等多维度聚合。
  • PromQL 灵活计算:支持百分位、速率、增长率等复杂运算。

4.4.1 采集配置示例

# prometheus.yml 中 Node Exporter 采集配置
scrape_configs:
  - job_name: 'node-exporter'
    kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
            - monitoring
    relabel_configs:
      - source_labels: [__meta_kubernetes_endpoints_name]
        regex: 'node-exporter'
        action: keep
      - source_labels: [__meta_kubernetes_pod_node_name]
        target_label: node
      - source_labels: [__address__]
        regex: '(.*):9100'
        replacement: '${1}:9100'
        target_label: __address__

4.5 三种数据源的对比与选型

维度 Metrics Server Node Exporter + Prometheus kubelet / cAdvisor
数据持久化 无(仅内存快照) 有(TSDB 本地存储) 无(仅实时接口)
指标丰富度 CPU / 内存 CPU / 内存 / 磁盘 / 网络 / 文件系统 / 负载 容器级 CPU / 内存 / 网络 / 文件系统
采集粒度 节点 + Pod 节点 + 容器(通过 cAdvisor) Pod + 容器
历史趋势 不支持 支持(可配置保留时间) 不支持
资源开销 极低 中等(取决于采集频率与指标数量) 低(kubelet 内置)
主要用途 HPA / kubectl top 容量规划 / 长期趋势 / 告警 容器级实时调试
容量规划最佳实践:使用 Prometheus + Node Exporter 作为主数据源,保留 30 天以上的历史数据;Metrics Server 仅用于 HPA 实时决策。在画像计算时,优先使用 Prometheus 的 rate() 与 avg_over_time() 函数消除瞬时抖动。

4.6 采集策略配置清单

  1. 采集频率:Prometheus 默认 15s,Node Exporter 默认 15s;对于容量规划,可降低至 30s 以减少存储开销。
  2. 数据保留:Prometheus 本地保留建议 30 天;如需更长周期,配置远程存储(Thanos / VictoriaMetrics)。
  3. 指标过滤:在 Prometheus 中通过 metric_relabel_configs 丢弃不必要的指标(如 node_network_transmit_drop_total),降低基数。
  4. 节点标签:确保 Prometheus 采集时携带 node、instance、cluster 等标签,便于画像按节点聚合。
  5. 健康检查:配置 Prometheus up 指标告警,确保 Node Exporter 实例不丢失。
采集策略决策流程 确定采集目标 选择数据源 配置采集频率 设置数据保留 部署告警规则 验证数据完整性
生产环境检查项:部署完成后,使用 kubectl top node 验证 Metrics Server 数据;在 Prometheus 中执行 count by (node) (up{job="node-exporter"}) 确认所有节点均已接入。