ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。
Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。
ChaosBlade 不仅使用简单,而且支持丰富的实验场景,场景包括:
基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景;
Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景;
C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景;
Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景;
云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景;
将场景按领域实现封装成一个个单独的项目,不仅可以使领域内场景标准化实现,而且非常方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 chaosblade cli 统一调用。目前包含的项目如下:
chaosblade:混沌实验管理工具,包含创建实验、销毁实验、查询实验、实验环境准备、实验环境撤销等命令,是混沌实验的执行工具,执行方式包含 CLI 和 HTTP 两种。提供完善的命令、实验场景、场景参数说明,操作简洁清晰。
chaosblade-spec-go: 混沌实验模型 Golang 语言定义,便于使用 Golang 语言实现的场景都基于此规范便捷实现。
chaosblade-exec-os: 基础资源实验场景实现。
chaosblade-exec-docker: Docker 容器实验场景实现,通过调用 Docker API 标准化实现。
chaosblade-operator: Kubernetes 平台实验场景实现,将混沌实验通过 Kubernetes 标准的 CRD 方式定义,很方便的使用 Kubernetes 资源操作的方式来创建、更新、删除实验场景,包括使用 kubectl、client-go 等方式执行,而且还可以使用上述的 chaosblade cli 工具执行。
chaosblade-exec-jvm: Java 应用实验场景实现,使用 Java Agent 技术动态挂载,无需任何接入,零成本使用,而且支持卸载,完全回收 Agent 创建的各种资源。
chaosblade-exec-cplus: C++ 应用实验场景实现,使用 GDB 技术实现方法、代码行级别的实验场景注入。
chaosblade下载地址
wget -c https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/1.3.0/chaosblade-1.3.0-linux-amd64.tar.gz
tar -zxvf chaosblade-1.3.0-linux-amd64.tar.gz
若安装目录为
/root/chaosblade/chaosblade-1.3.0
cat >> ~/.bash_profile << \EOF
PATH=$PATH:/root/chaosblade/chaosblade-1.3.0
export PATH
EOF
source ~/.bash_profile
官方文档
官方文档介绍较为详细,下面选择部分命令测试。
[root@node1 ~]# blade create -h
Create a chaos engineering experiment
Usage:
blade create [command]
Aliases:
create, c
Examples:
blade create cpu load --cpu-percent 60
Available Commands:
cplus C++ chaos experiments
cpu Cpu experiment
disk Disk experiment
docker Docker experiment
druid Experiment with the Druid
dubbo Experiment with the Dubbo
es ElasticSearch experiment!
file File experiment
gateway gateway experiment!
hbase hbase experiment!
http http experiment
jedis jedis experiment
jvm Experiment with the JVM
k8s Kubernetes experiment
kafka kafka experiment
lettuce redis client lettuce experiment
log log experiment
mem Mem experiment
mongodb MongoDB experiment
mysql mysql experiment
network Network experiment
process Process experiment
psql Postgrelsql experiment
rabbitmq rabbitmq experiment
redisson redisson experiment
rocketmq Rocketmq experiment,can make message send or pull delay and exception
script Script chaos experiment
servlet java servlet experiment
strace strace experiment
systemd Systemd experiment
tars tars experiment
Flags:
-a, --async whether to create asynchronously, default is false
-e, --endpoint string the create result reporting address. It takes effect only when the async value is true and the value is not empty
-h, --help help for create
-n, --nohup used to internal async create, no need to config
--uid string Set Uid for the experiment, adapt to docker
Global Flags:
-d, --debug Set client to DEBUG mode
Use "blade create [command] --help" for more information about a command.
blade status --type create
blade destroy 6fa04946baf42920
旨在 CPU 在特定负载下,验证服务质量、监控告警、流量调度、弹性伸缩等能力。
blade create cpu fullload --timeout 60
验证磁盘 io 高负载下对系统服务的影响,比如监控告警、服务稳定性等。
blade create disk burn --read --path /home
blade create disk burn --write --path /home
验证磁盘满下对系统服务的影响,比如监控告警、服务稳定性等。
此处使用fallocate
预分配空间,瞬间占满
空间(对于大部分文件系统例如ext4 xfs)并不实际占用空间。
df -h /home
blade c disk fill --path /home --percent 80 --retain-handle
df -h /home
df -h /home
blade c disk fill --path /home --reserve 0 --timeout 30
df -h /home
提供http服务,供远程调用
blade server start -p 9526
开放防火墙端口
9526/tcp
firewall-cmd --zone=public --add-port=9526/tcp --permanent
firewall-cmd --reload
其中
%20
为空格
curl http://192.168.198.131:9526/chaosblade?cmd=create%20cpu%20load%20--cpu-percent%2050
curl http://192.168.198.131:9526/chaosblade?cmd=destroy%204b454fae5486e53e
更多……
可使用另外一台客户端机器测试网络延迟,
time curl http://192.168.198.131/
可能涉及多次访问。
docker pull nginx:latest
docker run --name nginx-test -p 80:80 -d nginx
time curl http://192.168.198.131/
blade create docker network delay --time 3000 --interface eth0 --local-port 80 --container-id 70b82b112fac
time curl http://192.168.198.131/
blade destroy 0de302011f872a49
blade prepare jvm
(耗时数秒)是执行blade create jvm
的先决条件;blade prepare jvm
对同一个进程多次进行挂载java agent
操作,仅有一个实例,更新时间发生变化。- 新版本中,执行
blade create jvm
操作,若没有处于运行状态的blade prepare jvm
实例,则会隐式创建(旧版本可能会报错),因此还是推荐显示创建blade prepare jvm
实例。
说明:
fb5a73661026c4f0
为blade create jvm
试验实例ID;d54ae242c4538e97
为隐式生成的blade prepare jvm
实例ID
blade status --type prepare --target jvm
blade create jvm delay --time 3000 --classname=com.example.blade.HelloController --methodname=hello --pid 6428
blade status --type prepare --target jvm
blade destroy fb5a73661026c4f0
blade status --type prepare --target jvm
blade revoke d54ae242c4538e97
或者
说明:
4d5adfcbc7d46956
为blade create jvm
试验实例ID;c05f768526eaf4db
为显式生成的blade prepare jvm
实例ID
blade prepare jvm --pid 6428
blade create jvm delay --time 3000 --classname=com.example.blade.HelloController --methodname=hello --pid 6428
blade status --type prepare --target jvm
blade destroy 4d5adfcbc7d46956"
blade revoke c05f768526eaf4db
blade status --type prepare --target jvm