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 的度量依赖统一的监控数据管道,通常包含以下环节:

  1. 数据采集: 使用 Prometheus 从各组件暴露的 /metrics 端点拉取指标。
  2. 指标聚合: 使用 PromQL 或 Recording Rules 计算百分位、速率、成功率等 SLI。
  3. 窗口计算: 在 30 天滚动窗口内计算达标率,通常使用 min_over_time 或自定义 SLO 计算器(如 Sloth、Pyrra)。
  4. 违约判定: 当达标率低于 SLO 阈值时,生成 SLO 违约事件,触发准入门禁处置。
推荐工具:
  • Sloth:声明式 SLO 生成器,基于 Prometheus 规则自动生成 SLO 指标和告警。
  • Pyrra:轻量级 SLO 管理工具,支持多窗口、多 burn rate 策略。
  • Grafana SLO:可视化 SLO 仪表盘,支持错误预算和 burn rate 展示。
控制面 SLO 度量数据管道 数据采集 Prometheus /metrics 指标聚合 PromQL / Recording Rules 窗口计算 30 天滚动窗口 违约判定 达标率 < SLO 关键说明: • 数据采集:Prometheus 从 kube-apiserver、etcd、kube-scheduler 拉取指标,频率 15s。 • 指标聚合:使用 histogram_quantile 计算 P99,使用 rate/irate 计算速率。 • 窗口计算:Sloth 或 Pyrra 在 30 天滚动窗口内计算达标率,排除维护窗口。 • 违约判定:达标率低于 SLO 阈值时,生成 SLO 违约事件,触发准入门禁处置。

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% 的错误预算),即使尚未违约,也应触发告警并启动准入门禁评估。
SLO 违约判定流程 SLI 采集 实时指标 达标率计算 30 天滚动窗口 错误预算检查 剩余预算 > 0? 违约触发 准入门禁处置 判定分支: • 错误预算剩余 > 0:继续正常运营,不触发处置。 • 错误预算剩余 ≤ 0:触发 SLO 违约,进入准入门禁处置流程(如拒绝变更、回滚、限流)。 • 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 违约时及时触发准入门禁处置,保障集群的长期稳定性。