2. Prometheus 基础回顾:PromQL 核心概念、数据模型与抓取原理

在深入 Kubernetes 节点容量规划之前,必须牢固掌握 Prometheus 的数据基础。本节将系统回顾 Prometheus 的数据模型、PromQL 核心概念以及指标抓取原理,为后续的容量指标采集与查询分析奠定坚实的理论基础。

2.1 Prometheus 数据模型:Metric、Label 与 Sample

Prometheus 将所有采集到的数据存储为时间序列(Time Series)。每个时间序列由 Metric(指标名称)、Label(标签键值对) 和一组按时间排序的 Sample(样本点) 唯一标识。

核心概念 定义 示例
Metric 指标名称,描述被监控对象的一般特征,如 CPU 使用率、内存用量、请求总数。 node_cpu_seconds_total
Label 键值对标签,用于对同一指标进行多维度的细分。每个时间序列由 Metric + Label 组合唯一确定。 instance="192.168.1.1:9100", mode="idle"
Sample 时间序列中的一个数据点,包含一个 float64 值 和一个 毫秒精度的时间戳。 1234567890.123 @ 1718000000
关键理解: 在 Prometheus 中,node_cpu_seconds_total{cpu="0", mode="idle"} 和 node_cpu_seconds_total{cpu="0", mode="system"} 是两个完全不同的时间序列。标签是 Prometheus 实现多维数据模型的核心,也是 PromQL 进行灵活聚合与过滤的基础。

2.2 PromQL 核心概念:选择器、聚合与函数

PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言。掌握以下三类核心操作,即可应对 90% 的容量规划查询场景。

2.2.1 即时向量与范围向量

  • 即时向量(Instant Vector): 查询在当前时间点的一组时间序列的最新样本值。例如:node_memory_MemTotal_bytes 返回所有节点的当前内存总量。
  • 范围向量(Range Vector): 查询在过去一段时间窗口内的一组时间序列的样本值集合。例如:node_memory_MemTotal_bytes[5m] 返回过去 5 分钟内每个时间序列的所有样本点。

2.2.2 常用选择器与操作符

类型 语法/示例 说明
精确匹配 node_cpu_seconds_total{cpu="0"} 选择 cpu 标签等于 "0" 的时间序列。
正则匹配 node_cpu_seconds_total{cpu=~"0|1"} 选择 cpu 标签匹配正则表达式 0|1 的时间序列。
负向匹配 node_cpu_seconds_total{cpu!="2"} 排除 cpu 标签等于 "2" 的时间序列。
算术运算 node_memory_MemFree_bytes / node_memory_MemTotal_bytes 计算内存空闲率,返回一个新的即时向量。
聚合运算 sum by (instance) (node_cpu_seconds_total) 按 instance 标签聚合,计算每个节点的 CPU 总时间。

2.2.3 核心函数(容量规划必用)

  • rate() / irate():计算 Counter 类型指标在时间窗口内的每秒平均增长率。例如:rate(node_network_receive_bytes_total[5m]) 计算网络接收速率。
  • avg_over_time() / max_over_time():计算 Gauge 类型指标在时间窗口内的平均值/最大值。例如:max_over_time(node_load1[1h]) 获取过去 1 小时的峰值负载。
  • predict_linear():基于历史数据使用线性回归预测未来值。例如:predict_linear(node_filesystem_free_bytes[6h], 3600) 预测 1 小时后的磁盘剩余空间。
容量规划提示: 在节点容量规划中,rate() 用于计算 CPU 使用率、网络 I/O 等速率指标;avg_over_time() 和 max_over_time() 用于评估资源使用的典型水位和峰值水位;predict_linear() 则是预测磁盘、内存等资源耗尽时间的关键函数。

2.3 抓取原理:Pull 模型与生命周期

Prometheus 采用 Pull(拉取) 模型主动从目标端点(Target)采集指标数据,这与传统的 Push(推送)模型有本质区别。理解抓取原理对于配置采集规则、排查数据缺失问题至关重要。

Prometheus 抓取生命周期流程图 Prometheus 抓取生命周期 服务发现 目标列表 HTTP GET /metrics 数据解析 TSDB 存储 说明:Prometheus 定期从服务发现获取目标列表,然后通过 HTTP GET 请求拉取 /metrics 端点数据,解析后存入 TSDB。

2.3.1 Pull 模型的核心步骤

  1. 服务发现: Prometheus 通过配置的 scrape_configs(如 Kubernetes 服务发现、静态配置、Consul 等)动态获取需要抓取的目标列表及其元数据标签。
  2. 目标列表生成: 服务发现模块将目标信息(IP、端口、路径)与元标签(如 __meta_kubernetes_node_name)组合,生成最终的抓取目标列表。
  3. HTTP GET 请求: Prometheus 根据 scrape_interval(默认 15s)向每个目标的 /metrics 端点发起 HTTP GET 请求。
  4. 数据解析与标签重写: 接收响应后,Prometheus 解析文本格式的指标数据,并根据 relabel_configs 规则对标签进行增、删、改操作。
  5. TSDB 存储: 解析后的样本数据被写入 Prometheus 内置的 TSDB(时间序列数据库),按 2 小时一个 block 进行压缩存储。

2.3.2 抓取配置关键参数

参数 默认值 容量规划建议
scrape_interval 15s 对于节点级指标(CPU/内存),建议保持 15s-30s;对于容器级指标,可缩短至 10s。
scrape_timeout 10s 建议设置为 scrape_interval 的 80%,避免超时导致数据缺失。
honor_labels false 当目标暴露的标签与 Prometheus 服务端标签冲突时,设为 true 可保留目标标签。
relabel_configs 无 用于过滤目标、修改标签,是 Kubernetes 环境下实现节点/ Pod 维度聚合的核心配置。
常见陷阱: 在 Kubernetes 环境中,如果 scrape_timeout 设置过短(如 1s),而节点上的 kubelet 或 cAdvisor 响应较慢,会导致大量抓取失败,进而影响容量规划数据的完整性。建议将节点级别抓取的 scrape_timeout 设置为 10s 以上。

2.4 数据模型与抓取原理在容量规划中的意义

理解上述基础概念后,我们可以将其映射到容量规划的实际场景中:

  • Metric + Label 的多维模型 允许我们按节点、命名空间、Pod、容器等维度灵活聚合资源使用数据。
  • Sample 的时间戳 是进行时间序列预测(如 predict_linear)的基础,确保预测模型能够对齐真实时间轴。
  • Pull 模型的抓取间隔 决定了容量规划数据的粒度。15s 的抓取间隔可以捕捉到秒级的资源抖动,而 1min 的间隔则更适合长期趋势分析。
  • Relabel 机制 是 Kubernetes 环境下将节点标签(如 kubernetes.io/role、topology.kubernetes.io/zone)注入到时间序列中的关键手段,使得容量规划可以按节点池、可用区等维度进行分组分析。
小结: Prometheus 的数据模型和抓取原理是构建可靠容量规划系统的基石。只有准确理解了 Metric、Label、Sample 的含义,以及 Pull 模型的工作机制,才能设计出正确的采集配置和高效的 PromQL 查询,从而为后续的节点容量评估与预测提供高质量的数据源。