2、SLO基础:服务等级目标定义、SLI与SLO的关系、常见的Kubernetes SLO指标
2.1 从SLI到SLO:可观测性驱动的承诺模型
在Kubernetes自愈场景中,SLO(Service Level Objective,服务等级目标)是衡量系统是否“健康”的黄金标尺。它不是一个孤立的数字,而是建立在SLI(Service Level Indicator,服务等级指标)之上的量化承诺。理解SLI与SLO的关系,是设计自愈触发策略的前提。
核心公式: SLO = 对SLI在特定时间窗口内的目标阈值承诺。例如:“99.9% 的请求在200ms内完成”。
2.2 SLI与SLO的关系:四象限决策矩阵
SLI是“测量什么”,SLO是“承诺多少”。两者通过燃烧速率(Burn Rate)和错误预算(Error Budget)形成闭环。下表清晰展示了SLI与SLO在自愈场景中的角色差异:
| 维度 | SLI(服务等级指标) | SLO(服务等级目标) |
|---|---|---|
| 定义 | 系统行为的可量化测量值 | SLI应达到的目标阈值或范围 |
| 示例 | 请求延迟P99、Pod重启次数、API错误率 | P99延迟 ≤ 200ms、Pod重启率 ≤ 0.1%/h、错误率 ≤ 0.1% |
| 自愈触发角色 | 作为事件源,提供原始数据 | 作为判断基准,决定是否触发自愈动作 |
| 时间窗口 | 实时或近实时(秒级) | 滚动窗口(通常为30天或7天) |
| 错误预算影响 | 消耗错误预算 | 定义错误预算总量(1 - SLO) |
实践要点: 在Kubernetes自愈测试中,SLI通常来自Prometheus指标或事件流,SLO则作为ConfigMap或Operator配置注入。自愈控制器通过比较SLI实时值与SLO阈值,决定是否执行Pod重启、HPA扩缩容或流量切换。
2.3 常见的Kubernetes SLO指标分类
Kubernetes环境的SLO指标可归纳为可用性、性能、可靠性和资源饱和度四大类。以下是生产环境中常用的指标清单:
- 可用性类:
- API Server 请求成功率(2xx/5xx比例)
- Pod Ready 状态比例(Ready / Desired)
- Endpoint 可用性(Endpointslices 健康比例)
- 性能类:
- 请求延迟(P50/P90/P99,单位ms)
- Pod 启动时间(从Pending到Running)
- Service 响应时间(通过Ingress或Service Mesh测量)
- 可靠性类:
- Pod 重启频率(CrashLoopBackOff次数/小时)
- 节点NotReady持续时间
- 持久卷挂载失败率
- 资源饱和度类:
- CPU 使用率(Request/Limit比例)
- 内存使用率(OOM Killer事件频率)
- 磁盘IO等待时间(PVC性能)
2.4 SLO指标与自愈触发的关系图
下图展示了SLI采集、SLO评估与自愈动作之间的典型流程。该图适用于理解“基于SLO的事件触发验证”的完整链路:
2.5 SLO定义的最佳实践:从指标到阈值
定义有效的SLO需要遵循“可测量、可达成、有意义”三原则。以下是一个面向Kubernetes工作负载的SLO定义模板:
# SLO 定义示例:关键业务API
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: api-slo-rules
namespace: production
spec:
groups:
- name: slo-rules
rules:
# SLI: 请求延迟P99
- record: job:request_latency_seconds:p99
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
# SLO: P99 ≤ 0.2秒,30天窗口内达标率99.9%
- alert: HighLatencySLO
expr: job:request_latency_seconds:p99 > 0.2
for: 5m
labels:
severity: critical
slo: "99.9"
annotations:
summary: "API P99延迟超过SLO阈值"
常见陷阱: 不要将SLO定义得过于严格(如99.999%),这会导致频繁的误触发和告警疲劳。建议从99.9%开始,根据实际燃烧速率逐步调整。同时,确保SLI的采集粒度与SLO窗口匹配——如果SLO是30天窗口,SLI的采样间隔不应超过1分钟。
2.6 燃烧速率与错误预算:SLO的动态守护者
在自愈场景中,仅靠静态阈值触发往往不够灵敏。燃烧速率(Burn Rate)和错误预算(Error Budget)提供了动态视角:
- 错误预算 = 1 - SLO:例如99.9% SLO对应0.1%的错误预算(30天内允许约43分钟故障)。
- 燃烧速率 = 实际错误率 / 允许错误率:当燃烧速率超过1时,表示错误消耗速度超过预期。
- 多窗口燃烧速率告警:通常设置1小时(高燃烧)和6小时(低燃烧)两个窗口,避免瞬时抖动导致误触发。
下表展示了不同燃烧速率下的自愈响应策略:
| 燃烧速率 | 时间窗口 | 错误预算消耗 | 推荐自愈动作 |
|---|---|---|---|
| < 1 | 任意 | 正常消耗 | 无需动作,持续监控 |
| 1 ~ 2 | 6小时 | 较快消耗 | 触发告警,手动确认 |
| 2 ~ 10 | 1小时 | 快速消耗 | 自动重启或扩缩容 |
| > 10 | 5分钟 | 急剧消耗 | 立即流量切换或回滚 |
2.7 自愈场景中的SLO指标选择矩阵
不同的自愈场景需要关注不同的SLO指标。以下矩阵帮助你在测试设计时快速定位:
| 自愈场景 | 主要SLI | SLO目标 | 触发条件 |
|---|---|---|---|
| Pod CrashLoopBackOff | Pod重启次数 | ≤ 3次/10分钟 | 超过阈值自动删除Pod |
| 节点NotReady | 节点状态 | 100% Ready | NotReady持续5分钟触发Pod驱逐 |
| API高延迟 | P99延迟 | ≤ 200ms | 超过阈值触发HPA或限流 |
| 内存泄漏 | 内存使用率 | ≤ 85% Limit | 超过阈值触发滚动重启 |
| 网络分区 | Endpoint健康比例 | ≥ 99% | 低于阈值触发流量切换 |
测试设计建议: 在编写自愈测试用例时,优先选择燃烧速率作为触发条件,而非单一静态阈值。例如:当1小时燃烧速率超过2时触发自愈,这比“延迟超过200ms”更能反映真实故障的严重程度。