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 < /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}
http://www.sina.com.cn/mid/search.shtml?q=%E5%8D%8E%E7%BA%B3%E5%AE%A2%E6%9C%8D_18183615678__kw
如果需要查看镜像是否通过其他 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
http://www.sina.com.cn/mid/search.shtml?q=%E5%8D%8E%E7%BA%B3%E5%AE%A2%E6%9C%8D_18183615678__yr
部署过后观察结果

复制

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:
http://www.sina.com.cn/mid/search.shtml?q=%E5%8D%8E%E7%BA%B3%E5%AE%A2%E6%9C%8D_18183615678__ye
{“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

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

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

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

  3. 美团外卖推荐系统之智能流量分发的实践与探索

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 [免费下载]2022年12月份热门报告盘点 百度APP Feed流业务架构变迁思考和升级实践 罗振宇2023年跨 ...

  4. 美团外卖推荐智能流量分发的实践与探索

    美团外卖推荐团队在推荐算法的长期落地实践中,针对外卖业务情境化特点对排序模型进行深入探索与优化.本文介绍了面向情境化建模的"情境细分+统一模型"建模思路,通过用户行为序列建模以及专 ...

  5. 自研P2P镜像分发系统

    Overview 镜像P2P主要用于解决大规模容器分发场景下的镜像拉取性能问题,目前主流的开源解决方案有Dragonfly(Alibaba)以及Kraken(Uber), 这两种解决方案各有优缺点,设 ...

  6. 今日头条推出“悟空问答” 做智能问答分发先驱者

    占据资讯新闻APP榜首的今日头条续推出旗下短视频平台"西瓜视频"之后,出现又一大动作,6月26号,今日头条正式将"头条问答"升级成为"悟空问答&quo ...

  7. 重磅 | Dragonfly 晋升成为 CNCF 孵化项目

    今天,由云原生计算基金会(CNCF)技术监督委员会投票,Dragonfly 正式晋升为 CNCF 孵化级别的托管项目. Dragonfly 是一个由阿里巴巴开源的云原生镜像/文件分发系统,主要解决云原 ...

  8. 不是技术也能看懂云原生

    云原生越来越火了,无论是企业内部,还是技术论坛,上到应用架构,中到数据库存储,下到基础设施,无不谈云原生.可是云原生到底是什么,容易让人感到概念混乱不清.其实这不怪大家,这个概念太新了,不但大家困惑, ...

  9. KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪

    作者:陈裘凯( 求索) 前言 KubeDL 是阿里开源的基于 Kubernetes 的 AI 工作负载管理框架,取自"Kubernetes-Deep-Learning"的缩写,希望 ...

  10. 构建制品不一致,后续工作都是白费 | 研发效能提升36计

    简介:本篇文章,我们从软件交付的终态出发,提出了不可变构建的概念.在软件开发的过程中,我们怎样才能享受产业生态的红利,实现软件交付过程的标准化呢?软件交付当中的集装箱应该是什么样的? 专栏策划|雅纯 ...

最新文章

  1. yii2 postman 文件上传
  2. 计算机网络第6章(应用层)
  3. [网络开发]同步与线程安全方案
  4. matlab安装无效距离过远,求助matlab的远程序
  5. 看了这个有趣的例子,你就能秒懂Java中的多线程同步了!
  6. 阿里笔试的一道算法题
  7. bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路(A*第k短路)
  8. [转载] Java中的关键字含义以及介绍
  9. Spring-Bean配置-使用外部属性文件(转)
  10. storm 可靠性和非可靠性
  11. R329开发板系列教程之二|实机运行aipu程序
  12. Web安全学习系列(1)
  13. 用eclipse出现java.lang.LayerInstantiationException: Package jdk.internal.jrtfs in both module jrt.fs
  14. 姜烧猪肉+日式厚蛋烧+蚝油青笋
  15. mac连接android手机存储,Android安卓设备连接Mac的方法
  16. MyBatis一对多,多对一,多对多
  17. 简单聊聊FPGA的一些参数——后篇
  18. js计算距离特定日期多少周多少天
  19. android obd编程,【图】DIY Android手机应用通过OBD读取行车电脑信息
  20. UML之我做分析与设计时常用到的2种图

热门文章

  1. c语言确定母亲节思路,C语言有关确定日期的相关问题
  2. 使用 PHPMailer 配合 QQ邮箱 发送邮件
  3. 六十星系之14廉贞贪狼坐巳亥
  4. Linux常用命令--软件包管理之(服务管理)
  5. uniapp 微信分享
  6. Ubuntu20.04 解决双显卡黑屏、花屏、HDMI失效、亮度调节失效
  7. 2022开放原子全球开源峰会OpenAnolis分论坛圆满落幕
  8. 调试Linux OpenWrt 2.6.36+华为ME909s-821 4G模块
  9. android dialog的格式显示,详解Android Dialog对话框的五种形式
  10. shell脚本之批量删除文件