012-P2P加速Docker映象分發(阿里Dragonfly)

趙安家發表於2019-03-25

這是堅持技術寫作計劃(含翻譯)的第12篇,定個小目標999,每週最少2篇。

吐槽一下,最近有點懶,居然欠了4篇,後續會慢慢補上。

介紹

如果說,微服務和容器是最佳拍檔,那麼模組多例項是肯定少不了。
假如沒有使用類似 Google jib 等手段進行映象分層(利用映象快取),勢必會造成

  • 頻寬浪費:尤其是公網頻寬,如果是自建harbor,那麼會容易導致單節點網路卡被打滿,如果用了harbor聯邦,又會導致資料同步等運維問題。
  • 叢集拉起慢:映象下載慢,必然會導致服務拉起慢。

關於Google jib可以參見我另外一篇 加速和簡化構建Docker(基於Google jib) ,本文只介紹 Dragonfly + dfdaemon

Dragonfly是阿里巴巴自研並開源的一款基於P2P協議的檔案分發系統。除了使用 dfget 進行檔案下載外,還支援dfdaemon 進行docker映象下載。

關於Dragonfly的映象分發的原理性說明,可參見 直擊阿里雙11神祕技術:PB級大規模檔案分發系統“蜻蜓” ,文中介紹很詳細,此處不多說明。

實驗環境

型別 系統 ip docker version
supernode Ubuntu Server 16.04.6 LTS X64 192.168.0.44 17.06.2~ce-0~ubuntu
clinet1 Ubuntu Server 16.04.6 LTS X64 192.168.0.40 17.06.2~ce-0~ubuntu
clinet2 Ubuntu Server 16.04.6 LTS X64 192.168.0.45 17.06.2~ce-0~ubuntu

注意: 
如果是實驗目的,建議用Vmware,並且在關鍵操作時備份快照(比如,剛裝完環境),這樣能夠及時,乾淨的還原現場,節省每次重灌系統導致的時間浪費

安裝

吐槽一下Dragonfly的文件,簡直讓人不知所以。結合issues + 釘釘群內請教,遂整理出最簡使用文件。

supernode

可選:給supernode增加docker加速器,可以參考 cr.console.aliyun.com/cn-hangzhou… ,如果不需要,可以去掉。

$ cat <<EOD >/etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] 
}
EOD
$ systemctl restart docker 
複製程式碼
$ docker run --name dragonfly-supernode --restart=always -d -p 8001:8001 -p 8002:8002 -v /data/dragonfly/supernode:/home/admin/supernode registry.cn-hangzhou.aliyuncs.com/dragonflyoss/supernode:0.3.0 -Dsupernode.advertiseIp=192.168.0.44
複製程式碼

說明:

  • --restart=always 在容器退出時,自動重啟容器,防止異常kill或者oom導致的異常退出
  • registry.cn-hangzhou.aliyuncs.com/dragonflyoss/supernode:0.3.0 dragonfly的supernode目前沒有docker hub映象,只能用阿里雲的
  • -v /data/dragonfly/supernode:/home/admin/supernode 將supernode的data dir掛載到宿主機上
  • -Dsupernode.advertiseIp=192.168.0.44 設定clinet可以訪問的supernode ip,這是一個大坑。如果不設定,有可能會導致client無法連線supernode,屆時,docker pull會走clinet的網路,從真實的registry直接下載映象

image.png

dfdaemon

$ cat <<EOD >/etc/dragonfly.conf
[node]
address=192.168.0.44
EOD
$ docker run --name dragonfly-dfclient --restart=always -d -p 65001:65001 -v /root/.small-dragonfly:/root/.small-dragonfly -v /etc/dragonfly.conf:/etc/dragonfly.conf dragonflyoss/dfclient:v0.3.0 --registry=https://xxx.mirror.aliyuncs.com  --ratelimit 100M
$ cat <<EOD >/etc/docker/daemon.json
{
"registry-mirrors": ["http://127.0.0.1:65001"]
}
EOD
$ systemctl restart docker 
複製程式碼

說明:

  • 在 /etc/dragonfly.conf 中配置client可以訪問的supernode的ip地址,但是,目前官方沒有做HA,supernode沒法組叢集,撐死算是聯邦,不能共享檔案資訊,而且最坑的是,快速開始裡,中英文均未提供需要配置此檔案,而是在 Downloading Files with Dragonfly 等有所提及(我都是被坑完後,用關鍵詞在d7y的org裡搜尋,類似知道答案後,找出處 手動[捂臉])
  • -v /root/.small-dragonfly:/root/.small-dragonfly ,將容器中的關鍵目錄掛載到宿主機上,防止重啟或者映象升級時,資料丟失
  • --registry=https://xxx.mirror.aliyuncs.com 從何處下載映象,可以寫harbor地址,也可以寫加速器地址。預設是 index.docker.io ,但是,因為國內網路原因,會導致大概率性失敗。很靈異。而官方文件是寫的 --registry https://xxx.xx.x 不能算是坑,但是,對於docker不熟悉的,往往會不知能不能用加速器。
  • --ratelimit 100M 是限速,預設是20M ,這肯定不算坑哈,這是正常特性,在  dfdaemon#Options 有說明,但是,文件是有誤的 -ratelimit 而實際是 --ratelimit ,如果不改此引數,會發現,下載很慢。
  • 修改/etc/docker/daemon.json 是為了讓docker engine走 dfdaemon
  • systemctl restart docker 是為了讓daemon生效

測試

大檔案測試

$ docker pull anjia0532/kubeflow-images-public.tensorflow-1.6.0-notebook-gpu:v20180604-b3733835
複製程式碼

可以通過 iftop 等軟體,檢視頻寬使用情況判斷是否生效,也可以通過檢視日誌來判斷。

image.png

但是會經常性的出現 error pulling image configuration: received unexpected HTTP status: 502 Bad Gateway

最後

需要結合實際情況,配置相關引數,比如,檔案失效時間,用來平衡檔案有效期及磁碟使用量。

參考資料

招聘小廣告

山東濟南的小夥伴歡迎投簡歷啊 加入我們 , 一起搞事情。

長期招聘,Java程式設計師,大資料工程師,運維工程師,前端工程師。

相關文章