Skip to content

Commit e0e9a10

Browse files
Create index1.md (#1176)
Co-authored-by: Marco <[email protected]>
1 parent 3ee0e80 commit e0e9a10

File tree

1 file changed

+286
-0
lines changed
  • content/zh/blog/volcano-engine-based-on-dragonfly-acceleration-practices

1 file changed

+286
-0
lines changed
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
---
2+
title: "火山引擎基于 Dragonfly 加速实践"
3+
authorlink: "https://github.com/sofastack"
4+
description: "火山引擎基于 Dragonfly 加速实践"
5+
categories: "SOFAStack"
6+
tags: ["SOFAStack"]
7+
date: 2023-03-21T15:00:00+08:00
8+
cover: "https://mdn.alipayobjects.com/huamei_soxoym/afts/img/A*jR46Q5l39RkAAAAAAAAAAAAADrGAAQ/original"
9+
---
10+
11+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/83ec2adf347d431cb79a3287403e7f2d~tplv-k3u1fbpfcp-zoom-1.image)
12+
13+
## 背景
14+
15+
火山引擎镜像仓库 CR 使用 TOS 来存储容器镜像。目前在一定程度上能满足并发大规模的镜像拉取。然而最终拉取的并发量受限于 TOS 的带宽和 QPS。
16+
17+
这里简单介绍一下目前针对于大规模拉镜像遇到的两个场景的问题:
18+
19+
**1、**客户端数量越来越多,镜像越来越大,TOS 带宽最终无法满足需求。
20+
**2、**如果客户端使用了 Nydus 对镜像格式做转换之后,对 TOS 的请求量会有数量级的增加,TOS API 的 QPS 限制导致无法满足需求。
21+
22+
不论是镜像仓库服务本身还是背后的存储,最终肯定是有带宽和 QPS 限制的。如果单纯依赖服务端提供的带宽和 QPS,很容易就无法满足需求。因此需要引入 P2P ,减轻服务端压力,进而满足大规模并发拉取镜像的需求。
23+
24+
## 基于 P2P 技术镜像分发系统调研
25+
26+
目前开源社区有几个 P2P 项目,这里对这些项目进行简单介绍。
27+
28+
### Dragonfly
29+
30+
#### 架构图
31+
32+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dd9ba97396c14a3990abdb77db4dc439~tplv-k3u1fbpfcp-zoom-1.image)
33+
34+
#### 术语
35+
36+
**Manager**
37+
38+
**1、**存储动态配置供 Seed Peer 集群、Scheduler 集群以及 Dfdaemon 消费。
39+
40+
**2、**维护 Seed Peer 集群和 Scheduler 集群之间关联关系。
41+
42+
**3、**提供统一异步任务管理,用作预热等功能。
43+
44+
**4、**监听各模块是否健康运行。
45+
46+
**5、**为 Dfdaemon 筛选最优 Scheduler 集群调度使用。
47+
48+
**6、**提供可视化控制台,方便用户操作管理 P2P 集群。
49+
50+
**Scheduler**
51+
52+
**1、**基于机器学习的多场景自适应智能 P2P 节点调度, 为当前下载节点选择最优父节点。
53+
54+
**2、**构建 P2P 下载网络的有向无环图。
55+
56+
**3、**根据不同特征值评估节点下载能力, 剔除异常节点。
57+
58+
**4、**当下载失败情况,主动通知 Dfdaemon 进行回源下载。
59+
60+
**Dfdaemon**
61+
62+
**1、**基于 gRPC 提供下载功能, 并提供多源适配能力。
63+
64+
**2、**开启 Seed Peer 模式可以作为 P2P 集群中回源下载节点, 也就是整个集群中下载的根节点。
65+
66+
**3、**为镜像仓库或者其他 HTTP 下载任务提供代理服务。
67+
68+
**4、**下载任务基于 HTTP 或 HTTPS 或其他自定义协议。
69+
70+
### Kraken
71+
72+
**架构图**
73+
74+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9aaf891dfc214782b86ecbe045325f64~tplv-k3u1fbpfcp-zoom-1.image)
75+
76+
**术语**
77+
78+
**Agent**
79+
80+
**1、**是 P2P 网络中的对等节点,需要在每个节点上部署。
81+
82+
**2、**实现了 Docker Registry interface。
83+
84+
**3、**通知 tracker 自己拥有的数据。
85+
86+
**4、**下载其他 agent 的数据(tracker 会告诉该 agent 需要下载这块数据需要到哪个 agent 上下载)
87+
88+
**Origin**
89+
90+
**1、**负责从存储中读取数据做种。
91+
92+
**2、**支持不同的存储。
93+
94+
**3、**通过 Hash 环的形式保证高可用。
95+
96+
**Tracker**
97+
98+
**1、**P2P 网络中的协调者,追踪谁是 Peer,谁是 Seeder。
99+
100+
**2、**追踪 Peer 拥有的数据。
101+
102+
**3、**提供有序的 Peer 节点供 Peer 下载数据。
103+
104+
**4、**通过 Hash 环的形式保证高可用。
105+
106+
**Proxy**
107+
108+
**1、**实现了 Docker Registry Interface。
109+
110+
**2、**将镜像层传给 Origin 组件。
111+
112+
**3、**将 Tag 传给 BUILD INDEX 组件。
113+
114+
**Build-Index**
115+
116+
**1、**Tag 和 digest 映射,agent 下载对应 Tag 数据时向 Build-Index 获取对应的 Digest 值。
117+
118+
**2、**集群之间镜像复制。
119+
120+
**3、**保存 Tag 数据在存储中。
121+
122+
**4、**通过 Hash 环的形式保证高可用。
123+
124+
## Dragonfly vs Kraken
125+
126+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/afe279109a804599bb3b6aaf746a0bc1~tplv-k3u1fbpfcp-zoom-1.image)
127+
128+
### 方案
129+
130+
在火山引擎上,主要考虑 VKE 和 VCI 通过 CR 拉取镜像。
131+
132+
**1、**VKE 的产品特点是基于 ECS 部署的 K8S,因此十分适合每个节点部署 Dfdaemon,充分利用每个节点的带宽,进而充分利用 P2P 的能力。
133+
134+
**2、**VCI 的产品特点是底层有一些资源很充足虚拟节点。上层的服务是以 POD 为载体,因此无法像 VKE 那样每个节点部署 Dfdaemon,所以部署的形式部署几个 Dfdaemon 作为缓存,利用缓存的能力。
135+
136+
**3、**VKE 或 VCI 客户端拉取经过 Nydus 格式转化过的镜像。在该场景下,需要使用 Dfdaemon 作为缓存,不宜使用过多的节点,避免对 Scheduler 造成过大的调度压力。
137+
138+
基于火山引擎对于以上产品的需求,以及结合 Dragonfly 的特点,需要设计一套兼容诸多因素的部署方案。部署 Dagonfly 的方案设计如下。
139+
140+
### 整体架构图
141+
142+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/417e3025c93341dc9f808db6612596f4~tplv-k3u1fbpfcp-zoom-1.image)
143+
144+
**1、**火山引擎上的资源都是归属于主账号下。P2P 控制组件以主账号级别隔离,每个主账号下一套 P2P 控制组件。服务端实现 P2P Manager Controller,通过该 Controller 来管控控制面所有 P2P 控制组件。
145+
146+
**2、**P2P 控制组件部署在镜像仓库数据面 VPC,通过 LB 与用户集群打通。
147+
148+
**3、**在 VKE 集群上,Dfdaemon 以 DaemonSet 方式部署,每个节点上部署一个 Dfdaemon。
149+
150+
**4、**在 VCI 上,Dfdaemon 以 Deployment 方式部署。
151+
152+
**5、**ECS 上 Containerd 通过 127.0.0.1:65001 访问本节点上的 Dfdaemon。
153+
154+
**6、**通过在用户集群部署一个 controller 组件,基于 PrivateZone 功能,在用户集群生成.p2p.volces.com 域名, controller 会根据一定的规则挑选特定节点*(包括 VKE、VCI)*的 Dfdaemon pod,以 A 记录的形式解析到上述域名。
155+
156+
- ECS 上 Nydusd 通过.p2p.volces.com 域名访问 Dfdaemon。
157+
- VCI 上镜像服务客户端和 Nydusd 通过.p2p.volces.com 域名访问 Dfdaemon。
158+
159+
### 压测数据
160+
161+
**环境**
162+
163+
镜像仓库:带宽 10Gbit/s。
164+
165+
ECS: 4C8G,挂载本地盘,带宽 6Gbit/s。
166+
167+
**镜像**
168+
169+
Nginx (500M)
170+
171+
TensorFlow (3G)
172+
173+
**组件版本**
174+
175+
Dragonfly v2.0.8。
176+
177+
**Quota**
178+
179+
Dfdaemon: Limit 2C6G。
180+
181+
Scheduler: 2 Replicas,Request 1C2G,Limit 4C8G。
182+
183+
Manager: 2 Replicas,Request 1C2G,Limit 4C8G。
184+
185+
**POD 启动时间对比**
186+
187+
Nginx Pod 分别并发 50、100、200、500 的所有 Pod 从创建到启动消耗时间。
188+
189+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cb71bd971b28476ca50366cab4b5e5c6~tplv-k3u1fbpfcp-zoom-1.image)
190+
191+
TensorFlow Pod 分别并发 50、100、200、500 的所有 Pod 从创建到启动消耗时间。
192+
193+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba849446ff8e469dab9b070c05dbc280~tplv-k3u1fbpfcp-zoom-1.image)
194+
195+
在大规模拉镜像的场景下,在使用 Dragonfly 和 Dragonfly & Nydus 场景对比 OCIv1 场景能够节省 90% 以上的容器启动时间。使用 Nydus 之后启动时间更短是因为镜像 lazyload 的特性,只需要拉取很小的一部分元数据 Pod 就能启动。
196+
197+
**存储源端带宽峰值对比**
198+
199+
Nginx Pod 分别并发 50、100、200、500 的存储端峰值流量。
200+
201+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fe8f47cbb09147138f12c35bb7530c36~tplv-k3u1fbpfcp-zoom-1.image)
202+
203+
TensorFlow Pod 分别并发 50、100、200、500 的存储端峰值流量。
204+
205+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5ce71ab1550a4782a5a3a09eaf4cba3c~tplv-k3u1fbpfcp-zoom-1.image)
206+
207+
**回源流量对比**
208+
209+
Nginx Pod 分别并发 50、100、200、500 的回源流量。
210+
211+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b43d2d6141941d3bbc7e9279daba813~tplv-k3u1fbpfcp-zoom-1.image)
212+
213+
TensorFlow Pod 分别并发 50、100、200、500 的回源流量。
214+
215+
![图片](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b11a193034b84255ba96aeb557c4429c~tplv-k3u1fbpfcp-zoom-1.image)
216+
217+
在大规模场景下,使用 Dragonfly 回源拉取镜像的数量很少。OCIv1 的场景所有的镜像拉取都要回源,因此使用 Dragonfly 回源峰值和回源流量相比 OCIv1 的场景少很多。并且使用 Dragonfly 后随着并发数提高,回源峰值和流量不会显著提高。
218+
219+
### 总结
220+
221+
基于项目整体成熟度,社区活跃度、用户数量、架构复杂度,是否针对 Nydus 优化。未来发展趋势等因素综合考虑,Dragonfly 是 P2P 项目中最优的选型。
222+
223+
### 术语及定义
224+
225+
**OCI**
226+
Open Container Initiative,开放容器计划是一个 Linux 基金会项目,由Docker在2015年6月启动,旨在为操作系统级虚拟化(*最重要的是 Linux 容器)*设计开放标准。
227+
228+
**OCI Artifac****t**
229+
遵循 OCI image spec 的制品。
230+
231+
**镜像**
232+
本文中的镜像指 OCI Artifact,因此也包括 Helm Chart 等其他 OCI Artifact。
233+
234+
**镜像仓库**
235+
遵循 OCI distribution spec 实现的制品仓库。
236+
237+
**ECS**
238+
是一种由CPU、内存、云盘组成的资源集合,每一种资源都会逻辑对应到数据中心的计算硬件实体。
239+
240+
**CR**
241+
火山引擎镜像仓库服务。
242+
243+
**VKE**
244+
火山引擎通过深度融合新一代云原生技术,提供以容器为核心的高性能 Kubernetes 容器集群管理服务,助力用户快速构建容器化应用。
245+
246+
**VCI**
247+
火山一种 Serverless 和容器化的计算服务。当前 VCI 可无缝集成容器服务 VKE,提供 Kubernetes 编排能力。
248+
249+
使用 VCI,可以专注于构建应用本身,而无需购买和管理底层云服务器等基础设施,并仅为容器实际运行消耗的资源付费。VCI 还支持秒级启动、高并发创建、沙箱容器安全隔离等能力。
250+
251+
**TOS**
252+
火山引擎提供的海量、安全、低成本、易用、高可靠、高可用的分布式云存储服务。
253+
254+
**Private Zone**
255+
基于专有网络VPC*(Virtual Private Cloud)*环境的私有DNS服务。该服务允许在自定义的一个或多个VPC中将私有域名映射到IP地址。
256+
257+
**P2P**
258+
259+
点对点技术,当 P2P 网络中某一个 peer 从 server 下载数据的时候,下载完数据后也能当作服务端供其他 peer 下载。当大量节点同时下载的时候,能保证后续下载的数据,可以不用从 server 端下载。从而减轻 server 端的压力。
260+
261+
**Dragonfly**
262+
Dragonfly 是⼀款基于 P2P 技术的文件分发和镜像加速系统,并且是云原生架构中镜像加速领域的标准解决方案以及最佳实践。现在为云原生计算机基金会*(CNCF)*托管作为孵化级项目。
263+
264+
**Nydus**
265+
Nydus 简介: Nydus 镜像加速框架是 Dragonfly 的子项目,它提供了容器镜像按需加载的能力,在生产环境支撑了每日百万级别的加速镜像容器创建,在启动性能,镜像空间优化,端到端数据一致性,内核态支持等方面相比 OCIv1 有巨大优势。
266+
267+
***|社区相关网址|***
268+
269+
**Dragonfly 社区官网网站**:
270+
271+
Volcano Engine: [https://www.volcengine.com](https://www.volcengine.com)
272+
273+
Volcano Engine VKE: [https://www.volcengine.com/product/vke](https://www.volcengine.com/product/vke)
274+
275+
Volcano Engine CR: [https://www.volcengine.com/product/cr](https://www.volcengine.com/product/cr)
276+
277+
Dragonfly 官网: [https://d7y.io/](https://d7y.io/)
278+
279+
Dragonfly Github Repo: [https://github.com/dragonflyoss/Dragonfly2](https://github.com/dragonflyoss/Dragonfly2)
280+
281+
Nydus 官网: [https://nydus.dev/](https://nydus.dev/)
282+
283+
Nydus Gihtub Repo: [https://github.com/dragonflyoss/image-service](https://github.com/dragonflyoss/image-service)
284+
285+
**Dragonfly Star 一下✨:**
286+
[https://github.com/dragonflyoss/Dragonfly2](https://github.com/dragonflyoss/Dragonfly2)

0 commit comments

Comments
 (0)