4. PromQL 聚合算子:sum / avg / min / max / count / quantile 的用法与场景
在容量水位阈值设定中,原始指标(如 container_cpu_usage_seconds_total)往往粒度太细,无法直接用于决策。PromQL 聚合算子(Aggregation Operators)将一组时间序列按标签维度合并为更少、更宏观的序列,是阈值复核的“降维工具”。
4.1 聚合算子速查表
| 算子 | 语义 | 典型容量场景 |
|---|---|---|
sum |
求和 | 集群总 CPU 核数、总内存使用量、总请求量 |
avg |
平均值 | 平均 CPU 利用率、平均延迟、平均队列深度 |
min |
最小值 | 最低水位、空闲资源下限、冷节点识别 |
max |
最大值 | 峰值水位、热点节点、最大延迟 P99 近似 |
count |
计数 | 存活实例数、Pod 副本数、节点数量 |
quantile |
分位数(φ-分位) | P50/P90/P99 延迟、长尾资源使用分布 |
关键原则:聚合时必须通过
by 或 without 子句保留有意义的维度,否则会坍缩为单条序列,丢失容量分析所需的上下文(如按集群、按服务、按节点)。
4.2 算子详解与阈值复核示例
4.2.1 sum —— 总量视角
sum 将多个时间序列的样本值相加,适合回答“整个集群用了多少资源”。
# 集群总 CPU 使用量(核数)
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (cluster)
# 总内存使用量(字节)
sum(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) by (cluster)
阈值复核要点:当 sum 值接近集群总容量(如 sum(node_cpu_seconds_total) by (cluster) 的 80%)时,应触发扩容预警。
4.2.2 avg —— 平均水位
avg 消除极端值影响,反映整体“典型”水位,适合长期趋势基线。
# 集群平均 CPU 利用率
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (cluster)
# 平均请求延迟(秒)
avg(rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])) by (service)
陷阱:平均会掩盖热点。若集群平均 CPU 仅 40%,但某个节点已达 95%,
avg 不会触发告警。必须配合 max 或 topk 使用。
4.2.3 min / max —— 边界水位
min 和 max 分别捕获最空闲和最繁忙的个体,是容量“短板”和“热点”的直接体现。
# 集群中 CPU 利用率最高的节点
max(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
# 集群中内存剩余最多的节点(空闲水位)
min(node_memory_MemAvailable_bytes) by (instance)
阈值复核规则:
max(...) > 0.85→ 存在热点,需检查调度或扩容。min(...) < 0.1→ 存在资源严重闲置,可考虑缩容或混部。
4.2.4 count —— 规模与副本
count 统计序列数量,常用于监控实例数、节点数、Pod 副本数是否满足容量冗余要求。
# 当前运行的 Pod 副本数
count(kube_pod_status_phase{phase="Running"}) by (namespace, deployment)
# 集群中可用节点数
count(node_uname_info) by (cluster)
阈值复核:若 count 值低于预期副本数(如 HPA 最小副本),说明容量冗余不足,单点故障风险上升。
4.2.5 quantile —— 分布视角
quantile(φ, ...) 计算样本值的 φ-分位数,是延迟 SLO 和资源长尾分析的标配。
# P99 请求延迟(秒)
quantile(0.99, rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])) by (service)
# P90 CPU 利用率(按节点)
quantile(0.90, rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
容量水位应用:用
quantile(0.95, ...) 代替 max 可剔除瞬时毛刺,得到“典型峰值”;用 quantile(0.50, ...) 代替 avg 可抵抗少量极端值干扰。
4.3 聚合算子选择决策流程
4.4 常见误区与避坑
| 误区 | 错误示例 | 正确做法 |
|---|---|---|
| 聚合后丢失维度 | sum(rate(cpu_seconds[5m])) |
加 by (cluster, node) 保留关键标签 |
| 用 avg 代替 quantile | avg(rate(http_latency[5m])) 作为 P99 |
使用 quantile(0.99, ...) 直接计算 |
| min 误用于空闲判断 | min(node_memory_usage) 判断空闲 |
用 max(node_memory_free) 或 min(node_memory_usage) 配合反转 |
| count 未过滤状态 | count(kube_pod_info) |
加 {phase="Running"} 只统计运行中副本 |
4.5 综合案例:集群容量水位复核
假设需要为 Kubernetes 集群设置 CPU 利用率阈值,要求同时覆盖总量、热点和分布三个视角:
# 1. 总量视角:集群总利用率(sum)
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (cluster)
/ count(node_cpu_seconds_total) by (cluster)
* 100 -- 集群整体 CPU 利用率百分比
# 2. 热点视角:最忙节点(max)
max(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
# 3. 分布视角:P95 节点利用率(quantile)
quantile(0.95, rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
阈值复核结论:
- 若
- 若
- 若
- 若
sum(...) > 75% → 集群整体容量不足,需扩容节点。- 若
max(...) > 90% → 存在热点节点,需检查 Pod 调度或资源预留。- 若
quantile(0.95, ...) > 85% → 大部分节点接近饱和,长尾风险高,建议提前扩容。
通过组合使用 sum、max、quantile,可以避免单一聚合算子带来的盲区,实现更精准的容量水位阈值复核。