2018 年 11 月, 源於阿里巴巴的雲原生鏡像分發系統—— Dragonfly 在 KubeCon 上海現場亮相,成爲 CNCF 沙箱級別項目(Sandbox Level Project)。前端
Dragonfly 主要解決以 Kubernetes 爲核心的分佈式應用編排系統的鏡像分發難題。2017 年開源即成爲阿里巴巴最爲核心的基礎設施技術之一。開源一年以來,Dragonfly 已在諸多行業落地。git
DCOS 是浙江移動容器雲平臺,目前在平臺式運行的應用系統已有 185 套,包括手機營業廳、CRM 應用等核心系統。本文將主要介紹浙江移動容器雲(DCOS)平臺以 Dragonfly 爲改革「利器」,成功解決了運營商大規模集羣場景下分發效率低、成功率低以及網絡帶寬控制難等問題;並反哺社區,在 Dragonfly 界面功能、生產高可用部署層面對 Dragonfly 進行了升級。github
DCOS 容器雲在生產環境中算法
遇到的挑戰docker
隨着浙江移動容器雲(DCOS)平臺的持續完善,承載應用不斷增長,在運行容器數量接近 10000 個。採用傳統 C/S(Client-Server)結構的分發服務體系已經愈來愈沒法適應大規模分佈式應用在代碼包發佈、文件傳輸時的場景:數據庫
- 計算結點因網絡異常等緣由,致使代碼包下載失敗,對應用代碼包的完整性和一致性構成影響。
- 在多用戶高併發狀況下,可能會出現 TB 級的文件傳輸,單點性能瓶頸增長了應用發佈時長。
Dragonfly 簡介服務器
P2P(Peer-To-Peer)是一種點對點網絡技術,經過各結點互聯,將網絡中的資源和服務分散在各個結點上。信息的傳輸和服務實現直接在結點之間進行,避免了傳統 C/S 結構可能的單點瓶頸。網絡
CNCF 開源文件分發服務解決方案 Dragonfly,是一種基於 P2P 與 CDN 技術,構建了適用於容器鏡像和文件的分發系統,有效解決了企業大規模集羣場景下文件和鏡像分發效率、成功率低以及網絡帶寬控制的問題。架構
Dragonfly 的核心組件:併發
- SuperNode:超級結點,以被動 CDN 方式從文件源下載文件並生產種子數據塊,在 P2P 網絡中,充當網絡控制器,調度結點之間的分塊數據傳輸;
- dfget proxy:部署在計算結點的代理,負責 P2P 結點的數據塊下載和結點間的數據共享。
Dragonfly 分發工做原理(以鏡像分發爲例): 容器鏡像不一樣於普通文件,由多層存儲構成,下載也是分層下載,非單一文件。每層的鏡像文件都會被分割爲 block 數據塊並做爲種子。下載結束後,經過每層鏡像惟一的 ID 和 sha256 算法,從新組合成完整的鏡像。確保下載過程的一致性。
Dragonfly 鏡像下載模式的過程以下圖所示:
- dfget-proxy 攔截客戶端 docker 發起的鏡像下載請求(docker pull)並轉換爲向 SuperNode 的dfget 下載請求;
- SuperNode 從鏡像源倉庫下載鏡像並將鏡像分割成多個 block 種子數據塊;
- dfget 下載數據塊並對外共享已下載的數據塊,SuperNode 記錄數據塊下載狀況,並指引後續下載請求在結點之間以 P2P 方式進行數據塊下載;
- Dokcer daemon 的鏡像 pull 機制將最終將鏡像文件組成完整的鏡像。
根據 Dragonfly 的上述特性,浙江移動容器雲平臺結合生產實際決定引入 Dragonfly 技術對現行代碼包發佈模式進行改造,經過 P2P 網絡分攤發佈時產生的單一文件服務器傳輸帶寬瓶頸,並利用 Docker 自己的鏡像 pull 機制來保證整個發佈過程鏡像文件的一致性。
解決方案:統一分發平臺
架構設計與實現
功能架構設計
在 Dragonfly 技術的基礎上,結合浙江移動容器雲生產實踐,統一分發平臺的整體設計目標以下:
- 利用 Dragonfly 技術和文件下載校驗功能,解決目前生產發佈過程當中應用代碼包發佈不一致、發佈時間過長的問題;
- 支持客戶端界面化,屏蔽後臺命令行細節,簡化操做流程,效率更高;
- 支持 Mesos、K8s、Host、VM 等多種雲環境下的分發,並實現集羣的自主發現,支持用戶經過統一分發平臺對目標集羣進行統一化管理;
- 增長用戶權限控制和任務帶寬限制,支持多租戶多任務的分發;
- 優化 P2P Agent 部署方式,支持更快速的計算結點 P2P 組網。
基於上述目標,統一分發平臺的整體架構設計以下:
- P2P 網絡層是支持不一樣異構集羣接入(主機集羣、K8s 集羣、Mesos 集羣)的由多個計算結點構成的分發網絡;
- 分發服務層由功能模塊和存儲模塊構成,是整個通用分發系統的核心架構。其中,用戶接入鑑權模塊提供系統登陸審覈功能;分發控制模塊基於 Dragonfly,實現 P2P 方式的任務分發;流量控制模塊提供租戶對不一樣任務的帶寬設置功能;配置信息數據庫負責記錄網絡層目標集羣、任務狀態等基本信息;用戶經過狀態查詢模塊可實現對分發任務執行進度的透明掌控;
- 用戶操做層由任意數量的界面化用戶客戶端構成。
技術架構實現
根據上述平臺設計目標與整體架構分析,容器雲團隊在開源組件的基礎上進行了平臺功能的二次開發,具體包括:
- 開發界面化用戶客戶端 Client;
- 引入 Harbor 開源鏡像倉庫進行鏡像存儲,Minio 對象存儲服務進行文件存儲;
- 使用 MySQL、Redis 做爲 CMDB,由 MySQL 負責管理集羣狀態、用戶信息等,爲面向集羣的「一鍵式」任務建立提供支撐。經過 Redis 保存分發任務狀態信息,提供高併發、低延遲的狀態查詢服務;
- 平臺核心服務層(Docktrans)和 API 服務網關層(Edgetrans)都是是無狀態、面向集羣的、可動態橫向擴展的核心組:
- API 網關封裝了系統內部架構,主要負責接收並轉發 Client 發起的任務請求以及實現用戶對各功能模塊的接入鑑權,並對外可提供定製化的 API 調用服務;
- 核心服務層是平臺各功能模塊業務邏輯處理的引擎。在分發過程當中,核心服務層將經過統一的遠程調用向 P2P 代理結點同時發起下載請求,完成客戶端——任務集羣「一對多」的分發過程。
- df-master 與 df-client 均爲 Dragonfly 組件,df-master 即 Dragonfly 中的超級節點SuperNode,df-client 即 P2P 網絡中的對等節點代理 dfget proxy。
技術特點
- df-client 實現容器鏡像化。經過輕量級的容器部署,加快了組網效率。新接入網絡層的集羣 host 結點可經過鏡像下載、啓動的方式,秒級完成 P2P Agent 結點啓動;
- 核心接口層(Docktrans)屏蔽了dfget 底層命令行細節,提供了界面化的功能,簡化了用戶操做。經過統一遠程調用方式下發至多個 P2P 任務結點,解決了用戶須要逐臺進行 dfget 等下載操做的問題,簡化了「一對多」的任務發起模式。
核心功能模塊|分發控制接口交互流程
以下圖所示,統一分發平臺的核心模塊在進行任務分發時的工做流程具體以下:
- 用戶經過 Client 創建鏡像或文件分發任務;
- 分發模塊首先經過平臺 API 服務網關(Edgetrans)的鑑權功能判斷用戶是否具備分發功能的權限;
- 用戶經過鑑權後,設置分發任務參數,提供集羣ID,平臺從 MySQL 數據庫讀取集羣配置信息實現集羣結點的自主發現。用戶也能夠指定多個結點 IP 做爲自定義集羣參數;
- 根據分發類型,核心服務層(Docktrans)分發功能模塊將不一樣的前端分發請求轉換爲 dfget(文件)或者 Docker pull(鏡像)命令,經過統一遠程調用 Docker Service 服務將命令下發至多個結點 df-client 進行相應的處理;
- 在任務進行過程當中,任務進度與任務事件日誌分別寫入 Redis 與 MySQL 數據庫提供用戶對任務狀態的查詢能力。
生產環境改形成果
截至目前,生產共運行 200 餘個業務系統 1700 多個應用模塊,已所有優化爲鏡像發佈模式。發佈耗時和發佈成功率獲得明顯改善:
採用 P2P 鏡像發佈後,業務多應用一次上線的月均發佈成功率穩定在 98%。
4 月後容器雲平臺開始用 P2P 鏡像發佈方式代替傳統分發系統的代碼包發佈方式,多應用一次集中上線發佈耗時相較與改造以前大幅下降,平均降低 67%。
同時,容器雲平臺選取了多個應用集羣進行單應用的 P2P 鏡像發佈改造效果測試。能夠看出,單個應用發佈耗時相較於改造前大幅下降,平均降低 81.5%。
後續推廣
統一文件分發平臺已有效解決了浙江移動容器雲應用在代碼發佈過程當中的效率和一致性問題,成爲平臺的重要組成部分之一。同時,也支持更多大規模集羣中進行高效文件分發的場景。可陸續推廣至:集羣批量安裝介質分發以及集羣批量配置文件更新。
社區共建|界面功能展現
直接引入 Dragonfly 後誕生的社區訴求
- 缺乏圖形化界面,用戶使用成本高,操做效率低;
- 缺乏用戶權限管理和分發審計功能,無分發管控能力;
- 不支持用戶「一對多」的集羣操做模式。雲環境下,用戶一般須要向本身所管理的集羣同時進行分發,但現有模式僅支持用戶在單結點進行分發操做;
- 傳統 Agent 應用軟件包部署方式效率低,不利於大規模集羣的快速伸縮擴展。做爲系統軟件,增長了對宿主系統的入侵性。
目前,客戶端界面化開發工做基本完成,已進入生產測試和部署中。分發平臺整體規劃 4 大核心功能:任務管理,目標管理,權限管理和系統分析,現已開放前三項功能。
權限管理界面
權限管理,即用戶管理,爲不一樣用戶提供個性化的權限管理功能,具體以下:
- 支持不一樣角色(超級管理員、任務集羣管理員、任務管理員)用戶建立、刪除、修改;
- 支持不一樣權限集合的定製化組合(角色建立),用戶權限賦權;
- 支持外部系統用戶接入與權限受權(暫未開放)。
目標管理界面
目標管理,即用戶進行任務分發的目標集羣結點管理,爲用戶提供管理集羣的 P2P 組網和集羣結點狀態信息健康功能,具體以下:
- 支持不一樣用戶集羣的建立和刪除;
- 支持在用戶所管理集羣下,容器自動化 Agent 部署快速新增、刪除 P2P 網絡結點,並對結點狀態進行監控;
- 支持不一樣類型,如 host(虛擬機、物理機)集羣、K8s 集羣、Mesos 集羣的接入,同時,支持直接讀取 K8s、Mesos 集羣結點信息,批量接入 P2P 網絡層。
任務管理
任務管理提供文件或鏡像分發任務的建立、刪除、中止、信息查看等功能,具體以下:
- 支持鏡像預熱模式(可設置計劃分發任務,提早發佈鏡像或文件分發至各結點);
- 支持容器鏡像等多格式文件的分發;
- 支持指定任務集羣多結點「一鍵式」任務建立、執行、刪除、終止和已執行任務的「一鍵複製」;
- 支持對發佈文件版本的建立和刪除管理;
- 支持對分發任務狀態與任務日誌的查看。
系統分析(計劃開放)
預計後續將開放系統分析功能,爲平臺管理員、用戶提供任務分發耗時、成功率等數據和任務執行效率統計圖表,經過數據統計與預測,有效支撐平臺向智能化方向演進。
社區共建|生產高可用部署
鏡像庫主備容災部署,主備之間經過鏡像同步保持數據一致性。
- P2P 發佈由 df-master 和 df-client 構成(藍色部分),df-master 從鏡像庫拉取鏡像造成 P2P 種子,每一個機房配置兩個 df-master 造成高可用;
- P2P 分發只在本機房分發,避免跨機房流量;
- 每一個機房配置兩個 mirror(備用鏡像庫),當 P2P 分發方式異常沒法工做時計算結點會自動到 mirror 上下載鏡像, mirror 經過負載均衡實現高可用。
目前,咱們計劃把界面功能展現貢獻給 CNCF Dragonfly 社區,進一步豐富 CNCF Dragonfly 社區周邊生態。將來,咱們但願更多人蔘與進來,一塊兒爲社區繁榮貢獻力量。
本文做者:
陳遠崢 浙江移動雲計算架構師
王淼鑫 浙江移動雲計算架構師
Dragonfly 社區分享
Dragonfly 社區貢獻者太雲在 Dragonfly Meetup 分享到:
「目前,Dragonfly 已經成爲 CNCF Sandbox 項目,Star 數 2700+,有不少企業用戶正在使用 Dragonfly 來解決他們在鏡像或者文件分發方面遇到的各類問題。將來,咱們將不斷完善和改進 Dragonfly,爲雲原生應用提供更加豐富強大且簡便的分發工具。期待與你們共同努力,讓 Dragonfly 早日成爲 CNCF 畢業項目。」
推薦閱讀
深度解讀阿里巴巴雲原生鏡像分發系統 Dragonfly
重磅!阿里巴巴雲原生鏡像分發系統 Dragonfly 加入 CNCF
項目地址
github.com/dragonflyos…
Dragonfly Roadmap