Dragonfly 是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高文件传输的效率和速率,最大限度地利用网络带宽,尤其是在分发大量数据时,例如应用分发、缓存分发、日志分发和镜像分发。


在阿里巴巴,Dragonfly 每个月会被调用 20 亿次,分发的数据量高达 3.4PB。Dragonfly 已成为阿里巴巴基础设施中的重要一环。


尽管容器技术大部分时候简化了运维工作,但是它也带来了一些挑战:例如镜像分发的效率问题,尤其是必须在多个主机上复制镜像分发时。


Dragonfly 在这种场景下能够完美支持 Docker 和 PouchContainer。它也兼容其他格式的容器。相比原生方式,它能将容器分发速度提高 57 倍,并让 Registry 网络出口流量降低 99.5%。
Dragonfly 能让所有类型的文件、镜像或数据分发变得简单而经济。


更多请通过官方文档了解。

纯Docker部署

这里采用多机部署,方案如下:

应用 IP
服务端 172.17.100.120
客户端 172.17.100.121
客户端 172.17.100.122

部署服务端

以docker方式部署,命令如下:

docker run -d --name supernode --restart=always -p 8001:8001 -p 8002:8002 \
dragonflyoss/supernode:0.3.0 -Dsupernode.advertiseIp=172.17.100.120

部署客户端

准备配置文件
Dragonfly 的配置文件默认位于 /etc/dragonfly 目录下,使用容器部署客户端时,需要将配置文件挂载到容器内。
为客户端配置 Dragonfly Supernode 地址:

cat <<EOD > /etc/dragonfly/dfget.yml
nodes:
- 172.17.100.120
EOD
启动客户端
docker run -d --name dfclient --restart=always -p 65001:65001 \
-v /etc/dragonfly:/etc/dragonfly \
dragonflyoss/dfclient:v0.3.0 --registry https://index.docker.io

registry是仓库地址,这里使用的官方仓库

修改Docker Daemon配置

我们需要修改 Dragonfly 客户端机器(dfclient0, dfclient1)上 Docker Daemon 配置,通过 mirror 方式来使用 Dragonfly 进行镜像的拉取。
在配置文件 /etc/docker/daemon.json 中添加或更新如下配置项:

{
"registry-mirrors": ["http://127.0.0.1:65001"]
}

然后重启Docker

systemctl restart docker

拉取镜像测试

在任意一台客户端上进行测试,比如:

docker pull tomcat

验证

查看client端的日志,如果输出如下,则表示是通过DragonFly来传输的。

docker exec dfclient grep 'downloading piece' /root/.small-dragonfly/logs/dfclient.log
2020-06-20 15:56:49.813 INFO sign:146-1592668602.159 : downloading piece:{"taskID":"4d977359836129ce2eec4b8418a7042c47db547a239e2a577ddc787ee177289c","superNode":"172.17.100.120","dstCid":"cdnnode:172.17.100.120~4d977359836129ce2eec4b8418a7042c47db547a239e2a577ddc787ee177289c","range":"0-4194303","result":503,"status":701,"pieceSize":4194304,"pieceNum":0}

如果需要查看镜像是否通过其他 peer 节点来完成传输,可以执行以下命令:

docker exec dfclient grep 'downloading piece' /root/.small-dragonfly/logs/dfclient.log | grep -v cdnnode

如果以上命令没有输出结果,则说明镜像没有通过其他peer节点完成传输,否则说明通过其他peer节点完成传输。

在Kubernetes中部署

服务端以Deployment的形式部署

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: supernode
name: supernode
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: supernode
template:
metadata:
labels:
app: supernode
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
spec:
containers:
- image: dragonflyoss/supernode:0.3.0
name: supernode
ports:
- containerPort: 8080
hostPort: 8080
name: tomcat
protocol: TCP
- containerPort: 8001
hostPort: 8001
name: register
protocol: TCP
- containerPort: 8002
hostPort: 8002
name: download
protocol: TCP
volumeMounts:
- mountPath: /etc/localtime
name: ltime
- mountPath: /home/admin/supernode/logs/
name: log
- mountPath: /home/admin/supernode/repo/
name: data
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
restartPolicy: Always
tolerations:
- effect: NoExecute
operator: Exists
- effect: NoSchedule
operator: Exists
nodeSelector:
node-role.kubernetes.io/master: ""
volumes:
- hostPath:
path: /etc/localtime
type: ""
name: ltime
- hostPath:
path: /data/log/supernode
type: DirectoryOrCreate
name: log
- hostPath:
path: /data/supernode/repo/
type: DirectoryOrCreate
name: data ---
kind: Service
apiVersion: v1
metadata:
name: supernode
namespace: kube-system
spec:
selector:
app: supernode
ports:
- name: register
protocol: TCP
port: 8001
targetPort: 8001
- name: download
protocol: TCP
port: 8002
targetPort: 8002

