4. SLO 目标定义:为 Kubernetes 工作负载定义合理的 SLO 目标

为 Kubernetes 工作负载定义 SLO(Service Level Objective)是 SRE 实践的核心环节。合理的 SLO 不是凭空设定的数字,而是基于用户旅程、系统容量、业务成本与错误预算共同推导出的可量化承诺。本章将系统讲解如何为 K8s 工作负载定义如 99.9% 可用性这类 SLO 目标。

4.1 SLO 定义的三层模型

在 Kubernetes 环境中,SLO 定义需要从用户视角出发,逐层分解。我们推荐使用“用户旅程 → 黄金信号 → 聚合指标”的三层模型:

层级 定义 K8s 示例
用户旅程 用户可感知的关键操作路径 用户登录、商品搜索、订单提交
黄金信号 延迟、流量、错误、饱和度 P99 延迟 < 200ms,错误率 < 0.1%
聚合指标 可计算的复合 SLO 表达式 SLI = 成功请求数 / 总请求数 ≥ 99.9%
关键原则: SLO 必须从用户可感知的维度定义,而非基础设施维度。例如“Pod 存活率 99.99%”对用户无意义,应转换为“首页 API 在 1 秒内返回 200 状态码的比例 ≥ 99.9%”。

4.2 定义 SLO 的六步流程

以下是为 Kubernetes 工作负载定义合理 SLO 的标准化步骤:

  1. 识别关键用户旅程 — 列出工作负载对外提供的核心 API 或功能入口。
  2. 选择 SLI 指标 — 从黄金信号中选取可测量的指标(如请求成功率、P95 延迟)。
  3. 设定初始目标值 — 基于历史数据或行业基准(如 99.9%、99.99%)。
  4. 计算错误预算 — 确定可接受的故障时间窗口(如 99.9% 对应每月 43.2 分钟)。
  5. 对齐业务与成本 — 评估达到该 SLO 所需的冗余、监控、运维投入。
  6. 迭代优化 — 通过定期 SLO 回顾会议调整目标值。
实践建议: 对于新上线的 K8s 工作负载,建议先设定“宽松 SLO”(如 99.5%),运行 2-4 周收集基线数据后再收紧至 99.9%。避免一开始就设定过高目标导致错误预算耗尽。

4.3 常见 K8s 工作负载的 SLO 参考值

不同工作负载类型对可用性的敏感度不同。以下表格给出了典型场景的 SLO 参考范围:

工作负载类型 典型 SLO 每月允许故障时间 关键考量
用户面 API(无状态) 99.9% 43.2 分钟 多副本 + HPA + 优雅滚动更新
支付/交易服务 99.99% 4.32 分钟 跨 AZ 部署 + 熔断 + 重试退避
异步消息处理 99.5% 3.6 小时 消息队列持久化 + 消费者健康检查
批处理/离线计算 99.0% 7.2 小时 Job 重试策略 + 工作队列
内部工具/管理面板 99.0% 7.2 小时 单副本可接受,需快速恢复

4.4 SLO 与错误预算的关系

定义 SLO 的同时必须配套错误预算(Error Budget)机制。错误预算 = 1 - SLO,代表在给定时间窗口内允许的故障总量。当错误预算耗尽时,应触发“冻结新功能发布,优先修复稳定性”的流程。

常见误区: 不要将 SLO 视为“必须 100% 达成”的硬性指标。SLO 是一个概率承诺,允许在错误预算范围内出现故障。过度追求 100% 可用性会导致成本失控和发布节奏停滞。

4.5 SLO 定义决策流程

下图展示了从业务需求到最终 SLO 数值的完整决策流程:

SLO 定义决策流程 业务需求分析 识别关键用户旅程 选择 SLI 指标 设定 SLO 目标值 计算错误预算 关键决策点 • 用户可感知吗? • 指标可测量吗? • 目标可达成吗? • 成本可接受吗? • 错误预算合理吗? 迭代反馈 SLO 过高 → 增加资源 SLO 过低 → 收紧目标 错误预算耗尽 → 冻结发布 错误预算充足 → 加速迭代 迭代优化

4.6 定义 SLO 的代码示例

以下是一个使用 Prometheus 记录 SLI 并计算 SLO 的典型配置片段:

# Prometheus recording rule: 计算 5 分钟窗口内的请求成功率
- record: job:slo_request_success_rate:ratio_rate5m
  expr: |
    sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
    /
    sum(rate(http_requests_total[5m]))
    * 100

# 告警规则:当 SLO 接近边界时触发警告
- alert: SLOViolation
  expr: |
    job:slo_request_success_rate:ratio_rate5m < 99.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "SLO 违规:请求成功率低于 99.9%"

4.7 定义 SLO 的常见陷阱

  • 陷阱一: 使用基础设施指标代替用户指标。例如用“节点 CPU 使用率”而非“API 响应延迟”。
  • 陷阱二: 对所有工作负载使用统一 SLO。不同重要性的服务应有差异化目标。
  • 陷阱三: 忽略错误预算的消耗速率。即使总预算未耗尽,短时间内大量消耗也应触发告警。
  • 陷阱四: SLO 定义后从不回顾。业务变化后,SLO 应随之调整。
最佳实践: 在 Kubernetes 集群中,建议为每个工作负载创建独立的 SLO 文档,记录 SLI 定义、目标值、错误预算窗口、告警阈值以及最近一次 SLO 回顾日期。使用 ConfigMap 或自定义资源(CRD)存储这些定义,便于版本管理和审计。