0%

docker镜像P2P分发-Dragonfly

简介

在k8s环境下,集群由很多node组成,一般情况下,一个集群会配置一个HA形式的镜像仓库(如Harbor),但是在分发镜像时,是每台node,逐次从镜像仓库拉取,一个1G的image分发给100台主机,会生成100G的网络流量,这些突发的流量对网络会造成一个非常大的压力。 于是,基于P2P的镜像分发方案应运而生。

dragonfly是有阿里巴巴主导开发的一款基于p2p分发镜像的方案. gayhub链接为:https://github.com/dragonflyoss/Dragonfly

架构

基本的架构如下:

架构图

部署

  • 角色分为2种, supernode和dfclient
  • 需要在每台node上配置docker的镜像仓库的镜像地址(registry-mirrors).
  • 端口,默认情况下supernode使用8001和8002, dfclient使用65001, 可根据实际情况修改

supernode部署

可以将master或者harbor主机当成supernode, 启动命令如下(截至2019-11-18,稳定版为0.4.3):

1
docker run -d --name supernode --restart=always -p 8001:8001 -p 8002:8002 -v /home/admin/supernode:/home/admin/supernode dragonflyoss/supernode:0.4.3 --download-port=8001

本测试环境supernode的ip为 “192.168.88.190”

上述命令运行完成后, supernode已经部署完成.

dfclient部署

  • 修改node的docker镜像地址配置:

    增加"registry-mirrors": ["http://127.0.0.1:65001"]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@node01 ~]# cat /etc/docker/daemon.json 
    {
    "registry-mirrors": ["http://127.0.0.1:65001"],
    "insecure-registries": ["127.0.0.1/8"],
    "max-concurrent-downloads": 10,
    "log-driver": "json-file",
    "log-level": "warn",
    "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
    "data-root": "/var/lib/docker"
    }
  • 编写dfclient配置文件(192.168.88.190为supernode的地址),

    1
    2
    3
    4
    5
    mkdir -p /etc/dragonfly/
    cat <<EOF > /etc/dragonfly/dfget.yml
    nodes:
    - 192.168.88.190
    EOF
  • 运行dfclient

    1
    2
    3
    4
    docker run -d --name dfclient --restart=always --net=host \
    -v /etc/dragonfly:/etc/dragonfly \
    -v $HOME/.small-dragonfly:/root/.small-dragonfly \
    dragonflyoss/dfclient:0.4.3 --registry https://index.docker.io

    这里非常建议,一定要将net配置为host, 如果不是host,则注册在supernode上的地址为容器的ip, 其他主机无法直接访问.

    另外需要说明--registry参数,该参数是需要代理的镜像仓库地址, 在企业环境下,改成镜像仓库的地址即可.

测试

上面的操作完成后, 进行测试

部署2台client. 分为c1 和c2

在c1上pull nginx

在c2上pull nginx, 并tailf /root/.small-dragonfly/logs/dfclient.log, 可以看到通过dragonfly从其他node节点上获取image块.

上面日志表明, 该p2p分发环境部署成功.