一、概述

最近在研究k8s,有时候会遇到镜像拉取缓慢的问题,尤其是必须在多个主机上复制镜像分发时效率较低,之后查阅资料发现这个dragonfly是通过p2p技术解决镜像传输和分发的问题的,在这里将我的学习过程做一个记录。

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

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

以上文字介绍来源于dragonfly官网,详细介绍可以查阅下面的链接
dragonfly官网地址:https://d7y.io/zh-cn/index.html
dragonfly的github源码地址:https://github.com/dragonflyoss/Dragonfly

二、前提条件

请确保您的机器上已经安装并启动 docker 容器引擎,docker容器引擎的安装可以参考这篇文章
使用阿里云镜像快速安装docker-ce

二、单机部署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运行情况

[root@iZwz9 ~]# docker ps |grep supernode
dc7be20113c9        dragonflyoss/supernode:0.3.0                                                "/bin/sh -c '/root/s…"   5 hours ago         Up 5 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 配置

我们需要修改 Docker Daemon 配置,通过 mirror 方式来使用 Dragonfly 进行镜像的拉取。

如果大量都是私有registry的话,可以在/etc/docker/daemon.json 中配置dfdaemon和加速器,
如果是一半一半的话,可以一个–registry写私有的,一个–registry写公有的,
在配置文件 /etc/docker/daemon.json中添加或更新如下配置项:
(下面数组中的第二个地址是我的阿里云镜像加速地址)

{
  "registry-mirrors": ["http://127.0.0.1:65001", "https://kg6h91ac.mirror.aliyuncs.com"]
}

重启 Docker Daemon

systemctl restart docker

提示:如需进一步了解 /etc/docker/daemon.json,请参考 Docker 文档

步骤 4:拉取镜像

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

您可以如平时一样来拉取镜像,例如:

docker pull nginx:latest

步骤 5:验证

您可以通过执行以下命令,检验 nginx 镜像是否通过 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客户端的机器上面设置supernode节点的地址即可,也就是需要添加一个配置文件dfget.yml/etc/dragonfly目录下面。使用如下命令:

mdkir /etc/dragonfly

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

验证镜像P2P分发

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

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

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

Logo

开源、云原生的融合云平台

更多推荐