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 聚合算子选择决策流程

聚合算子选择决策流程 原始指标序列 关注总量? (集群/服务级) sum 关注分布? (延迟/长尾) quantile 关注边界? (热点/闲置) max / min avg / count 提示:avg 适合基线,count 适合副本数,min/max 适合边界,quantile 适合分布,sum 适合总量

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,可以避免单一聚合算子带来的盲区,实现更精准的容量水位阈值复核。