一、简介
1、官方文档
开源地址:https://github.com/chaosblade-io/chaosblade/
官方文档:https://chaosblade.io/docs/
中文命令使用文档(重要):https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn
2、简介
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。
Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。
ChaosBlade 不仅使用简单,而且支持丰富的实验场景,场景包括:
- 基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景;
- Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景;
- C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景;
- Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景;
- 云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景;
二、使用
1、下载安装
可以在releases中查找对应的版本,并下载安装:https://github.com/chaosblade-io/chaosblade/releases
chaosblade 支持k8s集群使用herm安装,此处就暂略了。
# 下载
wget https://github.com/chaosblade-io/chaosblade/releases/download/v1.7.4/chaosblade-1.7.4-linux-amd64.tar.gz
# 解压
tar -zxvf chaosblade-1.7.4-linux-amd64.tar.gz
2、模拟CPU满载
CPU 相关的混沌实验包含 CPU 满载,可以指定核数、具体核满载或者总 CPU 负载百分比。
旨在 CPU 在特定负载下,验证服务质量、监控告警、流量调度、弹性伸缩等能力。
# 创建 CPU 满载实验
blade create cpu load
# 返回结果如下
{"code":200,"success":true,"result":"beeaaf3a7007031d"}
# code 的值等于 200 说明执行成功,其中 result 的值就是 uid。使用 top 命令验证实验效果
Tasks: 100 total, 2 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu0 : 21.3 us, 78.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 20.9 us, 79.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 20.5 us, 79.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 20.9 us, 79.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 4 核都满载,实验生效,销毁实验
blade destroy beeaaf3a7007031d
# 返回结果如下
{"code":200,"success":true,"result":"command: cpu load --help false --debug false"}
# 指定随机两个核满载
blade create cpu load --cpu-count 2
# 使用 top 命令验证结果如下,实验生效
Tasks: 100 total, 2 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu0 : 17.9 us, 75.1 sy, 0.0 ni, 7.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 3.0 us, 6.7 sy, 0.0 ni, 90.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 19.7 us, 80.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 指定索引是 0,3 的核满载,核的索引从 0 开始
blade create cpu load --cpu-list 0,3
# 使用 top 命令验证结果如下,实验生效
Tasks: 101 total, 2 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu0 : 23.5 us, 76.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 20.9 us, 79.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 指定索引 1 到 3 的核满载
blade create cpu load --cpu-list 1-3
Tasks: 102 total, 4 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu0 : 2.4 us, 7.1 sy, 0.0 ni, 90.2 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 20.0 us, 80.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 15.7 us, 78.7 sy, 0.0 ni, 5.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 19.1 us, 78.9 sy, 0.0 ni, 2.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 指定百分比负载
blade create cpu load --cpu-percent 60
# 可以看到 CPU 总的使用率达到 60%, 空闲 40%
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.8 us, 44.1 sy, 0.0 ni, 40.0 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
3、模拟内存占用
指定内存占用,注意,此场景触发内存占用满,即使指定了 --timeout 参数,也可能出现通过 blade 工具无法恢复的情况,可通过重启机器解决!!!推荐指定内存百分比!
由于目前内存大小计算通过 memory.stat 等文件计算,所以和 free 命令计算不一致,同 top 命令一致,验证时请使用 top 命令查看内存使用。后续会针对内存占用场景进行优化。
# 在执行命令之前,先使用 top 命令查看内存使用信息,如下,总内存大小是 8G,使用了 7.6%
KiB Mem : 7.6/8010196
# 执行内存占用 50%
blade c mem load --mode ram --mem-percent 50
# 查看内存使用
KiB Mem : 50.0/8010196
# 执行内存占用 100%
KiB Mem : 99.6/8010196
# 保留 200M 内存,总内存大小 1G
blade c mem load --mode ram --reserve 200 --rate 100
KiB Mem : 1014744 total, 78368 free, 663660 used, 272716 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 209652 avail Mem
KiB Mem : 79.7/1014744 [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ]
4、模拟网络延时
可以指定网卡、本地端口、远程端口、目标 IP 延迟。需要特别注意,如果不指定端口、ip 参数,而是整个网卡延迟,切记要添加 --timeout 参数或者 --exclude-port 参数,前者是指定运行时间,自动停止销毁实验,后者是指定排除掉的延迟端口,两者都是防止因延迟时间设置太长,造成机器无法连接的情况,如果真实发生此问题,重启机器即可恢复。
本地端口和远程端口之间是或的关系,即这两个端口都会发生延迟,只要指定了本地端口或者远程端口,无需指定需要排除的端口。端口与 IP 之间是与的关系,即指定的 IP:PORT 发生延迟。
网络延迟场景主要验证网络异常的情况下,系统的自我容错能力。
# 访问本机 8080 和 8081 端口延迟 3 秒,延迟时间上下浮动 1 秒
blade create network delay --time 3000 --offset 1000 --interface eth0 --local-port 8080,8081
{"code":200,"success":true,"result":"9b4aa9fabe073624"}
# 可以在另一台相同网络内的机器通过 telnet 命令验证,即 telnet xxx.xxx.xxx.xxx 8080
# 销毁实验
blade destroy 9b4aa9fabe073624
# 本机访问外部 14.215.177.39 机器(ping www.baidu.com 获取到的 IP)80 端口延迟 3 秒
blade create network delay --time 3000 --interface eth0 --remote-port 80 --destination-ip 14.215.177.39
# 可在本机通过 telnet 14.215.177.39 80 命令验证
# 对整个网卡 eth0 做 5 秒延迟,排除 22 和 8000到8080 端口
blade create network delay --time 5000 --interface eth0 --exclude-port 22,8000-8080
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别 telnet xxx.xxx.xxx.xxx 8080 和 telnet xxx.xxx.xxx.xxx 8081 进行测试
5、网络丢包
可以指定网卡、本地端口、远程端口、目标 IP 丢包。需要特别注意,如果不指定端口、ip 参数,而是整个网卡丢包,切记要添加 --timeout 参数或者 --exclude-port 参数,前者是指定运行时间,自动停止销毁实验,后者是指定排除掉的丢包端口,两者都是防止因丢包率设置太高,造成机器无法连接的情况,如果真实发生此问题,重启机器即可恢复。
本地端口和远程端口之间是或的关系,即这两个端口都会发生丢包,只要指定了本地端口或者远程端口,无需指定需要排除的端口。端口与 IP 之间是与的关系,即指定的 IP:PORT 发生丢包。
网络丢包场景主要验证网络异常的情况下,系统的自我容错能力。
# 访问本机 8080 和 8081 端口丢包率 70%
blade create network loss --percent 70 --interface eth0 --local-port 8080,8081
{"code":200,"success":true,"result":"b1cea124e2383848"}
# 可以在另一台相同网络内的机器通过 curl 命令验证,即 curl xxx.xxx.xxx.xxx:8080,不使用 telnet 的原因是 telnet 内部有重试机制,影响实验验证。如果将 percent 的值设置为 100,可以使用 telnet 验证。
# 销毁实验
blade destroy b1cea124e2383848
# 本机访问外部 14.215.177.39 机器(ping www.baidu.com 获取到的 IP)80 端口丢包率 100%
blade create network loss --percent 100 --interface eth0 --remote-port 80 --destination-ip 14.215.177.39
# 可在本机通过 curl 14.215.177.39 命令验证,会发现访问不通。执行 curl 14.215.177.38 是通的。
# 对整个网卡 eth0 做 60% 的丢包,排除 22 和 8000到8080 端口
blade create network loss --percent 60 --interface eth0 --exclude-port 22,8000-8080
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别执行多次 curl xxx.xxx.xxx.xxx:8080 和 telnet xxx.xxx.xxx.xxx:8081 进行测试
# 实现整个网卡不可访问,不可访问时间 20 秒。执行完成下面命令后,当前的网络会中断掉,20 秒后恢复。切记!!勿忘 --timeout 参数
blade create network loss --percent 100 --interface eth0 --timeout 20
6、网络本地端口占用
本地端口占用,验证端口已被占用的情况下,使用此端口的业务容错能力
# 指定 8080 端口占用
blade c network occupy --port 8080 --force
# 命令执行前
netstat -tanp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 19562/java
# 命令执行后
netstat -tanp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 20041/chaos_occupyn