原文位址: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