混沌工程实践:从故障注入到韧性验证
背景与问题界定 某电商平台的"双十一"大促刚刚结束,复盘报告显示:尽管全链路压测已经做了三周,但实际峰值流量时仍然出现了两次 10 分钟的局部宕机——一次是因为某个 Redis 集群的内存用尽触发 OOM Killer,导致缓存穿透直接打到数据库;另一次是 CI/CD 发布新版本时 Pod 启动失败,但缺乏熔断机制导致灰度流量全部转发到异常的 Pod 上。事后分析发现,压测流量模式太"干净"了——所有依赖的网络延迟都是标准的 2ms,所有节点都正常健康,没有任何"不完美"的情况。混沌工程的核心假设是"系统总会出问题"——网络会延迟、磁盘会满、Pod 会崩溃、证书会过期,只有主动验证这些故障场景下的系统行为,才能真正建立对系统韧性的信心。 目标拆解与工程约束 生产环境的"手术刀精度":故障注入必须在生产环境的"暗面"(Shadow Traffic)或非核心链路上进行,注入范围必须是够小的爆炸半径,不能影响真实用户——使用 parallel 注入模式配合 pods selector 的标签过滤控制范围。 可观测性必须到位:混沌实验的前提是完善的监控和告警体系——没有 Metrics 和 Tracing 的混沌实验就像蒙眼做手术,无法判断故障注入是否达到预期效果以及系统是否按预期恢复。 自动化的"停止条件"与"回滚":每个混沌实验必须有明确的 Stop Condition(如"某些错误率超过 5%“或"P99 延迟超过阈值”),在达到条件后自动停止注入,并触发实验回滚或恢复流程。 实验的原子性和可重复性:每个混沌实验应该是一个"可复现的科学实验"——有假设、有控制组、有实验组、有观测指标、有前后对比报告,不能是随机的"炸一下看反应"。 方案设计 我们选型 Chaos Mesh 作为混沌工程平台,它原生支持 Kubernetes,通过 CRD 定义混沌实验,支持 Pod 级别的故障注入(Pod 故障、网络分区、磁盘 IO 延迟、CPU 压力、DNS 错误等): apiVersion: chaos-mesh.org/v1alpha1 kind: NetworkChaos metadata: name: payment-network-delay namespace: chaos-engineering spec: action: delay mode: one selector: namespaces: ["production-payment"] labelSelectors: "app": "payment-service" delay: latency: "200ms" jitter: "50ms" correlation: "50" duration: "5m" scheduler: cron: "@every 24h" # 每天自动注入一次,低峰期 实验设计采用"Game Day"模式——每周五下午由 SRE 团队选择一个实验场景执行,所有 On-call 工程师在旁观察系统的指标变化。故障注入分为四个阶段逐步推进: ...