混沌工程:ChaosBlade、Chaos Mesh 与可观测性闭环
某团队在生产做第一次「混沌」:kubectl delete pod checkout-xxx。Pod
15 秒内重建,服务恢复。团队欢呼系统高可用。
但 15 秒内 checkout 可用率从 99.95% 降到 99.1%,消耗两周错误预算;告警一条未响——延迟 SLO 的 PromQL 用了 p50 而非 p99。实验证明了自愈,更证明了可观测性盲区。
混沌工程的价值:不是找代码 bug,是找「告警与 SLO 能否发现这类故障」。稳态用 SLO 工程 度量;告警是否触发用 告警体系 验证;全链路排障见 事故复盘剧本。
一、混沌工程的原则
1.1 起源
Netflix Chaos Monkey(2011)随机终止生产实例,验证容错。原则被归纳进 Principles of Chaos Engineering。
1.2 五步循环
| 步骤 | 动作 | 可观测性产出 |
|---|---|---|
| 1 定义稳态 | SLO Dashboard 指标 | 对照组基线 |
| 2 提出假设 | 可判定命题 | 实验验收标准 |
| 3 设计实验 | 故障类型+半径 | 注入配置 |
| 4 执行观测 | 注入+看告警 | 触发时间、漏报 |
| 5 分析 | 预期 vs 实际 | Reliability Backlog |
1.3 与测试的区别
| 单元/集成测试 | 混沌实验 | |
|---|---|---|
| 环境 | CI/staging | staging → 可控 prod |
| 目标 | 功能正确 | 可观测性+韧性 |
| 失败价值 | bug 列表 | 告警/SLO gap |
二、三大开源工具对比
2.1 总览
| 工具 | 来源 | 模型 | 强项 | 弱项 |
|---|---|---|---|---|
| ChaosBlade | 阿里开源 | CLI + Operator | 上手快、JVM/主机 | K8s 编排弱于 Mesh |
| Chaos Mesh | PingCAP, CNCF | CRD | K8s 原生、Workflow | 学习曲线 |
| LitmusChaos | CNCF | Hub + GitOps | 模板化、Harness CE | 重度依赖 K8s |
2.2 ChaosBlade
# 网络延迟(主机)
blade create network delay --time 3000 --interface eth0 --offset 100
# K8s Pod CPU 满载
blade create k8s pod-cpu fullload --namespace checkout --names checkout-xxx --cpu-percent 80
# 销毁实验
blade destroy <UID>中文文档完善,适合国内团队第一个实验。
2.3 Chaos Mesh
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: delay-checkout
namespace: chaos-testing
spec:
action: delay
mode: one
selector:
namespaces: [checkout]
labelSelectors:
app: checkout
delay:
latency: "200ms"
duration: "5m"Workflow 可编排多步实验;Dashboard 可视化。
2.4 LitmusChaos
ChaosHub 提供预置实验模板;与 ArgoCD 集成做 GitOps 混沌。
三、稳态假设与 SLO 判定
3.1 稳态指标示例
- 可用性:\[\text{SLI}_{avail} \geq 99.9\%\](5m 窗口)
- 延迟:p99 < 200ms
- 吞吐:QPS 在预期区间
3.2 实验假设模板
若对 checkout 单 Pod 注入 200ms 网络延迟 5 分钟,则 p99 延迟 SLO Burn Rate 告警应在 2 分钟内触发,且错误预算消耗 < 1%。
3.3 判定表
| 观测项 | 通过 | 失败 → 行动 |
|---|---|---|
| SLO 告警触发 | 是 | 调整 Burn Rate 规则 |
| Dashboard 异常可见 | 是 | 补 Panel / Recording rule |
| Trace 不断裂 | 是 | 修 propagation |
| 自动恢复 < RTO | 是 | 修 HPA/PDB |
四、实验工程设计(四阶段)
4.1 Fault Injection
CPU、内存、网络延迟/丢包、DNS、磁盘 I/O、Pod 删除、AZ 故障。
4.2 Observability
并行观察:SLO Dashboard、告警、Logs
trace_id、Traces 采样率是否够。
4.3 Recovery
记录 RTO;是否需人工
kubectl rollout undo。
4.4 Analysis
写入 Reliability Backlog:每条 gap 对应 owner 与 due date。
sequenceDiagram
participant E as 实验编排
participant F as 故障注入
participant S as SLI 采集
participant A as Alertmanager
participant O as On-call
E->>F: 注入延迟
F->>S: 扰动流量
S->>A: Burn Rate 计算
alt 告警触发
A->>O: Page
else 漏报
O->>O: 记录盲区
end
五、爆炸半径控制
5.1 递进策略
单 Pod → 单 Deployment → 单 AZ → Region(极少)。
5.2 Kill Switch
- ChaosBlade:
blade destroy - Chaos Mesh:
kubectl delete networkchaos --all -n chaos-testing - 脚本:
timeout 300
5.3 生产准入
- staging 同模板通过
- on-call 值守
- 变更窗口审批
- 回滚/停止演练过一遍
六、驱动可观测性改进的案例
6.1 网络延迟 → 告警盲区
注入 200ms → p99 升无告警 → PromQL 用 p50 → 改为 p99 + Burn Rate。
6.2 Kafka broker → Trace 断裂
杀 broker → 降级无完整 trace → Kafka client 未传播 traceparent → 修 OTel 配置。
6.3 DNS 超时 → 日志缺失
gRPC DNS 错误未打日志 → 补 error log + span event。
七、工程坑点
- 未 staging 验证就上生产——违背实验伦理。
- 无超时——CPU stress 打满节点。
- 不监控实验本身——注入是否成功未知。
- 只做自动化不做 Game Day——组合故障只有人才能发现。
- 实验未关联 SLO——无法量化用户影响。
八、落地清单
九、关键概念回顾
- 混沌输出 = 可观测性盲区清单
- 稳态必须 可度量(SLO)
- 半径 递进 + Kill Switch
十、常见误解
| 误解 | 事实 |
|---|---|
| 混沌=删 Pod | 需假设、稳态、观测、分析 |
| 通过=系统可靠 | 通过=本次故障可被观测 |
| 只能 QA 做 | SRE 主导,研发参与分析 |
十一、下一步
治理层收束。下一篇 中国可观测性厂商对比。
附录 A:实验目录模板
| ID | 故障 | 假设 | 半径 | 工具 |
|---|---|---|---|---|
| EXP-001 | PodKill k8s | 验证 PDB/HPA | checkout 单 Pod | Chaos Mesh |
| EXP-002 | NetworkDelay 200ms | 延迟 SLO 告警 | 单 Deployment 1 副本 | Chaos Mesh |
| EXP-003 | CPUStress 80% | CPU 不应 Page 除非 SLO 坏 | 单节点 | Chaos Mesh |
| EXP-004 | DNSChaos timeout | 日志+Trace 可见 | namespace 级 | Chaos Mesh |
| EXP-005 | IOChaos latency | 块设备 Metrics vs 应用延迟 | 带 PVC Pod | Chaos Mesh |
| EXP-006 | TimeChaos skew | 证书/TTL 问题 | 仅 staging | Chaos Mesh |
| EXP-007 | JVMChaos ChaosBlade | GC/延迟关联 | Java 服务 | Chaos Mesh |
| EXP-008 | AZFailure network partition | 多 AZ SLO | 需审批 | Chaos Mesh |
参考资料
- Principles of Chaos Engineering, https://principlesofchaos.org/
- Netflix Chaos Monkey, https://netflix.github.io/chaosmonkey/
- Chaos Mesh Documentation, https://chaos-mesh.org/docs/
- ChaosBlade Documentation, https://chaosblade.io/docs/
- LitmusChaos Documentation, https://litmuschaos.io/docs/
- Google SRE Workbook, Alerting on SLOs
- 本站 SLO 工程
- 本站 告警体系
- 本站 事故复盘剧本
- 本站 Events 与变更关联
上一篇:多租户与安全
下一篇:中国可观测性厂商对比
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【系统架构设计】混沌工程:主动验证系统的韧性
混沌工程不是随机杀进程:Netflix Chaos Monkey 到 Chaos Mesh/ChaosBlade 的原则、爆炸半径与 GameDay。
【可观测性工程】SLO 工程:错误预算、Burn Rate、多窗口多燃烧率告警
SLO 不是定几个 99.9% 的数字,而是连接业务需求与工程决策的治理机制。从 SLI 定义、错误预算计算到 Google SRE 多窗口多燃烧率 PromQL 规则,并说明 DB 层 SLI 如何映射到服务 SLO。
【可观测性工程】告警体系:Alertmanager、PagerDuty、OnCall 与分级抑制
建一套不让人崩溃的告警体系。从 Prometheus Alertmanager 的分组/抑制/静默三元组,到 PagerDuty 排班与升级策略,到分级告警的设计模板与告警质量持续治理。
【可观测性工程】真实事故复盘剧本:从指标抖动到根因的全链路追查
虚构但可复现的 checkout 服务事故全链路:SLO Burn Rate 告警后按 Golden Minute→Metrics→Traces→Logs→Profile→Events 五阶递进排障,含 PromQL/LogQL/kubectl 命令与三条分级剧本,交叉引用系列 01–22。