故障注入演练(混沌工程)
主动向系统中注入故障,验证自动恢复能力是否真的生效:杀掉进程、断开节点、注入网络延迟或丢包。它和人工切换演练互补——人工演练验证流程,故障注入验证系统自身的容错设计,专门用于发现『以为有冗余、实际不生效』这类隐患。前提是先有可观测的稳态指标,否则无法判断系统是在正常降级还是已经出事。
基本信息
| 适用平台 | Chaos Mesh(Kubernetes)、ChaosBlade、litmus 等 |
|---|---|
| 核心原则 | 稳态假设、模拟真实事件、在生产或类生产验证、持续运行、控制爆炸半径 |
| 常见实验 | 杀进程或节点、网络延迟与丢包、磁盘 IO 故障、时钟偏移 |
| 安全要求 | 实验可中止、可回滚,全程有观察人 |
典型使用场景
- 验证数据库主从切换是否真的自动完成
- 验证负载均衡摘除故障节点的实际耗时
- 验证应用重试与降级逻辑在断网时的行为
- 验证监控与告警能否在故障发生后第一时间触发
- 验证多可用区部署是否真的做到容量冗余
Chaos Mesh 注入示例(Pod 终止)
Chaos Mesh 注入示例(Pod 终止)
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-kill-demo
spec:
action: pod-kill # 终止 Pod 验证重建与流量摘除
mode: one # 只影响一个实例,控制爆炸半径
duration: '30s' # 实验时长,到期自动恢复
selector:
namespaces: [prod]
labelSelectors:
app: web # 只命中带该标签的实例
scheduler: # 可按 cron 周期执行,形成持续验证
cron: '@every 1h'实验设计要点
| 要点 | 说明 | 风险 |
|---|---|---|
| 稳态指标 | 实验前先定义正常范围 | 无稳态定义就无法判断结果是正常还是事故 |
| 爆炸半径 | 命中的实例或比例 | 一次命中多个关键服务,观察人来不及中止 |
| 中止机制 | 随时可停止的开关 | 缺少中止手段时实验可能演变成真实故障 |
| 观察人 | 实验期间有人在看 | 无人观察则异常被发现得太晚 |
混沌实验先从类生产环境与『关闭自动继续』的受控模式开始;没有建立稳态指标、没有中止手段、没有观察人之前,不要对生产注入故障。