ChaosBlade 使用指南

ChaosBlade 是阿里巴巴开源的多平台混沌工程工具,支持 K8s、Docker、主机等多种环境,是国内生产环境验证最广泛的混沌工程工具之一。

ChaosBlade 的设计理念是简单、高效、可扩展——通过命令行即可快速注入故障,无需复杂的配置。阿里内部每年双十一期间都会使用 ChaosBlade 进行大规模故障演练。

安装

Linux/macOS

# 下载二进制文件
wget https://github.com/chaosblade-io/chaosblade/releases/download/v1.7.0/chaosblade-1.7.0-linux-amd64.tar.gz

# 解压
tar -zxvf chaosblade-1.7.0-linux-amd64.tar.gz

# 设置环境变量
export PATH=$PATH:/chaosblade/bin

# 验证安装
blade version

Docker

# 使用 Docker 运行 ChaosBlade
docker run -it \
  --privileged \
  --rm \
  chaosblade/chaosblade:latest

# 进入容器后执行命令
blade create cpu load --cpu-percent 80

Kubernetes

# 安装 ChaosBlade Operator
kubectl apply -f https://raw.githubusercontent.com/chaosblade-io/chaosblade/master/manifests/chaosblade-operator.yaml

# 验证安装
kubectl get pods -n chaosblade

CPU 故障注入

基础 CPU 负载

# 占用 80% CPU,持续 60 秒
blade create cpu load --cpu-percent 80 --timeout 60

# 验证
top

# 销毁实验
blade destroy <uid>

指定进程 CPU 负载

# 只对指定进程注入 CPU 负载
blade create cpu load --cpu-percent 80 --process mysql --timeout 60

# 指定进程关键词
blade create cpu load --cpu-percent 80 --process-cmd redis-server --timeout 60

容器级别 CPU 负载

# 获取容器 ID
CONTAINER_ID=$(docker ps | grep myapp | awk '{print $1}')

# 对容器注入 CPU 负载
blade create docker cpu load --container-id $CONTAINER_ID --cpu-percent 80

内存故障注入

基础内存压力

# 占用 80% 内存,持续 60 秒
blade create mem load --mem-percent 80 --timeout 60

# 指定内存大小
blade create mem load --mem-size 1G --timeout 60

容器内存压力

# 对容器注入内存压力
blade create docker mem load \
  --container-id $CONTAINER_ID \
  --mem-percent 90

网络故障注入

网络延迟

# eth0 网卡注入 500ms 延迟
blade create network delay --interface eth0 --offset 500 --timeout 60

# 双向延迟
blade create network delay --interface eth0 --offset 500 --destination-ip 192.168.1.100

# 添加抖动
blade create network delay --interface eth0 --offset 500 --offset-jitter 100

网络丢包

# 20% 丢包率
blade create network loss --interface eth0 --percent 20

# 指定目标 IP 丢包
blade create network loss --interface eth0 --percent 50 --destination-ip 192.168.1.100

网络断开

# 模拟网络断开(100% 丢包)
blade create network loss --interface eth0 --percent 100

# 模拟端口不可用
blade create network loss --interface eth0 --local-port 3306

DNS 故障

# DNS 解析错误
blade create dns error --domain payment-service --ip 127.0.0.1

# DNS 超时
blade create dns delay --domain payment-service --timeout 5s

进程故障注入

杀死进程

# 杀死指定进程
blade create process kill --process-name payment-service --count 1

# 杀死指定 PID
blade create process kill --pid 12345

# 强制杀死
blade create process kill --process-name order-service --signal 9

进程挂起

# 挂起进程(暂停)
blade create process stop --process-name myapp

# 恢复进程
blade destroy <uid>

数据库故障注入

MySQL 故障

# 模拟 MySQL 连接超时
blade create mysql delay --database order_db --time 3000

# 模拟 MySQL 查询慢
blade create mysql execute --sql "SELECT * FROM large_table" --time 10000

# 模拟 MySQL 连接数耗尽
blade create mysql exception --error-code 1040

Redis 故障

# Redis 延迟
blade create redis delay --time 3000

# Redis 超时
blade create redis timeout

JVM 故障注入

ChaosBlade 支持对 Java 应用注入故障,无需修改代码:

# 获取 Java 进程 PID
JAVA_PID=$(pgrep -f "order-service")

# OOM 注入
blade create jvm oom --pid $JAVA_PID --heap

# 方法延迟注入
blade create jvm delay --pid $JAVA_PID \
  --class com.example.OrderService \
  --method createOrder \
  --time 5000

# 方法异常注入
blade create jvm exception --pid $JAVA_PID \
  --class com.example.PaymentService \
  --method process \
  --exception java.lang.RuntimeException

Kubernetes 实验

Pod 故障

# 杀死 Pod
blade create k8s pod kill \
  --namespace production \
  --name order-service \
  --count 1

# Pod 网络延迟
blade create k8s network delay \
  --namespace production \
  --name order-service \
  --delay 500 \
  --local-port 8080

# 查看实验状态
blade status

完整的 K8s 实验

k8s-experiment.yaml]
# 创建 K8s 实验
kubectl apply -f - <<EOF
apiVersion: v1
kind: ChaosEngine
metadata:
  name: order-service-chaos
spec:
  appinfo:
    appns: production
    applabel: "app=order-service"
  experiments:
  - name: pod-kill
    spec:
      components:
        env:
        - name: TOTAL_CHAOS_DURATION
          value: '60'
        - name: CHAOS_INTERVAL
          value: '10'
        - name: FORCE
          value: 'false'
EOF

实验管理

查看实验状态

# 查看所有实验
blade status

# 查看详细输出
blade status --uid <uid> --output detailed

# 查看实验结果
blade query <uid>

销毁实验

# 销毁指定实验
blade destroy <uid>

# 销毁所有实验
blade destroy --all

与 CI/CD 集成

gitlab-ci.yaml]
stages:
  - test
  - chaos
  - deploy

chaos_experiment:
  stage: chaos
  image: chaosblade/chaosblade:latest
  script: |
    # 前置检查
    ./scripts/check_baseline.sh

    # 创建实验
    blade create cpu load --cpu-percent 80 --timeout 60

    # 等待观察
    sleep 60

    # 验证结果
    ./scripts/verify_steady.sh

    # 清理
    blade destroy --all

  only:
    - main

质量判断标准

一篇「ChaosBlade 使用指南」的文章是否达标,要看它是否回答了:

  1. ✅ 如何安装 ChaosBlade(多种平台)?
  2. ✅ CPU、内存、网络等基础故障如何注入?
  3. ✅ Kubernetes 环境如何使用?
  4. ✅ JVM 故障注入如何使用?
  5. ✅ 如何与 CI/CD 集成?
  6. ❌ 只有安装命令,没有具体故障注入示例——不达标

本章总结

核心要点

  1. ChaosBlade 支持多平台:Linux、Docker、K8s、阿里云
  2. 命令行使用简单:blade create <故障类型> --<参数>
  3. K8s 集成完善:支持 Pod 级别和节点级别的故障注入
  4. JVM 故障注入强大:无需修改代码即可注入 Java 故障
  5. 适合大规模生产验证:阿里双十一等大规模场景验证