2018 年 11 月, 源於阿里巴巴的雲原生映象分發系統—— Dragonfly 在 KubeCon 上海現場亮相,成為 CNCF 沙箱級別專案(Sandbox Level Project)。
Dragonfly 主要解決以 Kubernetes 為核心的分散式應用編排系統的映象分發難題。2017 年開源即成為阿里巴巴最為核心的基礎設施技術之一。開源一年以來,Dragonfly 已在諸多行業落地。
DCOS 是浙江移動容器雲平臺,目前在平臺式執行的應用系統已有 185 套,包括手機營業廳、CRM 應用等核心系統。本文將主要介紹浙江移動容器雲(DCOS)平臺以 Dragonfly 為改革“利器”,成功解決了運營商大規模叢集場景下分發效率低、成功率低以及網路頻寬控制難等問題;並反哺社群,在 Dragonfly 介面功能、生產高可用部署層面對 Dragonfly 進行了升級。
DCOS 容器雲在生產環境中
遇到的挑戰
隨著浙江移動容器雲(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 加入 CNCF
專案地址
Dragonfly Roadmap