跳转至

ExitVideo-Bot · Chaos Game Day 手册

主动故障注入演练。每季度 1 次,目的是在受控环境下发现系统弱点。


🎯 目标

  1. 验证 Runbook 可用性:让 oncall 工程师真实跑一遍 On-call Runbook
  2. 发现系统弱点:通过故障注入暴露隐藏的容错问题
  3. 训练团队:让所有人熟悉应急流程
  4. 测量 MTTR:记录每个故障的平均恢复时间

📅 计划

季度 月份 主题 实验范围
Q1 3 月 基础设施层 Pod 杀 / 网络分区 / 磁盘 IO
Q2 6 月 数据层 DB 主备切换 / Redis 雪崩 / 数据丢失恢复
Q3 9 月 应用层 API 5xx / 内存泄漏 / CPU 抢占
Q4 12 月 端到端 Region failover / 完整 DR 演练

🛠️ 工具链

LitmusChaos(推荐)

# 安装
kubectl apply -f https://litmuschaos.github.io/litmus/litmus-operator-stable.yaml

# 或用 Helm
helm install chaos litmuschaos/litmus --namespace litmus --create-namespace

# 准备 chaos 实验
kubectl apply -f https://hub.litmuschaos.io/api/chaos/master?file=charts/generic/pod-delete/experiment.yaml

Chaos Mesh(备选)

helm install chaos-mesh chaos-mesh/chaos-mesh \
  --namespace chaos-mesh --create-namespace

🧪 实验模板(5 类)

实验 1:Pod Kill(基础)

目的:验证 Deployment / StatefulSet 自动恢复能力

实验设计:

apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: pod-kill-exitvideo-api
  namespace: litmus
spec:
  appkind: deployment
  appns: exitvideo-bot
  chaosServiceAccount: litmus-admin
  experiments:
    - name: pod-delete
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: "60"  # 1 分钟
            - name: CHAOS_INTERVAL
              value: "10"
            - name: FORCE
              value: "true"
            - name: PODS_UNDER_CHAOS
              value: "2"  # 同时杀 2 个 pod

预期: - Deployment 自动创建新 Pod - 服务在 30 秒内恢复正常(K8s + ArgoCD self-heal) - 用户感知:0(因为有 3 replicas)

实验 2:Network Partition(中等)

目的:验证网络分区下的服务降级能力

apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
  name: partition-db
  namespace: chaos-mesh
spec:
  action: partition
  mode: all
  selector:
    namespaces:
      - exitvideo-bot
  direction: to
  target:
    selector:
      namespaces:
        - database
  duration: "5m"

预期: - API 进入"DB unavailable" 错误 - 限流启动 - 部分功能降级(读走缓存,写入失败)

实验 3:CPU Stress(中等)

目的:验证 HPA 自动扩容

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: cpu-stress
  namespace: chaos-mesh
spec:
  mode: one
  selector:
    namespaces:
      - exitvideo-bot
    labelSelectors:
      app: exitvideo-bot-api
  stressors:
    cpu:
      workers: 2
      load: 80  # 80% CPU 持续负载
  duration: "10m"

预期: - HPA 在 3 分钟内扩容到 max(20 replicas) - P99 上升但仍在 < 1s - 10 分钟后压力停止,缩容

实验 4:Database Latency(中等)

目的:验证慢查询降级

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: db-io-stress
spec:
  mode: all
  selector:
    namespaces:
      - database
  stressors:
    io:
      workers: 1
      load: 100  # 100% IO
  duration: "3m"

预期: - API P99 上升 - Health check 可能开始 fail - 监控告警触发

实验 5:Pod Kill Worker(高)

目的:验证 Worker 任务重试 + 死信队列

apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: pod-kill-worker
  namespace: litmus
spec:
  appkind: deployment
  appns: exitvideo-bot
  experiments:
    - name: pod-delete
      spec:
        components:
          env:
            - name: TOTAL_CHAOS_DURATION
              value: "120"
            - name: CHAOS_INTERVAL
              value: "20"
            - name: FORCE
              value: "true"
            - name: PODS_UNDER_CHAOS
              value: "100"  # 全杀

