简介
在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
5mkdir -p /etc/dragonfly/
cat <<EOF > /etc/dragonfly/dfget.yml
nodes:
- 192.168.88.190
EOF运行dfclient
1
2
3
4docker 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分发环境部署成功.