3. SLO 定义与度量:服务等级目标(SLO)的定义、关键指标(API Server 延迟、etcd 健康、调度成功率)、度量方法
在 Kubernetes 控制面蓝图中,SLO(Service Level Objective,服务等级目标)是衡量平台健康与性能的核心契约。SLO 定义了控制面组件在正常运营条件下必须达到的量化阈值,是触发准入门禁处置的基准线。本章将系统阐述控制面 SLO 的定义方法、三大关键指标及其度量手段。
3.1 SLO 定义原则与结构
控制面 SLO 遵循 SLI → SLO → 违约判定 的三层结构:
- SLI(服务等级指标):可量化的原始测量值,如 API Server 响应时间 P99。
- SLO(服务等级目标):SLI 的目标阈值,如“API Server P99 延迟 ≤ 1s,在 30 天滚动窗口内达标率 ≥ 99.9%”。
- 违约判定:当实际达标率低于 SLO 阈值时,触发违约状态,进入准入门禁处置流程。
| 层级 | 定义 | 示例 |
|---|---|---|
| SLI | 原始测量指标 | API Server 请求延迟 P99 |
| SLO | SLI 的目标阈值 + 达标窗口 | P99 ≤ 1s,30 天滚动窗口达标率 ≥ 99.9% |
| 违约判定 | 达标率低于 SLO 阈值 | 达标率 99.8% < 99.9% → 违约 |
实践建议: 控制面 SLO 应使用 滚动窗口(如 30 天)而非固定日历月,避免月初/月末的边界效应导致误判。窗口长度建议覆盖至少一个完整的变更周期。
3.2 三大关键指标详解
Kubernetes 控制面核心组件包括 kube-apiserver、etcd 和 kube-scheduler。以下分别定义其 SLI 与 SLO。
3.2.1 API Server 延迟
SLI 定义: 所有写请求(CREATE、UPDATE、DELETE)和读请求(GET、LIST、WATCH)的端到端延迟,按百分位(P50、P99、P99.9)聚合。
- 测量维度: 按请求动词(verb)、资源类型(resource)、客户端(client)分组。
- SLO 建议:
- 写请求 P99 ≤ 1s,30 天达标率 ≥ 99.9%
- 读请求 P99 ≤ 500ms,30 天达标率 ≥ 99.95%
- LIST 大资源(如所有 Pod)P99 ≤ 30s,30 天达标率 ≥ 99.5%
- 度量方法: 通过 Prometheus 采集
apiserver_request_duration_seconds指标,使用histogram_quantile计算百分位。
# PromQL 示例:计算 API Server 写请求 P99 延迟(最近 5 分钟)
histogram_quantile(0.99,
sum(rate(apiserver_request_duration_seconds_bucket{verb=~"CREATE|UPDATE|DELETE"}[5m])) by (le)
)
3.2.2 etcd 健康
SLI 定义: etcd 集群的可用性、读写延迟和存储状态。etcd 是控制面的状态存储,其健康直接影响整个集群的稳定性。
- 关键子指标:
- etcd 集群可用性: 所有 etcd 成员是否处于健康状态(leader 选举正常、无频繁切换)。
- etcd 写延迟: 提交提案到持久化的 P99 延迟。
- etcd 存储配额: 当前数据库大小是否接近配额(默认 2GB)。
- SLO 建议:
- etcd 集群可用性:100%(不允许任何成员宕机超过 5 分钟)。
- etcd 写延迟 P99 ≤ 100ms,30 天达标率 ≥ 99.9%。
- 存储配额使用率 ≤ 80%,避免触发压缩或写入失败。
- 度量方法: 通过 Prometheus 采集
etcd_server_leader_changes_seen_total(leader 切换次数)、etcd_disk_wal_fsync_duration_seconds(WAL fsync 延迟)、etcd_mvcc_db_total_size_in_bytes(数据库大小)。
# PromQL 示例:检测 etcd leader 切换(最近 10 分钟 > 0 次则告警)
increase(etcd_server_leader_changes_seen_total[10m]) > 0
3.2.3 调度成功率
SLI 定义: 新创建的 Pod 在合理时间内被成功调度到节点的比例。调度失败通常由资源不足、节点污点、调度策略冲突等原因引起。
- 测量维度: 按命名空间、优先级类、调度器名称分组。
- SLO 建议:
- 调度成功率 ≥ 99.5%(30 天滚动窗口),排除因用户配置错误(如 PVC 不存在)导致的失败。
- 调度延迟 P99 ≤ 5s(从 Pod 创建到绑定节点)。
- 度量方法: 通过 Prometheus 采集
scheduler_pod_scheduling_duration_seconds和scheduler_pod_scheduling_attempts_total,计算成功与失败的比例。
# PromQL 示例:计算调度成功率(最近 1 小时)
sum(rate(scheduler_pod_scheduling_attempts_total{result="scheduled"}[1h]))
/
sum(rate(scheduler_pod_scheduling_attempts_total[1h]))
注意: 调度成功率 SLO 应排除 用户错误 导致的失败(如资源请求超过集群容量、PVC 不存在)。建议在调度器日志中标记
Unschedulable 与 Error 的区别,仅将 Error 计入 SLO 违约。
3.3 度量方法与数据管道
控制面 SLO 的度量依赖统一的监控数据管道,通常包含以下环节:
- 数据采集: 使用 Prometheus 从各组件暴露的 /metrics 端点拉取指标。
- 指标聚合: 使用 PromQL 或 Recording Rules 计算百分位、速率、成功率等 SLI。
- 窗口计算: 在 30 天滚动窗口内计算达标率,通常使用
min_over_time或自定义 SLO 计算器(如 Sloth、Pyrra)。 - 违约判定: 当达标率低于 SLO 阈值时,生成 SLO 违约事件,触发准入门禁处置。
推荐工具:
- Sloth:声明式 SLO 生成器,基于 Prometheus 规则自动生成 SLO 指标和告警。
- Pyrra:轻量级 SLO 管理工具,支持多窗口、多 burn rate 策略。
- Grafana SLO:可视化 SLO 仪表盘,支持错误预算和 burn rate 展示。
3.4 SLO 违约判定与错误预算
错误预算(Error Budget)是 SLO 的衍生概念,定义为 1 - SLO。例如,99.9% SLO 对应的错误预算为 0.1%(30 天内允许 43.2 分钟的不可用)。当错误预算耗尽时,触发 SLO 违约。
| SLO 目标 | 错误预算(30 天) | 违约阈值 |
|---|---|---|
| 99.9% | 43.2 分钟 | 错误预算消耗 ≥ 100% |
| 99.95% | 21.6 分钟 | 错误预算消耗 ≥ 100% |
| 99.99% | 4.32 分钟 | 错误预算消耗 ≥ 100% |
实践建议: 使用 Burn Rate(燃烧速率) 作为早期预警指标。当错误预算在短时间内快速消耗(如 1 小时内消耗 10% 的错误预算),即使尚未违约,也应触发告警并启动准入门禁评估。
3.5 度量工具与仪表盘
推荐使用以下工具构建控制面 SLO 度量体系:
- Prometheus + Thanos:长期存储与全局视图,支持跨集群 SLO 聚合。
- Grafana:可视化 SLO 仪表盘,展示错误预算、Burn Rate、SLI 趋势。
- Sloth / Pyrra:声明式 SLO 管理,自动生成 Prometheus 规则和告警。
- KubeSLO:Kubernetes 原生 SLO 控制器,支持 CRD 定义 SLO 并自动执行准入门禁。
关键度量指标汇总:
| 组件 | SLI | Prometheus 指标 | SLO 建议 |
|---|---|---|---|
| kube-apiserver | 写请求延迟 P99 | apiserver_request_duration_seconds | ≤ 1s,99.9% |
| kube-apiserver | 读请求延迟 P99 | apiserver_request_duration_seconds | ≤ 500ms,99.95% |
| etcd | 写延迟 P99 | etcd_disk_wal_fsync_duration_seconds | ≤ 100ms,99.9% |
| etcd | 集群可用性 | etcd_server_leader_changes_seen_total | 100% |
| kube-scheduler | 调度成功率 | scheduler_pod_scheduling_attempts_total | ≥ 99.5% |
| kube-scheduler | 调度延迟 P99 | scheduler_pod_scheduling_duration_seconds | ≤ 5s |
通过上述 SLO 定义与度量体系,平台团队可以精确量化控制面健康状态,并在 SLO 违约时及时触发准入门禁处置,保障集群的长期稳定性。