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(推送)模型有本质区别。理解抓取原理对于配置采集规则、排查数据缺失问题至关重要。
2.3.1 Pull 模型的核心步骤
- 服务发现: Prometheus 通过配置的
scrape_configs(如 Kubernetes 服务发现、静态配置、Consul 等)动态获取需要抓取的目标列表及其元数据标签。 - 目标列表生成: 服务发现模块将目标信息(IP、端口、路径)与元标签(如
__meta_kubernetes_node_name)组合,生成最终的抓取目标列表。 - HTTP GET 请求: Prometheus 根据
scrape_interval(默认 15s)向每个目标的/metrics端点发起 HTTP GET 请求。 - 数据解析与标签重写: 接收响应后,Prometheus 解析文本格式的指标数据,并根据
relabel_configs规则对标签进行增、删、改操作。 - 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 查询,从而为后续的节点容量评估与预测提供高质量的数据源。