【混沌工程】 docker環境下模擬網絡延遲和丟包

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













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章