混沌工程落地:用故障注入提升系统韧性
专栏: 安全 & 故障排查
难度: 专家
标签: 混沌工程 Chaos Engineering 故障注入 韧性 Chaos Mesh
前言
最好的故障演练方式,是在可控的情况下主动制造故障。混沌工程的核心理念:在故障真的来临之前,先于它们发现系统的薄弱点。
一、混沌工程的步骤
1. 定义稳定状态假设(系统正常时应该有什么指标)
2. 设计故障实验(注入什么类型的故障)
3. 在生产/预发执行(从小范围开始)
4. 观察与稳定状态的偏差
5. 修复发现的问题
6. 提高爆炸半径
二、Chaos Mesh 安装(K8s环境)
bash
# 安装
helm repo add chaos-mesh https://charts.chaos-mesh.org
helm install chaos-mesh chaos-mesh/chaos-mesh -n chaos-testing --create-namespace
# 访问Dashboard
kubectl port-forward -n chaos-testing svc/chaos-dashboard 2333:2333
三、常见故障实验
实验1:Pod 随机杀死(Netflix Chaos Monkey)
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: kill-random-pod
namespace: chaos-testing
spec:
action: pod-kill
mode: one # 随机杀1个Pod
selector:
namespaces:
- production
labelSelectors:
app: myapp
scheduler:
cron: "@every 10m" # 每10分钟杀一次
实验2:网络延迟注入
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: add-latency
spec:
action: delay
mode: all
selector:
namespaces: [production]
labelSelectors:
app: payment-service
delay:
latency: "500ms"
correlation: "25" # 相关性25%(模拟真实网络抖动)
jitter: "100ms"
duration: "5m"
实验3:CPU 压力
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: cpu-stress
spec:
mode: one
selector:
namespaces: [production]
stressors:
cpu:
workers: 2
load: 80 # 80% CPU负载
duration: "10m"
实验4:磁盘IO限速
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: IOChaos
metadata:
name: disk-io-delay
spec:
action: latency
mode: one
selector:
namespaces: [production]
volumePath: /data
path: "**"
delay: "10ms"
percent: 50 # 50%的IO操作增加10ms延迟
四、游戏日(GameDay)组织
每月一次 GameDay 故障演练:
1. 提前1周通知所有相关团队
2. 准备假设("如果支付服务挂了,订单服务会怎样")
3. 准备回滚方案
4. 执行演练
5. 立即回滚
6. 72小时内发布演练报告,记录发现的问题
7. 2周内修复所有发现的问题
五、混沌工程成熟度评估
| 级别 | 描述 |
|---|---|
| Level 0 | 从未做过故障演练,靠祈祷 |
| Level 1 | 有手动故障演练流程,但不频繁 |
| Level 2 | 定期 GameDay,有组织地演练 |
| Level 3 | 自动化混沌实验,持续运行 |
| Level 4 | 生产环境持续混沌,自动修复 |
结语: 混沌工程不是为了制造混乱,而是为了发现在混乱到来之前你还不知道的问题。从小范围、低频率开始,逐步提高置信度。