混沌工程
混沌工程 (Chaos Engineering)
设计能够揭示生产系统真实弱点且不会演变成大规模停机的实验。大多数“混沌工程”尝试往往忽略了稳态测量,未定义中止标准,且缺乏爆炸半径限制。本技能旨在强制执行一套使混沌实验安全且有效的规范。
适用场景
- 规划混沌实验(破坏什么、在哪里、何时破坏、如何中止)
- 在运行实验前计算爆炸半径
- 审查现有实验计划的安全性
- 选择混沌工具(Chaos Toolkit / Chaos Mesh / Litmus / Gremlin / AWS FIS)
- 编写混沌实验的事后分析报告 (Postmortem)
- 执行游戏日 (Game Day) 演习
不适用场景
- 通用的事故响应(请使用
incident-response)
- 威胁猎寻 / 红队测试(请使用
red-team、threat-detection)
- 性能压力测试(目标不同——混沌工程关注的是故障模式而非容量)
- 生产环境调试(混沌工程旨在预先发现弱点,而非事后排查)
核心原则:没有中止标准的混沌就是一次停机
混沌工程的四大原则 (Netflix, 2016):
1. 围绕稳态行为建立假设。 不是问“什么会坏?”,而是问“X 状态目前成立;在故障 Y 发生时,它是否依然成立?”
2. 模拟真实世界的事件。 注入真实的故障:杀死节点、网络延迟、缓存丢失、依赖项限流。
3. 在生产环境中运行实验。 测试环境永远无法完全模拟生产环境的故障模式。从小规模开始。
4. 将实验自动化以持续运行。 一次性的混沌实验只是公关稿;持续的混沌实验才是工程。
补充第五点:预先定义中止标准。 没有中止标准的混沌实验,本质上就是一次换了名字的停机事故。
快速上手
SKILL=engineering/chaos-engineering/skills/chaos-engineering
1. 设计实验
python "$SKILL/scripts/experiment_designer.py" --target "checkout-svc" --hypothesis "p99 latency stays <500ms" --attack latency --duration-min 15
2. 计算爆炸半径
python "$SKILL/scripts/blast_radius_calculator.py" --traffic-share 0.05 --user-pop 1000000 --duration-min 15
3. 实验后生成事后分析报告
python "$SKILL/scripts/experiment_postmortem.py" --plan experiment.json --result-log results.txt3 个 Python 工具
全部仅使用标准库。运行 --help 查看详情。
experiment_designer.py
根据输入生成结构化的实验计划。强制要求包含必要章节(假设、稳态指标、爆炸半径、中止标准、回滚方案)。
python scripts/experiment_designer.py \
--target "checkout-svc" \
--hypothesis "p99 latency stays <500ms when payment-svc is slow" \
--attack latency \
--magnitude "+200ms" \
--duration-min 15 \
--blast-radius "5% of US traffic" \
--abort-if "p99 > 1000ms OR error_rate > baseline + 1pp"输出一份包含以下内容的 Markdown 计划:假设、稳态、攻击方式、幅度、持续时间、爆炸半径、中止标准、回滚流程、监控仪表盘以及学习问题。
blast_radius_calculator.py
计算计划实验的爆炸半径。根据流量份额 + 用户群体 + 持续时间,计算预计受影响用户数、预计错误预算消耗量以及风险评分。
python scripts/blast_radius_calculator.py \
--traffic-share 0.05 \
--user-pop 1000000 \
--duration-min 15 \
--baseline-availability 0.999 \
--expected-impact-availability 0.95输出内容:
- 预计受影响用户数
- 消耗的错误预算(以错误预算分钟数计)
- 风险评分:绿色 (GREEN) / 黄色 (YELLOW) / 红色 (RED)
- 建议:继续 (PROCEED) / 缩减 (REDUCE) / 中止 (ABORT)
绿色 = 错误预算 <1%;黄色 = 1-10%;红色 = >10%。
experiment_postmortem.py
根据实验计划 + 结果生成结构化的事后分析报告。旨在解决常见的事后分析失败模式:未记录学习心得、无后续行动、语言带有指责色彩。
python scripts/experiment_postmortem.py --plan experiment.json --result-log results.txt输出包含以下内容的 Markdown:摘要、假设(是否被证实/反驳?)、学习心得、意外发现、带有责任人的后续行动,以及指向下一次实验的链接。
7 种攻击类型(分类法)
不同的攻击方式揭示不同的弱点。详见 references/attack_taxonomy.md。
| 攻击类型 | 测试目标 | 工具 |
|---|---|---|
| 延迟 (Latency) | 超时、重试、熔断器 | tc, Chaos Mesh NetworkChaos |
| 错误 (Error) | 错误处理、回退路径 | Chaos Mesh HTTPChaos, Toxiproxy |
| 资源 (Resource) (CPU, 内存, 磁盘) | 饱和度处理、自动扩缩容 | Chaos Mesh StressChaos, stress-ng |
| 网络分区 (Network partition) | 脑裂、共识、故障转移 | Chaos Mesh NetworkChaos partition |
| 依赖故障 (Dependency failure) | 优雅降级、回退 | 服务网格故障注入 |
| 时间 (Time) | 时钟偏移、NTP 问题 | libfaketime, Chaos Mesh TimeChaos |
| 基础设施 (Infrastructure) (杀死实例) | 自动恢复、故障转移 | AWS FIS, Chaos Monkey |
选择与假设相匹配的攻击方式。“如果 X 变慢会怎样?” $\rightarrow$ 延迟。“如果 X 失去网络会怎样?” $\rightarrow$ 分区。
工具选择指南
| 工具 | 最适用场景 | 价格 | 技术栈 |
|---|---|---|---|
| Chaos Toolkit | 轻量级、语言无关、JSON 实验 | 开源 | 任意 |
| Chaos Mesh | Kubernetes 原生、丰富的 CRD、集群内运行 | 开源 | Kubernetes |
| Litmus | Kubernetes, Argo 集成, 庞大的库 | 开源 + 企业版 | Kubernetes |
| Gremlin | 企业级 SaaS, 多云, 审计 | 付费 | 任意 |
| AWS FIS | AWS 原生, IAM 集成, EC2/ECS/EKS | 付费 (AWS) | AWS |
| 自定义 (Custom) | 小众需求, 单云, 低预算 | 无 | 任意 |
决策规则:
- 仅 k8s 栈 + 开源 $\rightarrow$ Chaos Mesh 或 Litmus(Litmus 的实验库更丰富)
- 多云 + 开源 $\rightarrow$ Chaos Toolkit
- 深度依赖 AWS + 简单需求 $\rightarrow$ AWS FIS
- 企业级 + 审计/合规 $\rightarrow$ Gremlin
权衡分析详见 references/tooling_landscape.md。
工作流
工作流 1:设计并运行单个实验
1. 陈述假设:“当 [故障] 发生时,稳态指标 X 仍...blast_radius_calculator.py —— 确认显示为 GREEN 后再继续。
4. 运行 experiment_designer.py 生成方案。
5. 进行方案同行评审;确认中止标准具体明确。
6. 在 #incidents(或相关频道)通知值班团队。
7. 在开启监控的情况下运行实验。
8. 如果触发中止标准,立即中止并记录情况。
9. 运行 experiment_postmortem.py 总结经验。
10. 提交后续行动项;链接至下一次实验。
### 工作流 2:Game Day 演习### 工作流 3:持续混沌(从 Game Day $\rightarrow$ 日常化)
与其他技能的组合
本技能与本库中的另外两项技能明确组合:
| 技能 | 组合方式 |
|---|---|
|
feature-flags-architect | 其中定义的 Kill switches 是此处的中止触发器 |
| kubernetes-operator | Operator 是常见的混沌目标(测试故障下的调谐能力) |
| incident-response | 升级为事故的混沌实验将转入事故响应流程 |
反模式
- 无假设 —— “随便搞坏点东西”是破坏而非工程
- 无稳态指标 —— 没有基准线,你无法判断 X 是否损坏
- 无爆炸半径限制 —— 无限制的全量生产实验 = 停机事故
- 无中止标准 —— 见上文;这是强制要求的
- 无值班覆盖 —— 没有监控的混沌就是对生产环境的盲目操作
- 仅在 Staging 运行 —— Staging 永远无法完全模拟生产环境的故障模式
- 在 Dev 环境运行 —— 毫无意义;Dev 的故障模式与生产环境不同
- 一次性混沌 —— 单次实验像是一次公关稿;学习需要重复进行
- 带有责备色彩的复盘 —— 记录原因而非责备,否则团队会停止运行混沌实验
参考资料
references/chaos_principles.md —— 4 大原则、历史、启动时机
references/experiment_design.md —— 假设结构、稳态指标、中止标准
references/attack_taxonomy.md —— 7 种攻击类型及其示例和工具
references/tooling_landscape.md —— Chaos Toolkit / Mesh / Litmus / Gremlin / FIS / DIY
斜杠命令
/chaos-experiment —— 交互式实验设计向导,可运行所有 3 个工具。
资产模板
assets/experiment_template.md —— 方案填写模板
assets/postmortem_template.md` —— 结构化复盘模板
可验证的成功标准
使用本技能的团队应实现:
- 100% 的混沌实验拥有书面假设、中止标准和爆炸半径计算
- 任何单次实验的爆炸半径不超过错误预算 (Error Budget) 的 10%
- 混沌实验的平均间隔时间 < 14 天(持续进行,而非一次性)
- 每项实验
- 产生 $\ge 1$ 项已交付的后续行动
- 在过去 90 天内,没有混沌实验升级为影响客户的事故