PART. 0
背景
火山引擎映象倉庫 CR 使用 TOS 來儲存容器映象。目前在一定程度上能滿足併發大規模的映象拉取。然而最終拉取的併發量受限於 TOS 的頻寬和 QPS。
這裡簡單介紹一下目前針對於大規模拉映象遇到的兩個場景的問題:
1、客戶端數量越來越多,映象越來越大,TOS 頻寬最終無法滿足需求。
2、如果客戶端使用了 Nydus 對映象格式做轉換之後,對 TOS 的請求量會有數量級的增加,TOS API 的 QPS 限制導致無法滿足需求。
不論是映象倉庫服務本身還是背後的儲存,最終肯定是有頻寬和 QPS 限制的。如果單純依賴服務端提供的頻寬和 QPS,很容易就無法滿足需求。因此需要引入 P2P ,減輕服務端壓力,進而滿足大規模併發拉取映象的需求。
PART. 1
基於 P2P 技術映象分發系統調研
目前開源社群有幾個 P2P 專案,這裡對這些專案進行簡單介紹。
Dragonfly
架構圖
術語
Manager
1、儲存動態配置供 Seed Peer 叢集、Scheduler 叢集以及 Dfdaemon 消費。
2、維護 Seed Peer 叢集和 Scheduler 叢集之間關聯關係。
3、提供統一非同步任務管理,用作預熱等功能。
4、監聽各模組是否健康執行。
5、為 Dfdaemon 篩選最優 Scheduler 叢集排程使用。
6、提供視覺化控制檯,方便使用者操作管理 P2P 叢集。
Scheduler
1、基於機器學習的多場景自適應智慧 P2P 節點排程, 為當前下載節點選擇最優父節點。
2、構建 P2P 下載網路的有向無環圖。
3、根據不同特徵值評估節點下載能力, 剔除異常節點。
4、當下載失敗情況,主動通知 Dfdaemon 進行回源下載。
Dfdaemon
1、基於 gRPC 提供下載功能, 並提供多源適配能力。
2、開啟 Seed Peer 模式可以作為 P2P 叢集中回源下載節點, 也就是整個叢集中下載的根節點。
3、為映象倉庫或者其他 HTTP 下載任務提供代理服務。
4、下載任務基於 HTTP 或 HTTPS 或其他自定義協議。
Kraken
架構圖
術語
Agent
1、是 P2P 網路中的對等節點,需要在每個節點上部署。
2、實現了 Docker Registry interface。
3、通知 tracker 自己擁有的資料。
4、下載其他 agent 的資料(tracker 會告訴該 agent 需要下載這塊資料需要到哪個 agent 上下載)
Origin
1、負責從儲存中讀取資料做種。
2、支援不同的儲存。
3、透過 Hash 環的形式保證高可用。
Tracker
1、P2P 網路中的協調者,追蹤誰是 Peer,誰是 Seeder。
2、追蹤 Peer 擁有的資料。
3、提供有序的 Peer 節點供 Peer 下載資料。
4、透過 Hash 環的形式保證高可用。
Proxy
1、實現了 Docker Registry Interface。
2、將映象層傳給 Origin 元件。
3、將 Tag 傳給 BUILD INDEX 元件。
Build-Index
1、Tag 和 digest 對映,agent 下載對應 Tag 資料時向 Build-Index 獲取對應的 Digest 值。
2、叢集之間映象複製。
3、儲存 Tag 資料在儲存中。
4、透過 Hash 環的形式保證高可用。
Dragonfly vs Kraken
PART. 2
方案
在火山引擎上,主要考慮 VKE 和 VCI 透過 CR 拉取映象。
1、VKE 的產品特點是基於 ECS 部署的 K8S,因此十分適合每個節點部署 Dfdaemon,充分利用每個節點的頻寬,進而充分利用 P2P 的能力。
2、VCI 的產品特點是底層有一些資源很充足虛擬節點。上層的服務是以 POD 為載體,因此無法像 VKE 那樣每個節點部署 Dfdaemon,所以部署的形式部署幾個 Dfdaemon 作為快取,利用快取的能力。
3、VKE 或 VCI 客戶端拉取經過 Nydus 格式轉化過的映象。在該場景下,需要使用 Dfdaemon 作為快取,不宜使用過多的節點,避免對 Scheduler 造成過大的排程壓力。
基於火山引擎對於以上產品的需求,以及結合 Dragonfly 的特點,需要設計一套相容諸多因素的部署方案。部署 Dagonfly 的方案設計如下。
PART. 3
整體架構圖
1、火山引擎上的資源都是歸屬於主賬號下。P2P 控制元件以主賬號級別隔離,每個主賬號下一套 P2P 控制元件。服務端實現 P2P Manager Controller,透過該 Controller 來管控控制面所有 P2P 控制元件。
2、P2P 控制元件部署在映象倉庫資料面 VPC,透過 LB 與使用者叢集打通。
3、在 VKE 叢集上,Dfdaemon 以 DaemonSet 方式部署,每個節點上部署一個 Dfdaemon。
4、在 VCI 上,Dfdaemon 以 Deployment 方式部署。
5、ECS 上 Containerd 透過 127.0.0.1:65001 訪問本節點上的 Dfdaemon。
6、透過在使用者叢集部署一個 controller 元件,基於 PrivateZone 功能,在使用者叢集生成.p2p.volces.com 域名, controller 會根據一定的規則挑選特定節點(包括 VKE、VCI)的 Dfdaemon pod,以 A 記錄的形式解析到上述域名。
- ECS 上 Nydusd 透過.p2p.volces.com 域名訪問 Dfdaemon。
- VCI 上映象服務客戶端和 Nydusd 透過.p2p.volces.com 域名訪問 Dfdaemon。
PART. 4
壓測資料
環境
映象倉庫:頻寬 10Gbit/s。
ECS: 4C8G,掛載本地盤,頻寬 6Gbit/s。
映象
Nginx (500M)
TensorFlow (3G)
元件版本
Dragonfly v2.0.8。
Quota
Dfdaemon: Limit 2C6G。
Scheduler: 2 Replicas,Request 1C2G,Limit 4C8G。
Manager: 2 Replicas,Request 1C2G,Limit 4C8G。
POD 啟動時間對比
Nginx Pod 分別併發 50、100、200、500 的所有 Pod 從建立到啟動消耗時間。
TensorFlow Pod 分別併發 50、100、200、500 的所有 Pod 從建立到啟動消耗時間。
在大規模拉映象的場景下,在使用 Dragonfly 和 Dragonfly & Nydus 場景對比 OCIv1 場景能夠節省 90% 以上的容器啟動時間。使用 Nydus 之後啟動時間更短是因為映象 lazyload 的特性,只需要拉取很小的一部分後設資料 Pod 就能啟動。
儲存源端頻寬峰值對比
Nginx Pod 分別併發 50、100、200、500 的儲存端峰值流量。
TensorFlow Pod 分別併發 50、100、200、500 的儲存端峰值流量。
回源流量對比
Nginx Pod 分別併發 50、100、200、500 的回源流量。
TensorFlow Pod 分別併發 50、100、200、500 的回源流量。
在大規模場景下,使用 Dragonfly 回源拉取映象的數量很少。OCIv1 的場景所有的映象拉取都要回源,因此使用 Dragonfly 回源峰值和回源流量相比 OCIv1 的場景少很多。並且使用 Dragonfly 後隨著併發數提高,回源峰值和流量不會顯著提高。
PART. 5
總結
基於專案整體成熟度,社群活躍度、使用者數量、架構複雜度,是否針對 Nydus 最佳化。未來發展趨勢等因素綜合考慮,Dragonfly 是 P2P 專案中最優的選型。
PART. 6
術語及定義
OCI
Open Container Initiative,開放容器計劃是一個 Linux 基金會專案,由Docker在2015年6月啟動,旨在為作業系統級虛擬化(最重要的是 Linux 容器)設計開放標準。
OCI Artifact
遵循 OCI image spec 的製品。
映象
本文中的映象指 OCI Artifact,因此也包括 Helm Chart 等其他 OCI Artifact。
映象倉庫
遵循 OCI distribution spec 實現的製品倉庫。
ECS
是一種由CPU、記憶體、雲盤組成的資源集合,每一種資源都會邏輯對應到資料中心的計算硬體實體。
CR
火山引擎映象倉庫服務。
VKE
火山引擎透過深度融合新一代雲原生技術,提供以容器為核心的高效能 Kubernetes 容器叢集管理服務,助力使用者快速構建容器化應用。
VCI
火山一種 Serverless 和容器化的計算服務。當前 VCI 可無縫整合容器服務 VKE,提供 Kubernetes 編排能力。
使用 VCI,可以專注於構建應用本身,而無需購買和管理底層雲伺服器等基礎設施,並僅為容器實際執行消耗的資源付費。VCI 還支援秒級啟動、高併發建立、沙箱容器安全隔離等能力。
TOS
火山引擎提供的海量、安全、低成本、易用、高可靠、高可用的分散式雲端儲存服務。
Private Zone
基於專有網路VPC(Virtual Private Cloud)環境的私有DNS服務。該服務允許在自定義的一個或多個VPC中將私有域名對映到IP地址。
P2P
點對點技術,當 P2P 網路中某一個 peer 從 server 下載資料的時候,下載完資料後也能當作服務端供其他 peer 下載。當大量節點同時下載的時候,能保證後續下載的資料,可以不用從 server 端下載。從而減輕 server 端的壓力。
Dragonfly
Dragonfly 是⼀款基於 P2P 技術的檔案分發和映象加速系統,並且是雲原生架構中映象加速領域的標準解決方案以及最佳實踐。現在為雲原生計算機基金會(CNCF)託管作為孵化級專案。
Nydus
Nydus 簡介: Nydus 映象加速框架是 Dragonfly 的子專案,它提供了容器映象按需載入的能力,在生產環境支撐了每日百萬級別的加速映象容器建立,在啟動效能,映象空間最佳化,端到端資料一致性,核心態支援等方面相比 OCIv1 有巨大優勢。
*|社群相關網址|*
Dragonfly 社群官網網站:
Volcano Engine: https://www.volcengine.com/
Volcano Engine VKE: https://www.volcengine.com/product/vke
Volcano Engine CR: https://www.volcengine.com/product/cr
Dragonfly 官網: https://d7y.io/
Dragonfly Github Repo: https://github.com/dragonflyoss/Dragonfly2
Nydus 官網: https://nydus.dev/
Nydus Gihtub Repo: https://github.com/dragonflyoss/image-service
Dragonfly Star 一下✨:
https://github.com/dragonflyoss/Dragonfly2