创建 docker 相关的混沌实验,比如杀容器,容器网络延迟、丢包,杀容器里的进程等,不同的场景依赖的参数不同,目前支持以下实验场景:
[blade create docker container](blade create docker container.md) 容器自身场景,比如杀容器
[blade create docker cpu](blade create docker cpu.md) 容器内 CPU 负载场景
[blade create docker network](blade create docker network.md) 容器内网络场景
[blade create docker process](blade create docker process.md) 容器内进程场景
执行 docker 相关实验场景,必须确保本地能访问 docker server,可通过 tcp 或 socket 方式访问,默认是通过本地 socket 访问,也可通过 --docker-endpoint 参数指定。
注意:如果执行 CPU 场景,必须指定 chaosblade 安装包,因为需要将安装包拷贝到容器 /opt 目录下执行,使用 --blade-tar-file 参数指定,例如
--blade-tar-file /home/admin/chaosblade-0.4.0.tar.gz
。如果执行网络或者进程场景,无需指定,但这两个场景依赖 chaosblade-tool 镜像,默认是从registry.cn-hangzhou.aliyuncs.com/chaosblade
仓库下载,也可以通过 --image-repo 参数指定,例如--image-repo registry-vpc.cn-hangzhou.aliyuncs.com/chaosblade
容器内 CPU 负载实验场景,同基础资源的 CPU 场景
支持 CPU 场景命令如下:
blade create docker cpu load
容器内 CPU 负载场景,同 [blade create cpu load](blade create cpu load.md)
除了上述基础场景各自所需的参数外,在 docker 环境下,还支持的参数如下:
--blade-override 是否覆盖容器内已有的 chaosblade 工具,默认是 false,表示不覆盖,chaosblade 在容器内的部署路径为 /opt/chaosblade
--blade-tar-file string 指定本地 chaosblade-VERSION.tar.gz 工具包全路径,用于拷贝到容器内执行
--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
对 container id 是 5239e26f6329 的做 CPU 使用率 80% 的实验场景,执行命令如下:
blade create docker cpu fullload --cpu-percent 80 --blade-tar-file /root/chaosblade-0.4.0.tar.gz --container-id 5239e26f6329
执行成功会返回 :
{"code":200,"success":true,"result":"0a47bb2f75dc71ab"}
可在本机或者容器内使用 top 命令验证 CPU 使用率:
%Cpu(s): 22.7 us, 57.2 sy, 0.0 ni, 20.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
销毁实验执行以下命令:
blade destroy 0a47bb2f75dc71ab
Q: 执行报如下错误:{"code":801,"success":false,"error":"\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000Omv: cannot stat '/opt/chaosblade-0.4.0.linux-amd64': No such file or directory"}
A:需要修改将 chaosblade-0.4.0.linux-amd64.tar.gz 包名改为 chaosblade-VERSION.tar.gz 格式,即此处改为 chaosblade-0.4.0.tar.gz
Q: 执行报如下错误: {"code":801,"success":false,"error":"\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000"}
A:重试即可
登录容器,kill 掉 chaos_burncpu 进程即可,或者主机上执行
容器内网络实验场景,同基础资源的网络场景
支持的网络场景命令如下:
blade create docker network delay
容器网络延迟,同 [blade create network delay](blade create network delay.md)
blade create docker network loss
容器网络丢包,同 [blade create network loss](blade create network loss.md)
blade create docker network dns
容器内域名访问异常,同 [blade create network dns](blade create network dns.md)
除了上述基础场景各自所需的参数外,在 docker 环境下,还支持的参数如下:
--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--image-repo string chaosblade-tool 镜像仓库地址,默认是从 `registry.cn-hangzhou.aliyuncs.com/chaosblade`
对 nginx 容器 80 端口做访问延迟 3 秒,执行命令如下:
blade create docker network delay --time 3000 --interface eth0 --local-port 80 --container-id 5239e26f6329
第一次会拉取 chaosblade-tool 镜像,可能会慢一些。返回:
{"code":200,"success":true,"result":"fc3a1b0b4295e47f"}
表示执行成功,可以看到新启动了一个名字为 5239e26f6329-delay 的容器,通过 sidecar 方式,复用目标容器网络,执行实验。
在本机访问该容器映射出的端口服务,比如映射的端口为 0.0.0.0:32768->80/tcp
,可以看出发生延迟:
[root@izbp11rrxxxx ~]# time curl localhost:32768
real 0m9.001s
user 0m0.004s
sys 0m0.002s
此处延迟 9 秒的原因是涉及到多次 80 端口访问。
也可以在同一网段下的另外一台容器内访问目标容器的 80 服务,同样能验证效果:
bash-4.4# time curl 172.17.0.2:80
real 0m9.005s
user 0m0.004s
sys 0m0.001s
执行以下命令可销毁实验:
blade destroy fc3a1b0b4295e47f
启动的 sidecar 容器会被销毁,网络恢复。可以通过上述方法再次验证。
[root@izbp11rr7oumxxxxx ~]# time curl localhost:32768
real 0m0.011s
user 0m0.003s
sys 0m0.002s
Q:执行命令报错: {"code":604,"success":false,"error":"RTNETLINK answers: File exists\n exit status 2 exit status 1"}
A:网络演练场景已存在,可以使用 docker ps | grep chaosblade
来查看正在运行的 sidecar 容器
容器内进程场景,同基础资源进程场景
支持的进程场景如下:
blade create docker process kill
杀容器内指定的进程,同 [blade create process kill](blade create process kill.md)
blade create docker process stop
挂起容器内指定的进程,同 [blade create process stop](blade create process stop.md)
除了上述基础场景各自所需的参数外,在 docker 实验场景下还支持的参数是:
--blade-override 是否覆盖容器内已有的 chaosblade 工具,默认是 false,表示不覆盖,chaosblade 在容器内的部署路径为 /opt/chaosblade
--blade-tar-file string 指定本地 chaosblade-VERSION.tar.gz 工具包全路径,用于拷贝到容器内执行
--container-id string 目标容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
杀掉容器内 nginx 进程,命令执行如下:
blade create docker process kill --process nginx --blade-tar-file /root/chaosblade-0.4.0.tar.gz --container-id ee54f1e61c08
Q: {"code":801,"success":false,"error":"open : no such file or directory"}
A: 没有指定 --blade-tar-file 参数
Q:{"code":801,"success":false,"error":"\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000"}
A:重试即可
Q: {"code":503,"success":false,"error":"ps command not found"}
A: 目标容器内没有 ps 命令
此命令主要执行 container 资源自身的场景,比如删容器
支持场景命令如下
blade create docker container remove
删除容器
--container-id string 要删除的容器 ID
--docker-endpoint string Docker server 地址,默认为本地的 /var/run/docker.sock
--force 是否强制删除
删除容器后,执行 blade destroy UID 命令不会恢复容器,需要靠容器自身的管理拉起!
删除 container id 是 a76d53933d3f 的容器,命令如下:
blade create docker container remove --container-id a76d53933d3f
如果返回 {"code":200,"success":true,"result":"ed79c686daa88152"}
说明执行成功。如果执行失败,会有详细的错误提升
Q: {"code":801,"success":false,"error":"Error: No such image: xxx/chaosblade-tool:0.4.0"}
A: 说明 chaosblade-tool 镜像拉取失败,需要通过 --image-repo 指定正确的镜像仓库地址