4. Runbook 基础:传统 Runbook vs 自动化 Runbook、Runbook 生命周期

Runbook 是 SRE 团队应对已知故障或例行运维操作的标准操作文档。在可观测性体系下,Runbook 从“静态文档”进化为“自动化执行引擎”。本章从定义、对比和生命周期三个维度,建立 Runbook 的基础认知。

4.1 传统 Runbook 与自动化 Runbook 的对比

传统 Runbook 以人工执行为核心,自动化 Runbook 以事件驱动和工具编排为核心。下表从六个关键维度进行对比:

对比维度 传统 Runbook 自动化 Runbook
触发方式 人工收到告警后手动查阅文档 OpenTelemetry 事件直接触发自动化流程
执行主体 值班工程师(On-Call Engineer) 自动化引擎(如 Ansible、Terraform、K8s Operator)
响应时间 分钟级到小时级(依赖人员响应) 秒级到分钟级(机器执行)
一致性 依赖人员经验,易出现操作偏差 每次执行步骤完全一致,可审计
反馈闭环 手动记录事后报告(Postmortem) 自动采集执行结果、日志、指标,回写至可观测性平台
版本管理 文档版本混乱,难以追溯 代码化(Runbook as Code),Git 版本控制
关键认知: 自动化 Runbook 不是“把文档里的命令复制到脚本里”,而是将可观测性事件、决策逻辑、执行动作和反馈采集整合为一个闭环系统。

4.2 Runbook 生命周期模型

一个完整的 Runbook 生命周期包含五个阶段。下图展示了从设计到退役的闭环流程:

Runbook 生命周期五阶段 ① 设计 定义触发条件 ② 编码 Runbook as Code ③ 测试 沙箱/混沌工程 ④ 运行 事件驱动执行 ⑤ 退役 废弃/归档 持续迭代反馈 生命周期关键原则: • 每个阶段都必须与可观测性数据(Trace/Metric/Log)绑定 • 运行阶段产生的执行结果自动回写至事件上下文,形成闭环 • 退役前需确认是否有依赖该 Runbook 的其他流程或告警规则

4.3 生命周期各阶段详解

4.3.1 设计阶段

设计阶段的核心产出是 Runbook 定义文档,包含以下要素:

  • 触发事件:明确哪些 OpenTelemetry 事件(如 http.status_code = 500 持续 5 分钟)会激活该 Runbook。
  • 前置条件:执行前必须满足的环境状态(如集群未处于维护模式)。
  • 执行步骤:原子操作序列,每个步骤需定义成功/失败标准。
  • 回滚计划:当执行失败或产生副作用时的恢复路径。

4.3.2 编码阶段

采用 Runbook as Code 原则,将 Runbook 编写为版本控制的代码文件。推荐使用 YAML 或 HCL 描述步骤,配合 Python/Go 实现具体逻辑。

# runbook_high_cpu.yaml 示例
apiVersion: runbook.io/v1
kind: Runbook
metadata:
  name: high-cpu-auto-remediation
spec:
  trigger:
    eventType: "otel.metric.host.cpu.utilization"
    condition: "value > 0.90 for 5m"
  steps:
    - name: "identify_top_process"
      action: "exec"
      command: "ps aux --sort=-%cpu | head -5"
      outputVar: "top_processes"
    - name: "restart_service"
      action: "k8s"
      resource: "deployment"
      operation: "rollout restart"
      selector: "app={{ top_processes.app_name }}"
  rollback:
    - name: "scale_up_replicas"
      action: "k8s"
      resource: "deployment"
      operation: "scale"
      replicas: 3

4.3.3 测试阶段

自动化 Runbook 必须经过严格测试才能投入生产。测试策略包括:

  • 单元测试:验证每个步骤的输入输出逻辑。
  • 集成测试:在沙箱环境中模拟事件触发,验证全流程执行。
  • 混沌测试:注入故障(如网络延迟、节点宕机),验证 Runbook 的容错能力。
常见陷阱: 测试环境与生产环境的差异(如 API 版本、权限策略)会导致 Runbook 在生产中执行失败。建议在测试阶段使用 OpenTelemetry 的 Sampler 录制生产流量回放进行验证。

4.3.4 运行阶段

运行阶段是 Runbook 的核心价值体现。自动化引擎监听 OpenTelemetry Collector 发出的告警事件,匹配 Runbook 触发条件后自动执行。执行过程中的关键数据点:

数据维度 采集方式 用途
执行开始/结束时间 自动化引擎记录 计算 MTTR(平均修复时间)
每个步骤的 Trace 嵌入 OpenTelemetry SDK 定位执行瓶颈
步骤输出日志 结构化日志输出 审计与事后分析
执行结果状态 成功/失败/部分成功 触发后续升级流程

4.3.5 退役阶段

当以下情况发生时,Runbook 应进入退役流程:

  • 对应的故障模式已通过架构优化彻底消除(如服务已迁移至无状态架构)。
  • 有更优的自动化方案替代现有 Runbook。
  • Runbook 长期未触发且维护成本过高。

退役操作包括:从事件触发引擎中移除绑定、归档代码仓库、更新相关告警规则中的 Runbook 链接。

4.4 传统 vs 自动化:一个故障场景的对比

以“数据库连接池耗尽”为例,对比两种 Runbook 的执行路径:

传统 Runbook vs 自动化 Runbook 执行路径对比 传统 Runbook(人工) 告警触发 → 值班人员查看 搜索知识库 → 找到 Runbook 文档 手动执行命令(可能出错) 手动验证 → 手动记录 自动化 Runbook(机器) OTel 事件 → 自动匹配 Runbook 引擎解析 YAML → 执行步骤 1 自动执行命令(幂等、可重试) 自动验证 → 回写 Trace/Log vs
实践建议: 在从传统 Runbook 向自动化 Runbook 迁移时,优先选择“高频、低风险、步骤明确”的故障场景(如重启服务、清理磁盘、扩容副本)。先跑通一个完整的自动化闭环,再逐步扩展。