以hostNetwork的形式部署在master上。

部署过后可以看到supernode已经正常启动了。

# kubectl get pod -n kube-system | grep supernode
supernode-86dc99f6d5-mblck 1/1 Running 0 4m1s

客户端以daemonSet的形式部署,yaml文件如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dfdaemon
namespace: kube-system
spec:
selector:
matchLabels:
app: dfdaemon
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
app: dfdaemon
spec:
containers:
- image: dragonflyoss/dfclient:v0.3.0
name: dfdaemon
imagePullPolicy: IfNotPresent
args:
- --registry https://index.docker.io
resources:
requests:
cpu: 250m
volumeMounts:
- mountPath: /etc/dragonfly/dfget.yml
subPath: dfget.yml
name: dragonconf
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
restartPolicy: Always
tolerations:
- effect: NoExecute
operator: Exists
- effect: NoSchedule
operator: Exists
volumes:
- name: dragonconf
configMap:
name: dragonfly-conf

配置文件我们以configMap的形式挂载,所以我们还需要编写一个configMap的yaml文件,如下:

apiVersion: v1
kind: ConfigMap
metadata:
name: dragonfly-conf
namespace: kube-system
data:
dfget.yml: |
nodes:
- 172.17.100.120

部署过后观察结果

# kubectl get pod -n kube-system | grep dfdaemon
dfdaemon-mj4p6 1/1 Running 0 3m51s
dfdaemon-wgq5d 1/1 Running 0 3m51s
dfdaemon-wljt6 1/1 Running 0 3m51s

然后修改docker daemon的配置,如下:

{
"registry-mirrors": ["http://127.0.0.1:65001"]
}

重启docker

systemctl restart docker

现在我们来拉取镜像测试,并观察日志输出。
下载镜像(在master上测试的):

docker pull nginx

然后观察日志

kubectl exec  -n kube-system dfdaemon-wgq5d  grep 'downloading piece' /root/.small-dragonfly/logs/dfclient.log

看到日志输出如下,表示成功

2020-06-20 17:14:54.578 INFO sign:128-1592673287.190 : downloading piece:{"taskID":"089dc52627a346df2a2ff67f6c07497167b35c4bad2bca1e9aad087441116982","superNode":"172.17.100.120","dstCid":"cdnnode:192.168.235.192~089dc52627a346df2a2ff67f6c07497167b35c4bad2bca1e9aad087441116982","range":"0-4194303","result":503,"status":701,"pieceSize":4194304,"pieceNum":0}

今天的测试就到这里,我这是自己的小集群实验室,效果其实并不明显,在大集群效果可能更好。

