ExitVideo-Bot · Chaos Game Day 手册¶
主动故障注入演练。每季度 1 次,目的是在受控环境下发现系统弱点。
🎯 目标¶
- 验证 Runbook 可用性:让 oncall 工程师真实跑一遍 On-call Runbook
- 发现系统弱点:通过故障注入暴露隐藏的容错问题
- 训练团队:让所有人熟悉应急流程
- 测量 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
🚨 安全准则¶
- 不在生产高峰演练:选择低峰时段(如 02:00-06:00 UTC)
- 提前通知用户:所有 SLA 99.9% 的客户必须 24h 前通知
- Abort 机制:每个实验都有 abort 命令(
make chaos-abort) - 冻结窗口:重大发布 / 客户活动前 7 天冻结 Chaos 实验
- 审计日志:所有实验记录到
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 类基础实验 + 半年计划 + 度量指标 + 安全准则