天天看點

【混沌工程】 docker環境下模拟網絡延遲和丢包Pubma

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