使用DragonFly进行智能镜像分发的更多相关文章

  1. 阿里Dragonfly docker p2p 镜像分发试用

      阿里的Dragonfly p2p 镜像分发已经开源了,同时加入了cncf ,很给力 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/alidr ...

  2. 深度解读阿里巴巴云原生镜像分发系统 Dragonfly

    Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题.随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过 ...

  3. Docker容器技术-镜像分发

    一.镜像分发 1.镜像及镜像库的命名方式 指定镜像名称和标签的方法: 在狗偶见镜像时 通过docker tag命令 [root@bogon ~]# cd identidock/ [root@bogon ...

  4. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵?

    K8s的出现为PaaS行业的发展打了一针兴奋剂,Docker+k8s的技术路线已经成为了容器云的主流.尤其针对大流量,大弹性的应用场景来说,k8s将其从繁杂的运维.部署工作中彻底拯救出来.然而事情往往 ...

  5. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵

    K8s的出现为PaaS行业的发展打了一针兴奋剂,Docker+k8s的技术路线已经成为了容器云的主流.尤其针对大流量,大弹性的应用场景来说,k8s将其从繁杂的运维.部署工作中彻底拯救出来.然而事情往往 ...

  6. ImageApparate(幻影)镜像加速服务让镜像分发效率提升 5-10 倍

    作者介绍 李昂,腾讯高级开发工程师,主要关注容器存储和镜像存储相关领域,目前主要负责腾讯容器镜像服务和镜像存储加速系统的研发和设计工作. 李志宇,腾讯云后台开发工程师.负责腾讯云 TKE 集群节点和运 ...

  7. .NET 微服务——CI/CD(3):镜像自动分发

    如何通过Jenkins完成镜像分发?基本做法是:打包镜像→上传镜像到仓库→脚本分发.镜像仓库也有很多,比如docker hub.Harbor等,今天这一篇讲一下基于阿里云镜像仓库的操作. 首先,准备一 ...

  8. 知乎十万级容器规模的Java分布式镜像仓库实践

    作者:知乎令孤无忌 前言 知乎在 2016 年已经完成了全量业务的容器化,并在自研容器平台上以原生镜像的方式部署和运行,并在后续陆续实施了 CI.Cron.Kafka.HAProxy.HBase.Tw ...

  9. 4.docker学习之镜像

    镜像 我们知道,我们想在Windows操作系统上跑Linux,需要安装一个虚拟机程序,然后下载一个Linux镜像,在该虚拟机程序中创建一个虚拟机,并使用该镜像安装对应的Linux操作系统,安装好之后, ...

随机推荐

  1. 像宝石一样的Java原子类

    十五年前,多处理器系统是高度专业化的系统,通常耗资数十万美元(其中大多数具有两到四个处理器). 如今,多处理器系统既便宜又丰富,几乎主流的微处理器都内置了对多处理器的支持,很多能够支持数十或数百个处理 ...

  2. 化学元素周期表的英文全称 Periodic Table of the Elements

    化学元素周期表的英文全称 Periodic Table of the Elements   缩写 PTE 拉丁文 英文 1 H 氢 Hydrogenium Hydrogen 2 He 氦 Helium ...

  3. [COCOS2DX-LUA]0-004.cocos2dx中的DrawNode的init的方法问题

    1.诱因 近期,项目接入了Bugly, 上报了一些平常测试不出来,或者很难重现的bug,这类bug非常难排查.原因有二,第一,问题无法重现,第二,修改了无法立即验证结果.有一个问题困恼了我很久,就是一 ...

  4. 国际化之fmt标签

    1. 什么是国际化和本地化: I. 本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯.II. 国际化:软件开发时,让它能支持多个国家和地区的本地化应用.使得应用软 ...

  5. 树莓派4B获取IP地址的几种简易方法

    首先声明一下,使用的是Paspbian系统,其实其他系统和本文说的获取IP地址关系也不大. 1.当你有路由器,有PC客户端的情况,你把你的树莓派用网线将其连接起来.你可以借助这个软件,advanced ...

  6. JSON.parse() 的实现

    目录 1. JSON.parse() 2. 前置知识 2.1 JSON格式中的数据类型 2.2 转义字符的处理 2.2 判断对象是否相等 2.3 寻找匹配的字符串 2.4 基础的递归思想 3. 实现流 ...

  7. Java实现 LeetCode 810 黑板异或游戏 (分析)

    810. 黑板异或游戏 一个黑板上写着一个非负整数数组 nums[i] .小红和小明轮流从黑板上擦掉一个数字,小红先手.如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家 ...

  8. Java实现 LeetCode 326 3的幂

    326. 3的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: tru ...

  9. Java实现第九届蓝桥杯第几个幸运数字

    第几个幸运数字 题目描述 到x星球旅行的游客都被发给一个整数,作为游客编号. x星的国王有个怪癖,他只喜欢数字3,5和7. 国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来 ...

  10. java实现第六届蓝桥杯胡同门牌号

    胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有趣的事情: 如果除去小明家不算,胡同里的其它门牌号加起来,刚好是1 ...