這是堅持技術寫作計劃(含翻譯)的第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直接下載映象
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
等軟體,檢視頻寬使用情況判斷是否生效,也可以通過檢視日誌來判斷。
但是會經常性的出現
error pulling image configuration: received unexpected HTTP status: 502 Bad Gateway
最後
需要結合實際情況,配置相關引數,比如,檔案失效時間,用來平衡檔案有效期及磁碟使用量。
參考資料
- 直擊阿里雙11神祕技術:PB級大規模檔案分發系統“蜻蜓”
- 深度解讀阿里巴巴雲原生映象分發系統 Dragonfly
- Dragonfly Quick Start
- 加速和簡化構建Docker(基於Google jib)
- 浙江移動容器雲基於 Dragonfly 的統一檔案分發平臺生產實踐
招聘小廣告
山東濟南的小夥伴歡迎投簡歷啊 加入我們 , 一起搞事情。
長期招聘,Java程式設計師,大資料工程師,運維工程師,前端工程師。