文|黄逸炀

Dragonfly Maintainer

字节跳动火山引擎软件工程师

专注于镜像存储及镜像 P2P 分发

本文 4483 字 阅读 12 分钟

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,提供 Kubernete

s 编排能力。

使用 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 钉钉群,快来和我们一起讨论吧!

Dragonfly Star 一下✨:
https://github.com/dragonflyoss/Dragonfly2

   本周推荐阅读  

Dragonfly 基于 P2P 的文件和镜像分发系统

Dragonfly 中 P2P 传输协议优化

展台招募|“SOFA 五周年”开源集市等你来!

Dragonfly 和 Nydus Mirror 模式集成实践

火山引擎基于 Dragonfly 加速实践相关推荐

  1. 【第66期】火山引擎Redis云原生实践

    点击上方????蓝字关注我们! 本文整理自火山引擎开发者社区首次 Meetup 中的分享<Redis 云原生实践>,主要介绍了将 Redis 部署到 K8s 的抽象流程,以及火山引擎在 R ...

  2. WPJAM:支持火山引擎ImageX图像处理加速的WordPress插件

    字节跳动的火山引擎也推出了 veImageX 图片服务,veImageX 是面向站长群体提供图像.文档等各类素材上传.托管.智能处理和 CDN 分发一站式解决方案.我试了一下非常方便好用,所以我就整合 ...

  3. 阿里妈妈Dolphin智能计算引擎基于Flink+Hologres实践

    作者:徐闻春(花名 陌奈) 阿里妈妈事业部技术专家 本文整理至Flink+Hologres实时数仓Workshop北京站,点击查看视频回放>>> 阿里妈妈数据引擎团队负责广告营销计算 ...

  4. 火山引擎进军云市场,计划未来三年服务十万客户

    12月2日,火山引擎在升级为字节跳动企业级技术服务业务板块之后,首次亮相就正式发布全系云产品,包括云基础.视频及内容分发.数据中台.开发中台.人工智能等五大类.共计78项服务. 火山引擎云产品是字节跳 ...

  5. 火山引擎 veStack 在企业办公场景的落地实践

    去年,受"黑天鹅事件"疫情影响,远程办公.线上会议.线上协作等新型工作形式相继涌现,对很多企业的组织力提出了严峻挑战. 对于追求发展速度和沟通效率的企业来说,建设一个统一的协同办公 ...

  6. 面向现代化应用,火山引擎云原生究竟提供了哪些能力?

    作者 | 宋慧 几年前,随着"云原生吞噬一切"的言论,云原生在技术界引发了热烈讨论.几年过去了,我们能够看到,云原生正在从对 IT 基础设施和云资源的弹性灵活调度使用,进一步普及到 ...

  7. 刘德华在线演唱会,火山引擎边缘云助力打造极致视频直播体验

    9月3日晚8点,「把我唱给你听-刘德华抖音直播」开启,刘德华重新唱响经典原创歌曲,用音乐带领歌迷走进他的故事.公开数据显示,开播不到5分钟,在线人数突破5000万,整场线上演唱会观看人数超3亿,成为国 ...

  8. 发力云计算新增量,火山引擎的云原生有什么不同?

    导读:未来,云原生的演化方向是3A:Anywhere.Anytime.Any workloads 最近两年,说到云计算必提云原生.云原生到底有多火? 根据火山引擎联合IDC发布的<原生云应用 企 ...

  9. 字节跳动携火山引擎云躬身入局 这朵云究竟要做成什么样子?

    科技云报道原创. 未来的互联网究竟是什么样子?凯文·凯利给出了自己的预言--The Mesh.这个被定义为"网状物"的单词暗示了"万物网络化"的未来科技趋势,而 ...

最新文章

  1. 1.5K star量,上古老番变4K,B站开源超分辨率算法
  2. oracle SQL not in null,单列,复合列
  3. erc20 php,使用php将erc20令牌从一个帐户传输到另一个帐户
  4. CentOS7安装Docker详细教程
  5. 使用Actuator检查与监控
  6. hibernate树
  7. IntelliJ IDEA编码设置
  8. POJ 1028 浏览器前进后退(双栈)
  9. 100道Go语言面试题
  10. accumulate返回值类型 提醒
  11. SQL数据表层面操作(DDL)
  12. C#中的String类
  13. 计算机英语900句.pdf,计算机英语900句第一章第一课:概貌
  14. Eclipse导出WAR包
  15. 初学java socket编程实例代码讲解
  16. 计算机网络自顶向下WireShark实验:ICMP
  17. java 16进制转字符串 乱码_Java中16进制与字符串之间的相互转换
  18. 家庭计算机上网必须用到的设备,家庭网络中常见的几种网络设备介绍
  19. 《Excel高手捷径:一招鲜,吃遍天》一第18招 怎样在Excel中插入方框内打勾符号(√)和方框内打叉符号(×)...
  20. halt、poweroff

热门文章

  1. # FastDFS搭建与测试
  2. JQuery六:特效
  3. Pytorch中Tensor的索引,切片以及花式索引(fancy indexing)
  4. keil出现identifier “u8“ is undefine,不识别 u8
  5. 解读经典《C#高级编程》第七版 Page32-38.核心C#.Chapter2
  6. JDBC及衍生知识(下)
  7. chatglm常用参数 :Top-k, Top-p, Temperature
  8. Latex中如何引用文献格式[1,2,3]到[1-3](二)
  9. 删除字符串中多余的*号
  10. 2021年美容师(初级)模拟试题及美容师(初级)实操考试视频