dragonfly的安装和使用

dragonfly的安装和使用

一.概述

有时候会遇到镜像拉取缓慢的问题,尤其是必须在多个主机上复制镜像分发时效率较低,之后查阅资料发现这个dragonfly是通过p2p技术解决镜像传输和分发的问题的

Dragonfly一个开源的基于P2P镜像及文件分发系统,由阿里巴巴开源的云原生镜像分发系统 Dragonfly,面向以 Kubernetes 为核心的分布式应用编排系统,前瞻性地解决了云原生镜像分发的下列三大难题:

  • 效率:借助 P2P 与 CDN 技术,缩减镜像传输时间,提升分发效率,加速业务应用交付;
  • 流控:借助智能分析技术,动态平衡分发负载与业务运行态,实现流量动态控制,保障业务稳定运行;
  • 安全:支持私有镜像仓库 HTTPS 协议,加密内容传输,确保信息安全

大规模镜像下载

Dragonfly 下载图解

图注:

  • PouchContainer:阿里巴巴集团开源的高效、轻量级企业级富容器引擎技术;
  • Registry:容器镜像的存储仓库,每个镜像由多个镜像层组成,而每个镜像层又表现为一个普通文件;
  • SuperNode:Dragonfly的服务端,它主要负责种子块的生命周期管理以及构造 P2P 网络并调度客户端互传指定分块;
  • Block:当通过 Dragonfly下载某层镜像文件时,SuperNode 会把整个文件拆分成一个个的块,SuperNode 中的分块称为种子块,种子块由若干初始客户端下载并迅速在所有客户端之间传播,其中分块大小通过动态计算而来;
  • DFget:Dragonfly 的客户端,安装在每台主机上,主要负责分块的上传与下载以及与容器 Daemon 的命令交互;
  • Peer:下载同一个文件的 Host 彼此之间称为 Peer。

处理步骤如下:

  • 1.首先由 Pouch Container 发起 Pull 镜像命令,该命令会被 DFget 代理截获;
  • 2.然后由 DFget 向 SuperNode 发送调度请求;
  • 3.SuperNode 在收到请求后会检查对应的文件是否已经被缓存到本地,如果没有被缓存,则会从 Registry 中下载对应的文件并生成种子块数据(种子块一旦生成就可以立即传播,而并不需要等到 SuperNode 下载完成整个文件后才开始分发),如果已经被缓存,则直接生成分块任务;
  • 4.客户端解析相应的任务并从其他 Peer 或者 SuperNode 中下载分块数据,当某个 Layer 的所有分块下载完成后,一个 Layer 也就下载完毕,此时会传递给容器引擎使用,而当所有的 Layer 下载完成后,整个镜像也就下载完成了。

通过上述 P2P 技术,Dragonfly 可以彻底解决镜像仓库的带宽瓶颈问题,充分利用各个 Peer 的硬件资源和网络传输能力,达到规模越大传输越快的效果。值得一提的是,Dragonfly 的系统架构不涉及对容器技术体系的任何改动,完全可以无缝支持容器使其拥有 P2P 镜像分发能力,以大幅提升文件分发效率。

二.前提条件

请确保您的机器上已经安装并启动 docker 容器引擎
可以提前下好镜像文件,tag到本地仓库。

# 服务端
docker pull dragonflyoss/supernode:0.3.1

# 客户端
docker pull dragonflyoss/dfclient:0.3.1

三.单机部署dragonfly

使用单机部署就是将dragonfly的客户端和服务端部署在同一台机器上面,我们可以快速的上手使用dragonfly。下面是部署步骤:

1.部署 Dragonfly 服务端(supernode)

启动supernode

docker run -d --name supernode --restart=always -p 8001:8001 -p 8002:8002 \
    -v /data/dragonfly/supernode:/home/admin/supernode \
    dragonflyoss/supernode:0.3.1 -Dsupernode.advertiseIp=127.0.0.1

注意:supernode.advertiseIp必须是客户端能够连通的ip,127.0.0.1仅在服务端和客户端同机情况下才可使用。

查看supernode运行情况

docker ps |grep supernode
# 94feebb4c58b   dragonflyoss/supernode:0.3.1               "/bin/sh -c '/root/s…"   2 hours ago   Up 2 hours                0.0.0.0:8001-8002->8001-8002/tcp   supernode

查看启动日志

# 1、使用docker logs 查看容器日志
docker logs -f supernode

# 2、进入到宿主机的挂载目录查看目录
cd /data/dragonfly/supernode

ls -al
# drwxr-xr-x 2 root root 4096 Apr  2  2019 bin
# drwxr-xr-x 2 root root 4096 Aug  7 01:52 logs
# drwxr-xr-x 4 root root 4096 Aug  7 01:52 repo

2.部署 Dragonfly 客户端(dfclient)

启动Dragonfly 客户端

docker run -d --name dfclient -p 65001:65001 dragonflyoss/dfclient:0.3.1 --registry https://index.docker.io

提示:–registry参数指定镜像仓库地址,https://index.docker.io为官方镜像仓库,您也可以设置为其他仓库地址。

3.修改 Docker Daemon 配置

vi /etc/docker/daemon.json,添加registry-mirrors的value地址为你的地址 "http://192.168.201.7:65001","https://v16stybc.mirror.aliyuncs.com"为我的阿里云加速地址

{
  "registry-mirrors": ["http://192.168.201.7:65001","https://v16stybc.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "insecure-registries":["192.168.201.6:81","192.168.201.7:81"]
}

重启docker

systemctl restart docker

4.拉取镜像测试

通过以上步骤我们即完成了 Dragonfly 服务端与客户端的部署,并且设置了 Docker Daemon 通过 Dragonfly 来拉取官方镜像。
您可以如平时一样来拉取镜像,例如:

docker pull hello-word:latest

5.验证

您可以通过执行以下命令,检验hello-word镜像是否通过 Dragonfly 来传输完成。

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

如果以上命令有如下输出日志,则说明镜像下载通过 Dragonfly 来完成的

2020-08-07 07:02:59.377 INFO sign:31-1596783778.902 : downloading piece:{"taskID":"e9d9970fcc14e7fd9af90c58721ca6ea6a70c6d1564007ed959a844771751f50","superNode":"172.18.10.55","dstCid":"","range":"","result":502,"status":700,"pieceSize":0,"pieceNum":0}

四.多机部署dragonfly

1.多机部署

多机部署只需要在dragonfly客户端的机器上面设置supernode节点的地址即可,也就是需要添加一个配置文件dfget.yml到/etc/dragonfly目录下面。使用如下命令:

mdkir /etc/dragonfly

cat <<EOD > /etc/dragonfly/dfget.yml
nodes:
    - dfsupernode(这里填写supernode的ip地址,需要客户端可以访问该ip地址)
EOD

2.验证镜像P2P分发

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

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

五.部署在harbor上

注意harbor版本,旧版的可能不支持分布式分发(本文为v2.1.2版本)

dragonfly的安装和使用

[ 本文参考 CSDN:惜鸟 ]

留下评论