核心概念:SLO、SLI 与错误预算的定义及数学关系

在构建 Kubernetes 存储组件的可观测性体系之前,必须精确理解三个核心概念:SLI(服务等级指标)、SLO(服务等级目标)和错误预算(Error Budget)。它们是 SRE 方法论中量化可靠性的基石,也是后续面板化呈现的数据模型基础。

1. 三者的定义与职责

概念 英文全称 定义 在存储组件中的示例
SLI Service Level Indicator 对服务某个维度的直接量化测量,通常是比率、延迟或吞吐量。 PV(持久卷)的 I/O 请求成功率、CSI 插件响应延迟 P99、存储挂载操作耗时。
SLO Service Level Objective 对 SLI 设定的目标阈值,是团队承诺的可靠性边界。 "PV 写入请求成功率 ≥ 99.95%(月度)"、"CSI 挂载延迟 P99 ≤ 500ms"。
错误预算 Error Budget SLO 允许的最大不可用时间或失败次数,即 100% - SLO。 若 SLO 为 99.95%,月度错误预算为 0.05% × 30 天 = 21.6 分钟。
关键区分:SLI 是原始测量值,SLO 是目标值,错误预算是容忍空间。三者构成一个闭环:测量(SLI)→ 对比目标(SLO)→ 计算剩余容忍度(错误预算)。

2. 数学关系与公式

三者的数学关系可以精确表达为以下公式:

错误预算 = 1 - SLO(以小数表示)

错误预算消耗率 = (1 - SLI) / (1 - SLO) × 100%

剩余错误预算 = 错误预算 - 已消耗错误预算

以 Kubernetes 存储场景为例,假设一个 CSI 驱动定义的 SLO 为 99.95%(月度):

  • 月度总时间窗口:30 天 × 24 小时 × 60 分钟 = 43,200 分钟
  • 错误预算总量:43,200 分钟 × (1 - 0.9995) = 43,200 × 0.0005 = 21.6 分钟
  • SLI 测量值:假设本月实际成功率为 99.90%,则失败率为 0.10%
  • 已消耗错误预算:43,200 分钟 × 0.001 = 43.2 分钟
  • 错误预算消耗率:0.10% / 0.05% = 200%(已超支)
存储组件特有风险:当错误预算消耗率超过 100% 时,意味着存储服务的不可用时间已经超过了 SLO 允许的阈值。此时应触发冻结发布流程,停止对存储组件(如 CSI 驱动、存储后端)的变更,直到错误预算恢复。

3. SLI → SLO → 错误预算的闭环流程

下图展示了从原始指标采集到错误预算决策的完整数据流:

SLI → SLO → 错误预算闭环流程 SLI → SLO → 错误预算闭环流程 原始指标采集 Prometheus / kubelet SLI 计算 成功率 / 延迟 / 吞吐量 SLO 对比 阈值判定 错误预算计算 消耗率 / 剩余量 决策动作 冻结 / 告警 / 回滚 Grafana 面板化 可视化呈现 持续反馈循环 核心公式 错误预算 = 1 - SLO 消耗率 = (1-SLI)/(1-SLO) 剩余 = 总量 - 已消耗

4. 存储组件特有的 SLI 维度

Kubernetes 存储组件的 SLI 不能仅用简单的"可用性"衡量,需要从多个维度定义:

SLI 维度 测量方式 典型 SLO 目标 Prometheus 指标示例
控制面可用性 CSI 驱动 gRPC 请求成功率 99.99% csi_grpc_requests_total{status!="OK"}
数据面延迟 PV I/O 操作延迟 P99 ≤ 10ms node_disk_io_time_seconds_total
挂载成功率 VolumeMount 操作成功/失败计数 99.95% volume_manager_total_volumes
存储容量饱和度 PV 使用率超过 80% 的比例 ≤ 5% 的 PV 超阈值 kubelet_volume_stats_used_bytes

5. 错误预算的消耗与恢复模型

错误预算的消耗不是线性的,需要理解其时间窗口滑动特性:

  • 滑动窗口机制:错误预算通常基于一个滚动时间窗口(如 30 天)计算,旧的失败事件会随着时间推移被移出窗口。
  • 消耗速率:单次重大故障可能瞬间消耗掉整个月的错误预算;而微小的持续失败则缓慢消耗。
  • 恢复条件:错误预算不会"恢复",而是通过滑动窗口将旧的失败事件移出计算范围,使剩余预算重新增加。
存储组件实践建议:对于 CSI 驱动和存储后端,建议设置多层级 SLO:核心数据面(99.99%)、控制面(99.95%)、管理面(99.9%)。每个层级独立计算错误预算,并在 Grafana 面板中分别展示消耗率,以便快速定位故障域。

6. 从 SLI 到错误预算的 PromQL 实现

以下 PromQL 查询展示了如何在 Prometheus 中计算存储组件的错误预算消耗率:

# 1. 计算 SLI:CSI 驱动请求成功率(过去 30 天)
sum(rate(csi_grpc_requests_total{status="OK"}[30d]))
/
sum(rate(csi_grpc_requests_total[30d]))

# 2. 计算错误预算消耗率(SLO = 99.95%)
(1 - (sum(rate(csi_grpc_requests_total{status="OK"}[30d]))
      /
      sum(rate(csi_grpc_requests_total[30d]))))
/
(1 - 0.9995)
*
100

# 3. 计算剩余错误预算(以分钟表示)
(1 - 0.9995) * 43200  -- 总错误预算 21.6 分钟
-
((1 - (sum(rate(csi_grpc_requests_total{status="OK"}[30d]))
       /
       sum(rate(csi_grpc_requests_total[30d]))))
 *
 43200)
注意:上述查询中的 30d 是滑动窗口。在实际生产环境中,建议使用 30d 或 28d 作为标准窗口,避免因月份天数不同导致预算计算偏差。对于存储组件,建议将窗口对齐到自然月,便于与业务团队沟通。