Dragonfly 简介
什么是 Dragonfly?
Dragonfly 是一个基于 P2P(点对点)技术的智能容器镜像和文件分发系统,由阿里云开源并捐赠给 CNCF(云原生计算基金会)。
核心价值
在我们的环境中,Dragonfly 解决以下痛点:
| 问题 | 传统方式 | Dragonfly 方式 |
|---|---|---|
| 镜像拉取速度 | 每个节点独立从 Artifactory 下载 | 节点间 P2P 共享,首个节点下载后其他节点从集群内获取 |
| 带宽消耗 | N 个节点 × 镜像大小 | 1 × 镜像大小 + P2P 内网传输 |
| Registry 压力 | 高并发时压力大 | 只有首次下载访问 Registry |
| 大规模部署 | 100 个 Pod 同时启动会导致超时 | 快速 P2P 分发,几乎无感知 |
典型场景
场景:在 100 个节点上部署一个 2GB 的容器镜像
传统方式:
├── Artifactory 带宽消耗: 100 × 2GB = 200GB
├── 平均下载时间: 5-10 分钟/节点
└── Registry 压力: 100 个并发连接
使用 Dragonfly:
├── Artifactory 带宽消耗: 1 × 2GB = 2GB
├── 平均下载时间: 30 秒/节点(P2P 内网传输)
├── Registry 压力: 1-3 个并发连接(Seed Client)
└── 节约带宽: 99% ✓
🔧 工作原理
P2P 分发模型
Dragonfly 采用 BitTorrent-like 的分块(Piece)分发机制:
┌─────────────────────────────────────────────────────────────────┐
│ 容器镜像下载过程 │
└─────────────────────────────────────────────────────────────────┘
步骤 1: 节点 A 请求镜像
┌──────────┐
│ Node A │ "我需要 nginx:1.21 镜像"
└────┬─────┘
│
↓
┌────────────────┐
│ Scheduler │ "让我查查谁有这个镜像..."
│ (调度器) │ "发现 Seed Client 刚下载过"
└────┬───────────┘
│
↓
┌────────────────┐
│ Seed Client │ "我从 Artifactory 下载"
│ (种子节点) │ "并切分成 100 个分片"
└────┬───────────┘
│
↓ 下载 + 分片
┌────────────────┐
│ Artifactory │
└────────────────┘
步骤 2: 节点 A 获取分片列表并下载
┌──────────┐
│ Node A │ "从 Seed Client 下载分片 1-50"
└────┬─────┘
│
↓ P2P 传输(内网)
┌────────────────┐
│ Seed Client │ "传输中..."
└────────────────┘
步骤 3: 节点 B 请求相同镜像
┌──────────┐
│ Node B │ "我也需要 nginx:1.21 镜像"
└────┬─────┘
│
↓
┌────────────────┐
│ Scheduler │ "太好了!Node A 和 Seed Client 都有"
│ (调度器) │ "你可以从他们那里下载不同的分片"
└────┬───────────┘
│
↓
┌──────────┐ ┌──────────┐ ┌────────────────┐
│ Node B │ ←P2P→ │ Node A │ + P2P → │ Seed Client │
└──────────┘ └──────────┘ └────────────────┘
分片 1-30 分片 31-60 分片 61-100
结果:Node B 同时从 2 个源下载,速度翻倍!
核心概念
1. 分片(Piece)
- 镜像被切分成多个小块(默认 4MB)
- 每个分片可以独立传输和校验
- 类似于下载工具的多线程下载
2. 任务(Task)
- 一个镜像 = 一个任务
- 任务包含所有分片的元数据
- 调度器负责任务的全局管理
3. 对等节点(Peer)
- 集群中的每个节点都是一个 Peer
- Peer 既是下载者,也是上传者
- 形成 P2P 网络拓扑
🏗️ 架构设计
组件架构
┌───────────────────────────────────────────────────────────────────┐
│ Dragonfly 集群架构 │
└───────────────────────────────────────────────────────────────────┘
┌─────────────────┐
│ Manager │ ← 控制平面 (3 副本)
│ (管理控制台) │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────────▼────────┐ ┌──▼──────────┐ ┌─▼─────────────┐
│ Scheduler 1 │ │ Scheduler 2 │ │ Scheduler 3 │
│ (调度器) │ │ (调度器) │ │ (调度器) │
└─────────┬────────┘ └──┬──────────┘ └─┬─────────────┘
│ │ │
└──────────────┼──────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌───────▼────────┐ ┌────────▼────────┐ ┌───────▼────────┐
│ Seed Client 1 │ │ Seed Client 2 │ │ Seed Client 3 │
│ (种子客户端) │ │ (种子客户端) │ │ (种子客户端) │
│ - 主动拉取 │ │ - 高速缓存 │ │ - 50GB 存储 │
│ - 提供种子 │ │ - 长期保存 │ │ │
└───────┬────────┘ └────────┬────────┘ └───────┬────────┘
│ │ │
└────────────────────┼────────────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌───────▼────────┐ ┌────────▼────────┐ ┌───────▼────────┐
│ Client (N1) │ │ Client (N2) │ │ Client (N3) │
│ DaemonSet │ │ DaemonSet │ │ DaemonSet │
│ │ │ │ │ │
│ ┌──────────┐ │ │ ┌──────────┐ │ │ ┌──────────┐ │
│ │ dfdaemon │ │ │ │ dfdaemon │ │ │ │ dfdaemon │ │
│ └────┬─────┘ │ │ └────┬─────┘ │ │ └────┬─────┘ │
│ │ │ │ │ │ │ │ │
│ ┌────▼─────┐ │ │ ┌────▼─────┐ │ │ ┌────▼─────┐ │
│ │containerd│ │ │ │containerd│ │ │ │containerd│ │
│ └──────────┘ │ │ └──────────┘ │ │ └──────────┘ │
└────────────────┘ └─────────────────┘ └────────────────┘
Worker Node 1 Worker Node 2 Worker Node 3
底层支撑服务:
┌─────────────────┐ ┌─────────────────┐
│ Redis Cluster │ │ MySQL Cluster │
│ (任务队列) │ │ (元数据存储) │
│ Master + 2副本 │ │ Primary + 副本 │
└─────────────────┘ └─────────────────┘