预期: - Worker 重启,正在执行的 Celery 任务被重试 - 部分 publish_jobs 进入 retry 状态 - 任务最终完成(无丢失)


📅 演练日流程(半天)

上午(4 小时):准备 + 实验

# 1. 提前 1 周通知团队
make game-day-announce DATE=2026-12-15

# 2. 演练日:建立 #chaos-game-day Slack 频道
make slack-channel-create "chaos-game-day-$(date +%F)"

# 3. 提前 1 小时:备份
make db-backup
make etcd-backup
make vault-snapshot

# 4. 实验 1: Pod Kill
kubectl apply -f infra/chaos/experiments/pod-kill.yaml
# 观察 30 分钟
# 记录:实际恢复时间 / 用户感知 / 告警触发

# 5. 实验 2: Network Partition
kubectl apply -f infra/chaos/experiments/db-latency.yaml
# 观察 30 分钟

# 6. 实验 3: CPU Stress(可选)

# 8. 清理所有实验
make chaos-cleanup

下午(4 小时):复盘 + 改进

  • [ ] 收集 oncall 反馈(Runbook 哪部分难用?哪部分缺失?)
  • [ ] 收集 Grafana 数据(实验期间指标变化)
  • [ ] 输出 Postmortem + Action Items
  • [ ] 更新 Runbook(基于发现的问题)
  • [ ] 跟进行动项(每项 owner + deadline)

📊 度量指标

每次演练记录:

指标 计算方式
MTTD (Mean Time To Detect) 故障注入 → 告警触发的时间
MTTR (Mean Time To Recover) 故障注入 → 服务恢复的时间
Runbook 准确度 Oncall 工程师按 Runbook 操作的步骤成功率
盲点数量 故障期间未被发现的隐藏问题数
Action Items 改进项数(按优先级)

报告模板

# Chaos Game Day — 2026-12-15

## 实验清单
1. ✅ Pod Kill — MTTD 10s, MTTR 28s
2. ✅ Network Partition — MTTD 45s, MTTR 4m
3. ❌ CPU Stress — 未按预期扩容(HPA 配置错误)

## 发现的问题
1. **HPA 配置错误**:CPU 阈值设成 200%(应该是 70%)
2. **告警延迟**:Network partition 故障下告警延迟 45s(应 < 30s)
3. **Runbook 缺失**:没有 Redis cache warm-up 步骤

## Action Items
- [ ] [HIGH] 修复 HPA 配置 — Owner: alice — Deadline: 2026-12-20
- [ ] [MED] 添加 Redis cache warm-up Runbook — Owner: bob — Deadline: 2026-12-22
- [ ] [LOW] 增加告警抖动检查 — Owner: alice — Deadline: 2027-01-15

🚨 安全准则

  1. 不在生产高峰演练:选择低峰时段(如 02:00-06:00 UTC)
  2. 提前通知用户:所有 SLA 99.9% 的客户必须 24h 前通知
  3. Abort 机制:每个实验都有 abort 命令(make chaos-abort)
  4. 冻结窗口:重大发布 / 客户活动前 7 天冻结 Chaos 实验
  5. 审计日志:所有实验记录到 infra/chaos/audit.log

🛑 Abort 命令(紧急)

# 中止所有 chaos 实验
make chaos-abort

# 或手动
kubectl delete chaosengine --all -n litmus
kubectl delete networkchaos,stresschaos,podchaos --all -n chaos-mesh

📁 相关文件

infra/chaos/
├── game-day-runbook.md            # 本文件
├── install.sh                     # LitmusChaos / Chaos Mesh 安装
├── audit.log                      # 演练审计
└── experiments/
    ├── pod-kill.yaml              # 实验 1: Pod Kill
    ├── db-latency.yaml            # 实验 2: Network Partition
    └── cpu-stress.yaml            # 实验 3: CPU Stress

🔗 相关资源


最后更新:第 13 轮 Runbook 补写 覆盖场景:5 类基础实验 + 半年计划 + 度量指标 + 安全准则