2. Prometheus 基础回顾:PromQL 核心语法与指标类型
在构建指标驱动的集群安全基线之前,必须牢固掌握 Prometheus 的数据模型与查询语言。本章将系统梳理 PromQL 核心语法与四种指标类型(Counter、Gauge、Histogram、Summary),为后续安全指标采集与告警规则编写打下基础。
2.1 指标类型与适用场景
Prometheus 客户端库提供四种核心指标类型,每种类型对应不同的数据语义与聚合方式。理解它们的差异是编写正确 PromQL 的前提。
| 类型 | 数据特征 | 典型安全场景 | 常用 PromQL 函数 |
|---|---|---|---|
| Counter | 只增不减(重启可重置) | 登录失败次数、API 请求总数、容器重启次数 | rate(), increase(), resets() |
| Gauge | 可增可减,反映当前状态 | CPU 使用率、内存占用、活跃连接数、Pod 副本数 | avg(), max(), min(), delta() |
| Histogram | 分桶计数,可计算分位数 | API 响应延迟分布、TLS 握手耗时、审计日志处理延迟 | histogram_quantile(), rate() |
| Summary | 预计算分位数,客户端侧聚合 | 请求延迟预计算分位数(0.5/0.9/0.99) | 直接读取 _quantile 指标 |
安全基线提示: 基线检查中 80% 的告警规则基于 Counter 和 Gauge 类型。Counter 用于检测“事件频率”异常(如暴力破解),Gauge 用于检测“状态越界”(如容器以特权模式运行)。
2.2 PromQL 核心语法结构
PromQL 查询由 指标选择器、标签匹配器 和 时间范围 三部分构成。以下为基本语法模板:
<metric_name>{<label_matchers>}[<time_duration>]
2.2.1 标签匹配器
- 精确匹配:
=,如namespace="kube-system" - 正则匹配:
=~,如pod=~"api-.*" - 反向匹配:
!=,如container!="POD" - 反向正则:
!~,如namespace!~"kube-.*"
2.2.2 时间范围与偏移
| 语法 | 含义 | 示例 |
|---|---|---|
[5m] |
过去 5 分钟内的所有样本 | rate(http_requests_total[5m]) |
offset 1h |
偏移 1 小时前的数据 | node_cpu_seconds_total offset 1h |
@timestamp |
指定 Unix 时间戳 | process_cpu_seconds_total @1600000000 |
2.3 四种指标类型详解
2.3.1 Counter:事件计数器
Counter 适用于只增不减的累计值。直接查询 Counter 原始值没有意义,必须配合 rate() 或 increase() 计算每秒增长率或增量。
# 计算过去 5 分钟内每秒登录失败次数
rate(kubelet_http_requests_total{path="/api/v1/namespaces"}[5m])
# 计算过去 1 小时内容器重启次数增量
increase(kube_pod_container_status_restarts_total[1h])
常见错误: 对 Counter 直接使用
avg() 或 sum() 而不加 rate(),会导致结果受累计时间影响,无法反映真实速率。安全基线中所有“频率类”指标必须使用 rate() 包裹。
2.3.2 Gauge:瞬时状态
Gauge 反映当前值,可升可降。安全基线中常用于检测资源使用率是否超过阈值,或安全配置状态是否异常。
# 检测节点 CPU 使用率是否超过 90%
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) > 0.9
# 检测容器是否以特权模式运行(值为 1 表示特权)
container_security_context_privileged{container!="POD"} == 1
2.3.3 Histogram:分桶分布
Histogram 将观测值分配到预定义的桶(bucket)中,适合计算分位数和分布特征。安全场景中常用于分析 TLS 握手延迟、审计日志处理延迟等。
# 计算过去 5 分钟内 API 请求延迟的 P99 值
histogram_quantile(0.99, rate(apiserver_request_duration_seconds_bucket[5m]))
2.3.4 Summary:预计算分位数
Summary 在客户端侧直接计算分位数,暴露为 _quantile 指标。与 Histogram 不同,Summary 无法跨进程聚合,但查询更简单。
# 直接读取预计算的 P99 延迟
apiserver_request_duration_seconds{quantile="0.99"}
2.4 PromQL 聚合与运算
安全基线检查中经常需要对指标进行聚合运算,以下为最常用的聚合操作符:
| 操作符 | 作用 | 安全基线示例 |
|---|---|---|
sum() |
求和 | 统计集群中所有特权容器数量 |
avg() |
平均值 | 计算节点平均 CPU 使用率 |
max() |
最大值 | 找出集群中延迟最高的节点 |
count() |
计数 | 统计满足条件的 Pod 数量 |
topk() |
取前 K 个 | 找出重启次数最多的前 5 个 Pod |
# 统计集群中所有特权容器数量
sum(container_security_context_privileged{container!="POD"} == 1)
# 找出重启次数最多的前 5 个 Pod
topk(5, increase(kube_pod_container_status_restarts_total[1h]))
2.5 指标类型与 PromQL 函数对照
不同指标类型适用的 PromQL 函数不同,错误使用会导致语义错误或查询失败。
2.6 安全基线中的 PromQL 实战模式
以下为安全基线检查中最常用的三种 PromQL 模式,后续章节将反复使用:
- 频率异常检测:使用
rate()计算事件速率,与动态阈值比较。 - 状态越界检测:使用 Gauge 直接比较阈值,配合
on()或ignoring()处理多标签。 - 分布异常检测:使用
histogram_quantile()计算 P99/P95,与基线值比较。
# 模式1:频率异常 - 检测 5 分钟内登录失败速率是否超过 10 次/秒
rate(login_failures_total[5m]) > 10
# 模式2:状态越界 - 检测容器是否以特权模式运行
container_security_context_privileged{container!="POD"} == 1
# 模式3:分布异常 - 检测 API 请求 P99 延迟是否超过 500ms
histogram_quantile(0.99, rate(apiserver_request_duration_seconds_bucket[5m])) > 0.5
本章要点: 掌握 Counter 与 Gauge 的语义差异是编写安全基线规则的基础。Counter 必须配合
rate() 使用,Gauge 可直接比较阈值。Histogram 和 Summary 用于延迟分布分析,在 TLS 握手和审计日志场景中尤为重要。后续章节将基于这些基础构建完整的集群安全基线指标体系。