前言:
本文介绍一款开源的故障注入工具chaosblade,该工具原本由阿里研发,现已开源;工具特点:功能强大,使用简单。
该工具故障注入包含:cpu,内存,磁盘io,磁盘占用,网络注入等
简写:
status --> s; destroy -->d; create --> c;
使用方法:
工具获取连接:https://github.com/chaosblade-io/chaosblade/releases
将工具上传至待测机器并解压
进入解压的工具目录,执行对应注入命令
./blade create cpu load --cpu-list 0-3 --cpu-percent 80
执行成功,会返回一个id,如需撤销故障注入,执行如下命令
./blade d {id}
查询曾经注入的故障id,便于删除
./blade s --type c
磁盘注入:
参数介绍:
--path string 需要填充的目录,默认值 /
--size string 需要填充的文件大小,单位M,取值整数,例如:--size 1024
--reserve string 保留磁盘大小,单位MB,取值为不包含单位的正整数,例如:--reserve 1024。如果size、percent、reserve参数都存在,优先级:percent > reserve > size.。
--percent string 指定磁盘使用率,如 --percent 80
--retain-handle 是否保留填充 (亲测,只要不加timeout参数,默认保留填充,只有磁盘空间注入有此参数)
--timeout string 设定运行时长,单位秒 (此参数为通用参数,各种故障场景几乎都可以加)
例如:
blade create disk fill --path /home --percent 80 --retain-handle 填充home目录80%的使用空间
blade create disk fill --path /home --size 200 --retain-handle 填充home目录200M
blade create disk fill --path /home --reserve 200 --retain-handle 仅保留/home目录200M
cpu注入:
blade create cpu load --cpu-list 0,1 --cpu-percent 80 --加压0,1两个核心,负载到80%
blade create cpu load --cpu-list 0-15 --cpu-percent 60
blade create cpu load --cpu-count 3 --将3个核心加压
blade create cpu fullload --cpu满载
blade create cpu load --cpu-list 0,1,2 --timeout 100 --将0,1,2三个核心加压100s,不带timeout参数默认一直加压
内存注入:
blade create mem load --mode ram --mem-percent 80 --占用80%的ram内存
blade create mem load --mode ram --mem-percent 80 --rate 100 --占用80%ram内存,占用速率100M每秒,rate参数只在占用ram时生效。
blade create mem load --mode catche --reserve 100 --占用catche内存,保留100M内存,速率100M/S,不加mode参数,默认值为catche,采用ram占用必须加mode参数。
注:内存注入满了会导致blade故障无法消除,推荐加percent参数;不使用任何参数会默认将内存加满,使用需谨慎。
磁盘IO注入:
blade create disk burn --write --path /home --将/home目录挂载磁盘读取磁盘压力加大
blade create disk burn --write --read --path /home --同时加大磁盘读写压力
blade creat disk burn --write --size 100 --path /home --加大磁盘写的压力,块大小为100M,此参数可不加,默认10M。
网络相关注入:
注:项目网络延迟,丢包等故障注入平时都是使用tc命令,blade注入原理也是使用tc,这里不总结了,很少用此工具进行丢包,延时注入,有兴趣可以自己研究。
篡改dns域名解析:
blade create network dns --domain www.baidu.com --ip 10.0.0.0 --篡改本地域名解析ip为10.0.0.0。(ps:此条没试过,大家可以试试)
网络包损坏:
Eg:blade create network corrupt --percent 80 --destination-ip 1.1.1.1 --interface eth0 指定eth0发向1.1.1.1的包损坏80%
网络包乱序:
此场景参数较多,列举一下:
--destination-ip string 目标ip,支持子网掩码,如192.168.1.0/24,则对此网段所有ip生效
--exclude-port string 排除掉的对端端口,可以指定多个,如:80,22,80-100;此参数不能与--local-port/--remote-port参数一起使用
--exclude-ip string 排除受影响的ip,支持逗号分隔和子网掩码
--interface string 指定网卡
--local-port string 本地端口
--offset string 延迟事件上下浮动值,单位ms
--remote-port string 远程端口
--correlation string 和上一包的相关性,取值0-100,必要参数
--gap string 包序列大小,取值正整数
--percent string 立即发送百分比,其实就是不搞乱序的包占比
--time string 网络延时时间
--force 强制覆盖tc规则
--timeout string 设定运行时长
--ignore-peer-port 针对添加--exclude-port参数报ss命令找不到的情况下使用
Eg:blade create network reorder --correlation 80 --percent 80 --gap 2 --time 500 --interface eth0 --destination-ip 1.1.1.1 针对目标ip1.1.1.1的网络包进行乱序处理
网络包重复:
--destination-ip string 目标ip,支持子网掩码,如192.168.1.0/24,则对此网段所有ip生效
--exclude-port string 排除掉的对端端口,可以指定多个,如:80,22,80-100;此参数不能与--local-port/--remote-port参数一起使用
--exclude-ip string 排除受影响的ip,支持逗号分隔和子网掩码
--interface string 指定网卡
--local-port string 本地端口
--offset string 延迟事件上下浮动值,单位ms
--remote-port string 远程端口
--percent string 包重复百分比
--force 强制覆盖tc规则
--timeout string 设定运行时长
--ignore-peer-port 针对添加--exclude-port参数报ss命令找不到的情况下使用
Eg:blade create network duplicate --percent 80 --interface eth0 --destination-ip 1.1.1.1 指定ip,指定网口包重复80%
网络端口占用:
--port string 指定占用端口,必选项
--force 强制占用该端口,会将已使用该端口进程kill掉
--timeout string 设定运行时长
Eg:blade create network occupy --port 8080 --force 强制占用8080端口
其他
ChaosBlade可以对docker容器内进行故障注入,当前项目没有用到,如有需要可自行研究。
Eg:blade create docker cpu load