原文地址: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容器的 killstop, removepause

当然, 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