2018 年 11 月, 源于阿里巴巴的云原生鏡像分發(fā)系統(tǒng)—— Dragonfly 在 KubeCon 上?,F(xiàn)場(chǎng)亮相,成為 CNCF 沙箱級(jí)別項(xiàng)目(Sandbox Level Project)。
Dragonfly 主要解決以 Kubernetes 為核心的分布式應(yīng)用編排系統(tǒng)的鏡像分發(fā)難題。2017 年開源即成為阿里巴巴最為核心的基礎(chǔ)設(shè)施技術(shù)之一。開源一年以來,Dragonfly 已在諸多行業(yè)落地。
DCOS 是浙江移動(dòng)容器云平臺(tái),目前在平臺(tái)式運(yùn)行的應(yīng)用系統(tǒng)已有 185 套,包括手機(jī)營(yíng)業(yè)廳、CRM 應(yīng)用等核心系統(tǒng)。本文將主要介紹浙江移動(dòng)容器云(DCOS)平臺(tái)以 Dragonfly 為改革“利器”,成功解決了運(yùn)營(yíng)商大規(guī)模集群場(chǎng)景下分發(fā)效率低、成功率低以及網(wǎng)絡(luò)帶寬控制難等問題;并反哺社區(qū),在 Dragonfly 界面功能、生產(chǎn)高可用部署層面對(duì) Dragonfly 進(jìn)行了升級(jí)。
DCOS 容器云在生產(chǎn)環(huán)境中
遇到的挑戰(zhàn)
隨著浙江移動(dòng)容器云(DCOS)平臺(tái)的持續(xù)完善,承載應(yīng)用不斷增加,在運(yùn)行容器數(shù)量接近 10000 個(gè)。采用傳統(tǒng) C/S(Client-Server)結(jié)構(gòu)的分發(fā)服務(wù)體系已經(jīng)越來越無法適應(yīng)大規(guī)模分布式應(yīng)用在代碼包發(fā)布、文件傳輸時(shí)的場(chǎng)景:
計(jì)算結(jié)點(diǎn)因網(wǎng)絡(luò)異常等原因,導(dǎo)致代碼包下載失敗,對(duì)應(yīng)用代碼包的完整性和一致性構(gòu)成影響。
在多用戶高并發(fā)情況下,可能會(huì)出現(xiàn) TB 級(jí)的文件傳輸,單點(diǎn)性能瓶頸增加了應(yīng)用發(fā)布時(shí)長(zhǎng)。
Dragonfly 簡(jiǎn)介
P2P(Peer-To-Peer)是一種點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)技術(shù),通過各結(jié)點(diǎn)互聯(lián),將網(wǎng)絡(luò)中的資源和服務(wù)分散在各個(gè)結(jié)點(diǎn)上。信息的傳輸和服務(wù)實(shí)現(xiàn)直接在結(jié)點(diǎn)之間進(jìn)行,避免了傳統(tǒng) C/S 結(jié)構(gòu)可能的單點(diǎn)瓶頸。
CNCF 開源文件分發(fā)服務(wù)解決方案 Dragonfly,是一種基于 P2P 與 CDN 技術(shù),構(gòu)建了適用于容器鏡像和文件的分發(fā)系統(tǒng),有效解決了企業(yè)大規(guī)模集群場(chǎng)景下文件和鏡像分發(fā)效率、成功率低以及網(wǎng)絡(luò)帶寬控制的問題。
Dragonfly 的核心組件:
SuperNode:超級(jí)結(jié)點(diǎn),以被動(dòng) CDN 方式從文件源下載文件并生產(chǎn)種子數(shù)據(jù)塊,在 P2P 網(wǎng)絡(luò)中,充當(dāng)網(wǎng)絡(luò)控制器,調(diào)度結(jié)點(diǎn)之間的分塊數(shù)據(jù)傳輸;
dfget proxy:部署在計(jì)算結(jié)點(diǎn)的代理,負(fù)責(zé) P2P 結(jié)點(diǎn)的數(shù)據(jù)塊下載和結(jié)點(diǎn)間的數(shù)據(jù)共享。
Dragonfly 分發(fā)工作原理(以鏡像分發(fā)為例):
容器鏡像不同于普通文件,由多層存儲(chǔ)構(gòu)成,下載也是分層下載,非單一文件。每層的鏡像文件都會(huì)被分割為 block 數(shù)據(jù)塊并作為種子。下載結(jié)束后,通過每層鏡像唯一的 ID 和 sha256 算法,重新組合成完整的鏡像。確保下載過程的一致性。
dfget-proxy 攔截客戶端 docker 發(fā)起的鏡像下載請(qǐng)求(docker pull)并轉(zhuǎn)換為向 SuperNode 的dfget 下載請(qǐng)求;
SuperNode 從鏡像源倉(cāng)庫(kù)下載鏡像并將鏡像分割成多個(gè) block 種子數(shù)據(jù)塊;
dfget 下載數(shù)據(jù)塊并對(duì)外共享已下載的數(shù)據(jù)塊,SuperNode 記錄數(shù)據(jù)塊下載情況,并指引后續(xù)下載請(qǐng)求在結(jié)點(diǎn)之間以 P2P 方式進(jìn)行數(shù)據(jù)塊下載;
Dokcer daemon 的鏡像 pull 機(jī)制將最終將鏡像文件組成完整的鏡像。
根據(jù) Dragonfly 的上述特性,浙江移動(dòng)容器云平臺(tái)結(jié)合生產(chǎn)實(shí)際決定引入 Dragonfly 技術(shù)對(duì)現(xiàn)行代碼包發(fā)布模式進(jìn)行改造,通過 P2P 網(wǎng)絡(luò)分?jǐn)偘l(fā)布時(shí)產(chǎn)生的單一文件服務(wù)器傳輸帶寬瓶頸,并利用 Docker 本身的鏡像 pull 機(jī)制來保證整個(gè)發(fā)布過程鏡像文件的一致性。
解決方案:統(tǒng)一分發(fā)平臺(tái)
架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)
功能架構(gòu)設(shè)計(jì)
在 Dragonfly 技術(shù)的基礎(chǔ)上,結(jié)合浙江移動(dòng)容器云生產(chǎn)實(shí)踐,統(tǒng)一分發(fā)平臺(tái)的總體設(shè)計(jì)目標(biāo)如下:
利用 Dragonfly 技術(shù)和文件下載校驗(yàn)功能,解決目前生產(chǎn)發(fā)布過程中應(yīng)用代碼包發(fā)布不一致、發(fā)布時(shí)間過長(zhǎng)的問題;
支持客戶端界面化,屏蔽后臺(tái)命令行細(xì)節(jié),簡(jiǎn)化操作流程,效率更高;
支持 Mesos、K8s、Host、VM 等多種云環(huán)境下的分發(fā),并實(shí)現(xiàn)集群的自主發(fā)現(xiàn),支持用戶通過統(tǒng)一分發(fā)平臺(tái)對(duì)目標(biāo)集群進(jìn)行統(tǒng)一化管理;
增加用戶權(quán)限控制和任務(wù)帶寬限制,支持多租戶多任務(wù)的分發(fā);
優(yōu)化 P2P Agent 部署方式,支持更快速的計(jì)算結(jié)點(diǎn) P2P 組網(wǎng)。
基于上述目標(biāo),統(tǒng)一分發(fā)平臺(tái)的總體架構(gòu)設(shè)計(jì)如下:
P2P 網(wǎng)絡(luò)層是支持不同異構(gòu)集群接入(主機(jī)集群、K8s 集群、Mesos 集群)的由多個(gè)計(jì)算結(jié)點(diǎn)構(gòu)成的分發(fā)網(wǎng)絡(luò);
分發(fā)服務(wù)層由功能模塊和存儲(chǔ)模塊構(gòu)成,是整個(gè)通用分發(fā)系統(tǒng)的核心架構(gòu)。其中,用戶接入鑒權(quán)模塊提供系統(tǒng)登錄審核功能;分發(fā)控制模塊基于 Dragonfly,實(shí)現(xiàn) P2P 方式的任務(wù)分發(fā);流量控制模塊提供租戶對(duì)不同任務(wù)的帶寬設(shè)置功能;配置信息數(shù)據(jù)庫(kù)負(fù)責(zé)記錄網(wǎng)絡(luò)層目標(biāo)集群、任務(wù)狀態(tài)等基本信息;用戶通過狀態(tài)查詢模塊可實(shí)現(xiàn)對(duì)分發(fā)任務(wù)執(zhí)行進(jìn)度的透明掌控;
用戶操作層由任意數(shù)量的界面化用戶客戶端構(gòu)成。
技術(shù)架構(gòu)實(shí)現(xiàn)
根據(jù)上述平臺(tái)設(shè)計(jì)目標(biāo)與總體架構(gòu)分析,容器云團(tuán)隊(duì)在開源組件的基礎(chǔ)上進(jìn)行了平臺(tái)功能的二次開發(fā),具體包括:
開發(fā)界面化用戶客戶端 Client;
引入 Harbor 開源鏡像倉(cāng)庫(kù)進(jìn)行鏡像存儲(chǔ),Minio 對(duì)象存儲(chǔ)服務(wù)進(jìn)行文件存儲(chǔ);
使用 MySQL、Redis 作為 CMDB,由 MySQL 負(fù)責(zé)管理集群狀態(tài)、用戶信息等,為面向集群的“一鍵式”任務(wù)創(chuàng)建提供支撐。通過 Redis 保存分發(fā)任務(wù)狀態(tài)信息,提供高并發(fā)、低延遲的狀態(tài)查詢服務(wù);
平臺(tái)核心服務(wù)層(Docktrans)和 API 服務(wù)網(wǎng)關(guān)層(Edgetrans)都是是無狀態(tài)、面向集群的、可動(dòng)態(tài)橫向擴(kuò)展的核心組:
API 網(wǎng)關(guān)封裝了系統(tǒng)內(nèi)部架構(gòu),主要負(fù)責(zé)接收并轉(zhuǎn)發(fā) Client 發(fā)起的任務(wù)請(qǐng)求以及實(shí)現(xiàn)用戶對(duì)各功能模塊的接入鑒權(quán),并對(duì)外可提供定制化的 API 調(diào)用服務(wù);
核心服務(wù)層是平臺(tái)各功能模塊業(yè)務(wù)邏輯處理的引擎。在分發(fā)過程中,核心服務(wù)層將通過統(tǒng)一的遠(yuǎn)程調(diào)用向 P2P 代理結(jié)點(diǎn)同時(shí)發(fā)起下載請(qǐng)求,完成客戶端——任務(wù)集群“一對(duì)多”的分發(fā)過程。
df-master 與 df-client 均為 Dragonfly 組件,df-master 即 Dragonfly 中的超級(jí)節(jié)點(diǎn) SuperNode,df-client 即 P2P 網(wǎng)絡(luò)中的對(duì)等節(jié)點(diǎn)代理 dfget proxy。
df-client 實(shí)現(xiàn)容器鏡像化。通過輕量級(jí)的容器部署,加快了組網(wǎng)效率。新接入網(wǎng)絡(luò)層的集群 host 結(jié)點(diǎn)可通過鏡像下載、啟動(dòng)的方式,秒級(jí)完成 P2P Agent 結(jié)點(diǎn)啟動(dòng);
核心接口層(Docktrans)屏蔽了dfget 底層命令行細(xì)節(jié),提供了界面化的功能,簡(jiǎn)化了用戶操作。通過統(tǒng)一遠(yuǎn)程調(diào)用方式下發(fā)至多個(gè) P2P 任務(wù)結(jié)點(diǎn),解決了用戶需要逐臺(tái)進(jìn)行 dfget 等下載操作的問題,簡(jiǎn)化了“一對(duì)多”的任務(wù)發(fā)起模式。
核心功能模塊|分發(fā)控制接口交互流程
如下圖所示,統(tǒng)一分發(fā)平臺(tái)的核心模塊在進(jìn)行任務(wù)分發(fā)時(shí)的工作流程具體如下:
用戶通過 Client 建立鏡像或文件分發(fā)任務(wù);
分發(fā)模塊首先通過平臺(tái) API 服務(wù)網(wǎng)關(guān)(Edgetrans)的鑒權(quán)功能判斷用戶是否具有分發(fā)功能的權(quán)限;
用戶通過鑒權(quán)后,設(shè)置分發(fā)任務(wù)參數(shù),提供集群ID,平臺(tái)從 MySQL 數(shù)據(jù)庫(kù)讀取集群配置信息實(shí)現(xiàn)集群結(jié)點(diǎn)的自主發(fā)現(xiàn)。用戶也可以指定多個(gè)結(jié)點(diǎn) IP 作為自定義集群參數(shù);
根據(jù)分發(fā)類型,核心服務(wù)層(Docktrans)分發(fā)功能模塊將不同的前端分發(fā)請(qǐng)求轉(zhuǎn)換為 dfget(文件)或者 Docker pull(鏡像)命令,通過統(tǒng)一遠(yuǎn)程調(diào)用 Docker Service 服務(wù)將命令下發(fā)至多個(gè)結(jié)點(diǎn) df-client 進(jìn)行相應(yīng)的處理;
在任務(wù)進(jìn)行過程中,任務(wù)進(jìn)度與任務(wù)事件日志分別寫入 Redis 與 MySQL 數(shù)據(jù)庫(kù)提供用戶對(duì)任務(wù)狀態(tài)的查詢能力。
生產(chǎn)環(huán)境改造成果
截至目前,生產(chǎn)共運(yùn)行 200 余個(gè)業(yè)務(wù)系統(tǒng) 1700 多個(gè)應(yīng)用模塊,已全部?jī)?yōu)化為鏡像發(fā)布模式。發(fā)布耗時(shí)和發(fā)布成功率得到明顯改善:
采用 P2P 鏡像發(fā)布后,業(yè)務(wù)多應(yīng)用一次上線的月均發(fā)布成功率穩(wěn)定在 98%。
社區(qū)共建|界面功能展示
直接引入 Dragonfly 后誕生的社區(qū)訴求
缺少圖形化界面,用戶使用成本高,操作效率低;
缺少用戶權(quán)限管理和分發(fā)審計(jì)功能,無分發(fā)管控能力;
不支持用戶“一對(duì)多”的集群操作模式。云環(huán)境下,用戶通常需要向自己所管理的集群同時(shí)進(jìn)行分發(fā),但現(xiàn)有模式僅支持用戶在單結(jié)點(diǎn)進(jìn)行分發(fā)操作;
傳統(tǒng) Agent 應(yīng)用軟件包部署方式效率低,不利于大規(guī)模集群的快速伸縮擴(kuò)展。作為系統(tǒng)軟件,增加了對(duì)宿主系統(tǒng)的入侵性。
目前,客戶端界面化開發(fā)工作基本完成,已進(jìn)入生產(chǎn)測(cè)試和部署中。分發(fā)平臺(tái)總體規(guī)劃 4 大核心功能:任務(wù)管理,目標(biāo)管理,權(quán)限管理和系統(tǒng)分析,現(xiàn)已開放前三項(xiàng)功能。
權(quán)限管理界面
權(quán)限管理,即用戶管理,為不同用戶提供個(gè)性化的權(quán)限管理功能,具體如下:
支持不同角色(超級(jí)管理員、任務(wù)集群管理員、任務(wù)管理員)用戶創(chuàng)建、刪除、修改;
支持不同權(quán)限集合的定制化組合(角色創(chuàng)建),用戶權(quán)限賦權(quán);
支持外部系統(tǒng)用戶接入與權(quán)限授權(quán)(暫未開放)。
支持不同用戶集群的創(chuàng)建和刪除;
支持在用戶所管理集群下,容器自動(dòng)化 Agent 部署快速新增、刪除 P2P 網(wǎng)絡(luò)結(jié)點(diǎn),并對(duì)結(jié)點(diǎn)狀態(tài)進(jìn)行監(jiān)控;
支持不同類型,如 host(虛擬機(jī)、物理機(jī))集群、K8s 集群、Mesos 集群的接入,同時(shí),支持直接讀取 K8s、Mesos 集群結(jié)點(diǎn)信息,批量接入 P2P 網(wǎng)絡(luò)層。
任務(wù)管理
任務(wù)管理提供文件或鏡像分發(fā)任務(wù)的創(chuàng)建、刪除、停止、信息查看等功能,具體如下:
支持鏡像預(yù)熱模式(可設(shè)置計(jì)劃分發(fā)任務(wù),提前發(fā)布鏡像或文件分發(fā)至各結(jié)點(diǎn));
支持容器鏡像等多格式文件的分發(fā);
支持指定任務(wù)集群多結(jié)點(diǎn)“一鍵式”任務(wù)創(chuàng)建、執(zhí)行、刪除、終止和已執(zhí)行任務(wù)的“一鍵復(fù)制”;
支持對(duì)發(fā)布文件版本的創(chuàng)建和刪除管理;
支持對(duì)分發(fā)任務(wù)狀態(tài)與任務(wù)日志的查看。
系統(tǒng)分析(計(jì)劃開放)
預(yù)計(jì)后續(xù)將開放系統(tǒng)分析功能,為平臺(tái)管理員、用戶提供任務(wù)分發(fā)耗時(shí)、成功率等數(shù)據(jù)和任務(wù)執(zhí)行效率統(tǒng)計(jì)圖表,通過數(shù)據(jù)統(tǒng)計(jì)與預(yù)測(cè),有效支撐平臺(tái)向智能化方向演進(jìn)。
社區(qū)共建|生產(chǎn)高可用部署
P2P 發(fā)布由 df-master 和 df-client 構(gòu)成(藍(lán)色部分),df-master 從鏡像庫(kù)拉取鏡像形成 P2P 種子,每個(gè)機(jī)房配置兩個(gè) df-master 形成高可用;
P2P 分發(fā)只在本機(jī)房分發(fā),避免跨機(jī)房流量;
每個(gè)機(jī)房配置兩個(gè) mirror(備用鏡像庫(kù)),當(dāng) P2P 分發(fā)方式異常無法工作時(shí)計(jì)算結(jié)點(diǎn)會(huì)自動(dòng)到 mirror 上下載鏡像, mirror 通過負(fù)載均衡實(shí)現(xiàn)高可用。
目前,我們計(jì)劃把界面功能展示貢獻(xiàn)給 CNCF Dragonfly 社區(qū),進(jìn)一步豐富 CNCF Dragonfly 社區(qū)周邊生態(tài)。未來,我們希望更多人參與進(jìn)來,一起為社區(qū)繁榮貢獻(xiàn)力量。
本文作者:
陳遠(yuǎn)崢 浙江移動(dòng)云計(jì)算架構(gòu)師
王淼鑫 浙江移動(dòng)云計(jì)算架構(gòu)師
Dragonfly 社區(qū)分享
Dragonfly 社區(qū)貢獻(xiàn)者太云在 Dragonfly Meetup 分享到:
“目前,Dragonfly 已經(jīng)成為 CNCF Sandbox 項(xiàng)目,Star 數(shù) 2700+,有很多企業(yè)用戶正在使用 Dragonfly 來解決他們?cè)阽R像或者文件分發(fā)方面遇到的各種問題。未來,我們將不斷完善和改進(jìn) Dragonfly,為云原生應(yīng)用提供更加豐富強(qiáng)大且簡(jiǎn)便的分發(fā)工具。期待與大家共同努力,讓 Dragonfly 早日成為 CNCF 畢業(yè)項(xiàng)目?!?/strong>
項(xiàng)目地址
https://github.com/dragonflyoss/Dragonfly
Dragonfly Roadmap