使用 Dragonfly V2 分发集群的镜像

使用 Dragonfly V2 分发集群的镜像

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

内容提要

本文分享在生产环境部署 Dragonfly V2 的实践。Dragonfly V2 通过 P2P 网络分发镜像和文件,核心组件包括 Manager、Scheduler、Seed Peer 和 Peer。在 IDC 多 VPC 机房中,控制平面采用双 VM 部署,共享 MySQL 和 Redis 实现高可用,各 Node 节点部署 Peer,并集成 Docker、Containerd 和 Nydus。当前不足是缺少指标监控,且跨 AZ 的 Peer 间传输受限,网络是构建高性能 P2P 分发网络的关键因素。

🔎

延伸解读

控制平面高可用设计

文章采用双 VM 部署 Manager、Scheduler 和 Seed Peer,共享云厂 MySQL 8.0 和 Redis 6,实现控制平面高可用。每个 VM 部署完整集群,不经过 LB 也能使用,LB 仅需内网 IP 作为 Peer 接入点。这种设计避免与 PaaS 层耦合,防止循环依赖,同时保障了控制面的简洁和独立。

Peer 组网与网络限制

每个 Node 节点部署一个 Peer,但仅允许同一 VPC 内的 Peer 组网,跨 VPC 的 NAT 流量和公网传输被禁止。这虽然降低了网络负担,但也导致跨 AZ 的 Peer 间数据传输受限。文章指出,构建高性能 P2P 分发网络时,Peer 与 Peer、Peer 与 Seed Peer 之间的网络是关键考量因素。

Docker 代理模式的风险

集成 Docker 时采用 Proxy 方式代理全部 Dockerd 流量,而非 Mirror 方式。区别在于:Mirror 故障时 Dockerd 会回源拉取,而 Proxy 故障时 Dockerd 直接拉取失败。此外,若 /etc/docker/daemon.json 未配置 "live-restore": true,重启 Docker 会导致所有容器重启,需提前注意。

Containerd 与 Nydus 集成要点

Containerd 通过 config_path 配置 mirror,添加后无需重启 Containerd 即可生效。配置 docker.io 时需手动指定 X-Dragonfly-Registry 为 https://registry-1.docker.io,否则会报错。Nydus 集成类似,在 nydusd-config.fusedev.json 中添加 mirror 并设置正确的 header,重启 nydus-snapshotter 后即可通过 Dragonfly 加速拉取。

❓

Q&A

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

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

在 IDC 多 VPC 机房中部署 Dragonfly 集群时,如何实现高可用?

在 IDC 多 VPC 机房中,控制平面采用双 VM 部署,每台 VM 上运行一套完整的 Dragonfly 集群(包括 Manager、Scheduler、Seed Peer),共享云厂的 MySQL 8.0 和 Redis 6 服务,从而保障高可用。每个 VPC 对应一个 Dragonfly Cluster 抽象,VPC 内的每个 Node 节点部署一个 Peer。LB 需要公网 IP 作为 Peer 的接入点,但 VPC 内组网时 LB 只需内网 IP。

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

在 Kubernetes 集群中部署 Peer 的步骤:1. 创建命名空间 dragonfly-system;2. 创建 ConfigMap,配置文件中需填入 LB 的 IP 地址(MANAGER_IP),以便 Peer 接入集群;3. 创建 DaemonSet,使用镜像 dragonflyoss/dfdaemon:v2.1.28,并挂载主机目录 /data/dfget/cache 和 /data/dfget/data 作为缓存和数据目录。部署前建议清理主机上的 /data/dfget 目录以避免权限问题。

如何配置 Docker 使用 Dragonfly 进行镜像加速?

配置 Docker 使用 Dragonfly 的 Proxy 方式:创建 /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。注意:如果 /etc/docker/daemon.json 中没有配置 "live-restore": true,重启 Docker 会导致所有容器重启。Proxy 方式会代理所有 Dockerd 流量,而 Mirror 方式只能加速 Docker.io 的镜像。

如何配置 Containerd 使用 Dragonfly 作为镜像加速器?

配置 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 和 host 为 http://127.0.0.1:65001,并设置 header X-Dragonfly-Registry = ["https://registry-1.docker.io"]。配置后无需重启 Containerd 即可生效。

如何将 Nydus 与 Dragonfly 集成?

将 Nydus 与 Dragonfly 集成:编辑 Nydusd 配置文件 /etc/nydus/nydusd-config.fusedev.json,在 backend 的 registry 配置中添加 mirrors,指定 host 为 http://127.0.0.1:65001,并设置 headers 中的 X-Dragonfly-Registry 为 https://index.docker.io,同时可设置 ping_url 为 http://127.0.0.1:40901/server/ping。然后重启 Nydusd(systemctl restart nydus-snapshotter)即可。

Dragonfly V2 在生产环境部署中有哪些不足或注意事项?

根据实践,Dragonfly V2 目前缺少指标监控。此外,在做 Benchmark 时发现 AZ 内和跨 AZ 的 Peer 之间的数据传输都受限,因此网络是构建高性能 P2P 分发网络的关键考量因素,需要关注 Peer 与 Peer、Peer 与 Seed Peer 之间的网络状况。

🏷️

标签

➡️

继续阅读