原文地址:https://www.chenquan.me/archives/315
混沌工程最早是Netflix引入的,用来验证服务稳定性的工程。地址:https://github.com/Netflix/chaosmonkey
国内的阿里云也开源了一个chaos工具,见这里:https://github.com/chaosblade-io/chaosblade
我们这里介绍的一更mini的工具pubma, 下面我就直接贴原作者的博客内容了
Pubma地址https://github.com/alexei-led/pumba
Pumba 能做什么?
简单地说,Pubma 能够完成包括对Docker容器的 kill
,stop
, remove
,pause
。
当然, Pubma 也能够完成网络模拟,模拟包括一系列的网络问题(延迟,丢包,使用不同的丢包模型,带宽限制等等)。
针对网络模拟,Pumba使用的是Linux内核tc
netem
实现的。 如果目标container不支持tc的话,Pumba将会使用sidekick 附着到目标容器进行控制。
怎么使用 Pumba
通常可以传一个容器列表到Pumba中,可以简单地写一个正则表达式来选择匹配的容器。如果你没有指定容器,那么Pumba将会对所有运行的容器进行干预。
如果你使用了--random
选项,那么Pumba将会在提供的容器列表中选择一些随机容器进行干扰。
你也可以通过传入一些重复参数,以及持续时间参数来更加精细地控制你需要产生的chaos 混沌。
如何安装 Pumba(注意这个文章里面的pumba版本可能比较低,实验请用最新版)
curl -L https://github.com/alexei-led/pumba/releases/download/0.5.2/pumba_linux_amd64 mv pumba_linux_amd64 /usr/local/bin/pumba chmod +x /usr/local/bin/pumba
通过正则随机干掉某些test开头的容器
# 在第一个terminal中运行7个测试容器,并什么都不做 for i in {0..7}; do docker run -d --rm --name test$i alpine tail -f /dev/null; done # 然后运行一个 名叫 `skipme` 的容器 docker run -d --rm --name skipme alpine tail -f /dev/null # 在另一个 terminal 中查看当前运行的docker 容器 watch docker ps -a # 回到第一个terminal中,然后每隔10s kill一个'test'开头的容器,并且忽略`skipme`容器 pumba --random --interval 10s kill re2:^test # 你可以随时按下 Ctrl-C 来停止 Pumba
为ping增加3000ms(正负50ms)的延迟,持续20秒,并使用normal分配模型
# 运行 "ping" 容器在terminal 1中 docker run -it --rm --name ping alpine ping 8.8.8.8 # 在termainal2中, 运行 pumba netem delay 命令, 分配到 "ping" 容器; 使用一个 "tc" 辅助容器 pumba netem --duration 20s --tc-image gaiadocker/iproute2 delay --time 3000 jitter 50 --distribution normal ping # pumba 将会在 20s 后退出, 或者用 Ctrl-C 退出
模拟丢包情况,UDP为例
在第一个terminal中,我们运行一个 server
Docker 容器,然后用ipref来监控这个dokcer,这个server容器会启动一个UDP服务器。
在第二个terminal中,启动一个有iperf监控报文发送容器,该容器会发UDP数据包到 server 容器。然后我们在第三个Terminal中运行 pumba netem loss
命令,来为容器增加丢包场景。
# 先创建一个docker网络 docker network create -d bridge bridge # Terminal 1 # 运行 server 容器 docker run -it --name server --network bridge --rm alpine sh -c "apk add --no-cache iperf; sh" # 在进入交互命令行的Server容器中运行UDP服务,在5001端口监听 sh$ ip a # 先查看下这个容器的ip地址,例如我这里是172.17.0.2 sh$ iperf -s -u -i 1 # Terminal 2 # 运行 client 容器 docker run -it --name client --network bridge --rm alpine sh -c "apk add --no-cache iperf; sh" # 在进入交互命令行的 client容器中,发送UDP数据报到服务端,可以看到没有数据丢包 sh$ iperf -c 172.17.0.2 -u -t 300 # Terminal 1 # 我们可以看到服务端没有数据丢包 # Terminal 3 # 往client容器注入 20% 的数据丢包,持续2分钟 pumba netem --duration 2m --tc-image gaiadocker/iproute2 loss --percent 20 client # Terminal 2 # 重新在客户端container 中发送数据报,可以看到20%的丢包 sh$ iperf -c 172.17.0.2 -u -t 300
Weave 网络
这部分内容,请直接看作者blog https://www.chenquan.me/archives/315