💥 第26课:故障演练

核心概念

故障演练(Chaos Engineering):主动发现弱点

主动在受控条件下注入故障,验证系统容错能力和告警有效性。

故障演练方法论

1. 定义稳态假设(System is healthy when...)
2. 引入真实故障变量(Network delay, Pod kill, CPU stress)
3. 观察系统行为(是否维持稳态?告警是否触发?)
4. 分析差距并改进

故障类型:
├── 基础设施:CPU/内存/磁盘压力
├── 网络:延迟、丢包、分区
├── 应用:Pod Kill、错误注入
├── 依赖:外部服务宕机
└── 数据:数据库故障、缓存失效

命令实操

1. Chaos Mesh实验 ✅

Chaos Mesh
kubectl apply -f https://mirrors.chaos-mesh.org/v2.6.0/chaos-mesh.yaml

# Pod Kill实验
cat > pod-kill.yaml << 'EOF'
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata: {name: pod-kill-test, namespace: chaos-mesh}
spec:
  action: pod-kill
  mode: one
  selector: {namespaces: ["default"], labelSelectors: {app: myapp}}
  scheduler: {cron: "@every 10m"}
EOF
kubectl apply -f pod-kill.yaml

# 网络延迟实验
cat > network-delay.yaml << 'EOF'
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata: {name: network-delay-test, namespace: chaos-mesh}
spec:
  action: delay
  mode: all
  selector: {namespaces: ["default"], labelSelectors: {app: myapp}}
  delay: {latency: "500ms", correlation: "50", jitter: "100ms"}
  duration: "5m"
EOF
kubectl apply -f network-delay.yaml

# CPU压力实验
cat > cpu-stress.yaml << 'EOF'
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata: {name: cpu-stress-test, namespace: chaos-mesh}
spec:
  mode: one
  selector: {namespaces: ["default"], labelSelectors: {app: myapp}}
  stressors: {cpu: {workers: 4, load: 80}}
  duration: "3m"
EOF
kubectl apply -f cpu-stress.yaml

2. 手动故障注入脚本 ✅

故障注入脚本
#!/bin/bash
# chaos-test.sh
ACTION="${1:?pod-kill|network-delay|cpu-stress|cleanup}"
TARGET="${2:-myapp}"

case "$ACTION" in
  pod-kill)
    echo "💥 Killing random $TARGET pod..."
    POD=$(kubectl get pods -l app=$TARGET -o json | jq -r '.items[].metadata.name' | shuf -n 1)
    kubectl delete pod "$POD" --grace-period=0
    ;;
  network-delay)
    echo "⏱ Adding 500ms delay to $TARGET..."
    kubectl apply -f - <

架构图

故障演练(Chaos Engineering):主动发现弱点架构

┌──────────┐  ┌──────────┐  ┌──────────┐
│ 定义稳态  │→│ 注入故障  │→│ 观察系统  │
│(健康基线) │ │(受控变量) │ │(偏离检测) │
└──────────┘  └──────────┘  └─────┬────┘
                    ┌─────────────┼─────────────┐
                    ▼                           ▼
              维持稳态 ✅                  偏离稳态 ❌
              系统容错OK                   发现弱点
              → 增加难度                   → 修复问题 → 改进SLO

故障排查

❌ Chaos实验未生效

排查
kubectl get pods -n chaos-mesh
kubectl describe networkchaos network-delay-test -n chaos-mesh
# 常见:selector标签不匹配/Chaos Mesh权限不足/PDB保护/网络插件不支持tc
💡 故障演练原则:从小爆炸半径开始、生产环境也要演练、确保回滚手段就绪、每次演练后复盘改进。

🏆 成就解锁:故障演练专家!

掌握Chaos Mesh、手动注入、稳态假设——主动找弱点比被动救火更高效

📝 故障演练计划模板

项目内容
演练名称数据库主库宕机
爆炸半径仅staging环境
稳态假设API成功率>99.9%
故障注入Chaos Mesh PodChaos on DB
预期结果自动故障转移,成功率>99%
观察指标错误率、延迟、恢复时间
回滚方案删除Chaos实验
💡 演练原则:从小开始(staging→production)、有回滚手段、演练后必须复盘、生产演练选择低峰期。

🔧 Litmus Chaos实验

Litmus
# 安装Litmus
kubectl apply -f https://litmuschaos.github.io/litmus/2.14.0/litmus-2.14.0.yaml

# 创建ChaosEngine
cat > pod-delete-engine.yaml << 'EOF'
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata: {name: myapp-chaos}
spec:
  appinfo: {appns: default, applabel: "app=myapp"}
  chaosServiceAccount: litmus-admin
  experiments:
  - name: pod-delete
    spec:
      components:
        env:
        - {name: TOTAL_CHAOS_DURATION, value: "30"}
        - {name: CHAOS_INTERVAL, value: "10"}
      probe:
      - name: check-app-health
        type: httpProbe
        httpProbe/inputs: {url: "http://myapp-svc/health", method: {get: {}}}
        mode: Continuous
        runProperties: {probeTimeout: 5, interval: 5}
EOF
kubectl apply -f pod-delete-engine.yaml

📝 混沌实验清单

实验目标验证能力工具
Pod随机删除应用层自愈能力Chaos Mesh/Litmus
网络延迟网络层超时重试Chaos Mesh
CPU压力资源层弹性伸缩Chaos Mesh
磁盘故障存储层数据冗余Chaos Mesh
DNS故障网络层服务发现Chaos Mesh
时间偏移系统层证书/日志Chaos Mesh
⚠️ 混沌实验安全要求:必须有回滚方案、爆炸半径可控、生产演练选低峰期、必须有监控和On-Call待命。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。

课前准备

  • 准备实验环境
  • 阅读官方文档
  • 了解基本概念

课后巩固

  • 完成实操练习
  • 整理学习笔记
  • 应用到实际项目

进阶方向

  • 深入研究源码
  • 参与社区讨论
  • 分享给团队

📝 本课知识图谱

知识域核心技能验证方式
核心概念理解原理和架构能用自己的话解释
命令实操熟练使用相关工具能独立完成操作
故障排查定位和解决问题能在模拟故障中恢复
最佳实践遵循生产级标准能设计可靠方案
💡 持续学习:技术领域更新快,关注官方博客、GitHub Release、社区动态,保持知识新鲜度。

🔗 相关课程链接

前置课程后续课程关联课程
前几课基础内容下一课深入内容跨领域综合应用
⚠️ 实验环境安全:本课所有命令请在隔离的实验环境中执行,避免在生产环境直接操作。备份重要数据后再进行任何修改操作。

📌 记住:理论+实践=真正的掌握。每个概念都要动手验证,每个命令都要理解原理。