4. 数据采集策略:Prometheus与Metrics Server的指标采集、Node Exporter部署
节点资源画像的精度直接取决于底层指标数据的质量。Kubernetes 生态中,Metrics Server 提供轻量级的资源使用快照,Prometheus 结合 Node Exporter 则提供高维度、高精度的历史时序数据。本章详细阐述三者的部署策略、采集范围与数据差异,帮助你在容量规划中选择正确的数据源。
4.1 采集架构总览
下图展示了三种采集组件在 Kubernetes 集群中的协作关系:
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_bytesnode_memory_MemAvailable_bytes |
可用内存比 free 更准确,包含缓存与缓冲区 |
| 磁盘 | node_disk_io_time_seconds_totalnode_disk_read_bytes_total |
磁盘 I/O 延迟与吞吐量,识别存储瓶颈 |
| 网络 | node_network_receive_bytes_totalnode_network_transmit_bytes_total |
网络带宽使用量,按接口区分 |
| 文件系统 | node_filesystem_size_bytesnode_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 采集策略配置清单
- 采集频率:Prometheus 默认 15s,Node Exporter 默认 15s;对于容量规划,可降低至 30s 以减少存储开销。
- 数据保留:Prometheus 本地保留建议 30 天;如需更长周期,配置远程存储(Thanos / VictoriaMetrics)。
- 指标过滤:在 Prometheus 中通过
metric_relabel_configs丢弃不必要的指标(如node_network_transmit_drop_total),降低基数。 - 节点标签:确保 Prometheus 采集时携带
node、instance、cluster等标签,便于画像按节点聚合。 - 健康检查:配置 Prometheus
up指标告警,确保 Node Exporter 实例不丢失。
生产环境检查项:部署完成后,使用
kubectl top node 验证 Metrics Server 数据;在 Prometheus 中执行 count by (node) (up{job="node-exporter"}) 确认所有节点均已接入。