AI 基础设施之使用 Dragonfly V2 分发集群的镜像

💡 原文中文,约10800字,阅读约需26分钟。
📝

内容提要

Dragonfly是一个P2P分发网络,用于分发镜像和文件,支持AI业务中的推理和训练。部署拓扑包括LB、VM、Peer节点,使用节点配置集成Docker、Containerd和Nydus。网络传输限制是构建高性能P2P分发网络的重要考虑因素。

🔎

延伸解读

部署拓扑设计:隔离与高可用

文章采用多VPC部署,每个VPC对应一个Dragonfly Cluster,仅允许VPC内Peer组网,避免跨VPC NAT流量和公网传输。控制平面使用双VM部署Manager、Scheduler和Seed Peer,共享MySQL和Redis,实现高可用。同时,Kubernetes Master节点不进行加速优化,保持PaaS层控制面简洁独立,避免循环依赖。

节点集成方式:代理与镜像的取舍

Docker通过HTTP_PROXY代理全部流量,若代理故障则拉取失败;而Containerd使用certs.d配置mirror,类似镜像加速,但需注意X-Dragonfly-Registry头设置。Nydus集成需在nydusd配置中添加mirror并指定ping_url。不同方式在故障回退和配置复杂度上存在差异,需根据环境选择。

性能瓶颈:Peer间网络传输受限

作者在Benchmark中发现,AZ内和跨AZ的Peer之间数据传输都受限,这成为构建高性能P2P分发网络的关键瓶颈。因此,在规划网络时,Peer与Peer、Peer与Seed Peer之间的带宽和延迟需重点考量。此外,当前部署缺乏指标监控,不利于持续优化和故障排查。

❓

Q&A

Dragonfly V2 的主要组件有哪些?各自的作用是什么?

Dragonfly V2 的主要组件包括:Manager(提供 UI 界面、用户管理、集群监控、任务管理等功能)、Scheduler(调度 Peer 之间的流量、提供预热等功能)、Seed Peer(回源节点,用于从源站下载数据,也可作为 Peer 节点)和 Peer(提供下载数据的终端节点)。其中 Manager 和 Scheduler 是单独的容器镜像,Seed Peer 和 Peer 使用同一个容器镜像。

在 IDC 机房中部署 Dragonfly 集群时,如何规划网络拓扑以避免额外负担?

部署拓扑包括 LB、VM 和 Peer 节点。LB 需要公网 IP 作为 Peer 的接入点;一个 VPC 对应一个 Dragonfly Cluster 抽象,仅允许同一 VPC 内的 Peer 组网,避免跨 VPC 的 NAT 流量和公网传输数据;每个 Node 节点部署一个 Peer。高可用方案中,LB 只需内网 IP,使用云厂的 MySQL 8.0 和 Redis 6 服务,两台 VM 各部署一套完整的 Dragonfly 集群(包括 Manager、Scheduler、Seed Peer),共享数据存储,保障可用性。

如何在 Kubernetes 集群中部署 Dragonfly 的 Peer 节点?

首先创建命名空间 dragonfly-system,然后创建 ConfigMap 配置文件(需将 LB 的 IP 填入 manager.netAddrs 中),最后使用 DaemonSet 部署 Peer 节点。DaemonSet 使用 dragonflyoss/dfdaemon:v2.1.28 镜像,缓存目录挂载到主机的 /data/dfget 目录(需提前清理避免权限问题),并设置 hostNetwork 和 hostPID 为 true。部署后可通过 kubectl get pod 查看运行状态。

如何配置 Docker 使用 Dragonfly 加速镜像拉取?

采用 Proxy 方式代理所有 Dockerd 流量。创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件,设置 HTTP_PROXY 和 HTTPS_PROXY 为 http://127.0.0.1:65001,然后执行 systemctl daemon-reload 和 systemctl restart docker 重启 Docker。注意如果 /etc/docker/daemon.json 中没有配置 "live-restore": true,会导致容器全部重启。配置后,Docker 拉取镜像的流量会经过 Dragonfly Peer 节点。

如何为 Containerd 配置 Dragonfly 代理以加速镜像拉取?

在 /etc/containerd/config.toml 中确保 [plugins."io.containerd.grpc.v1.cri".registry] 项的 config_path = "/etc/containerd/certs.d"。然后为每个镜像仓库创建 hosts.toml 文件,例如对于 docker.io,创建 /etc/containerd/certs.d/docker.io/hosts.toml,配置 server 为 https://docker.io,并添加 host."http://127.0.0.1:65001" 作为 mirror,设置 capabilities 为 ["pull", "resolve"],并添加 header X-Dragonfly-Registry = ["https://registry-1.docker.io"]。配置后无需重启 Containerd 即可生效。

集成 Nydus 时,如何配置 Dragonfly 作为镜像加速源?

编辑 /etc/nydus/nydusd-config.fusedev.json 文件,在 device.backend.config.mirrors 中添加一个 mirror,设置 host 为 http://127.0.0.1:65001,auth_through 为 false,headers 中设置 X-Dragonfly-Registry 为 https://index.docker.io,并设置 ping_url 为 http://127.0.0.1:40901/server/ping。然后重启 nydus-snapshotter 服务使配置生效。之后使用 nerdctl 拉取 Nydus 镜像时就会通过 Dragonfly 加速。

部署 Dragonfly V2 后,有哪些性能方面的注意事项或不足?

文章指出,部署后缺乏指标监控。在做 Benchmark 时发现,AZ 内和跨 AZ 的 Peer 之间的数据传输都受限。因此,如果想构建高性能的 P2P 分发网络,Peer 与 Peer、Peer 与 Seed Peer 之间的网络是一个重要的考量因素。

🏷️

标签

➡️

继续阅读