Kubernetes镜像预热——Dragonfly优化容器镜像分发

1、简介

Dragonfly是一个开源的P2P镜像和文件分发系统,主要用于加速容器镜像和文件的分发。它通过P2P(点对点)传输方式,极大地提高了镜像和文件的分发效率,并减少了带宽消耗和对中心化存储的依赖。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。

在大型容器化环境中,容器镜像的分发是一个关键环节。传统的镜像拉取方式存在速度慢、带宽消耗大等问题,特别是在大规模集群中,镜像拉取延迟会对应用的启动速度和整体性能产生显著影响。为了解决这些问题,可以使用Dragonfly进行镜像预热优化分发。

2、工作原理

镜像预热:在实际使用镜像前,先将镜像从远程仓库拉取到本地缓存,并在P2P网络中分发给其他节点。

P2P传输:在节点之间,通过P2P方式进行镜像块的分发,避免集中拉取带来的网络瓶颈。

分片下载:将大文件或镜像分成多个小块进行并行下载,进一步提高下载速度。

本地缓存:每个节点都会将拉取的镜像块缓存到本地,后续节点可以直接从本地缓存中获取数据,提高数据访问速度。

3、优势

高效的镜像分发:通过P2P方式进行镜像块分发,避免了集中拉取的网络瓶颈,提高镜像拉取速度。

节省带宽:通过节点间的P2P传输,减少对中心仓库的带宽消耗,优化网络资源利用。

快速镜像预热:通过预先将镜像拉取到本地缓存,减少应用启动时的镜像拉取延迟。

高可用性:即使部分节点失效,其他节点仍能通过P2P网络获取数据,保证系统的高可用性。

4、原理

Manager组件:

用户管理:提供RBAC及用户态管理功能;

维护P2P 集群关系:Manager管理整个P2P集群关系,保证Seed Peer集群和Scheduler集群为1:N的关系,并且选择最优Scheduler提供Dfdaemon使用;

异步任务管理:提供统一异步任务管理,支持预热等功能;

监控集群:监控整个P2P集群的运行状态,剔除异常节点;

可视化UI:提供可视化管理界面,方便管理;

scheduler组件:

调度:基于Peer之间的网络、带宽流量等进行调度,组建有向无循环图为当前调度Peer寻找最优父节点;

回源:通过当前Peer下载情况,若异常或无父节点则主动通知Peer回源;

任务状态:维护Peer中下载的任务状态,主动推进其状态变更;

下载任务优化:针对不同的下载任务进行优化处理,分为Tiny、Small、Normal类型;

预热:实现镜像和对象存储的预热,文件同步任务分发;

Seed Peer组件:

Dfdaemon 打开种子对等模式可用作 P2P集群中的回源下载对等点, 这是整个集群中用于下载的根对等方。P2P客户端提供上传和下载功能。当集群内任务首次下载,Scheduler会触发Seed Peer回源。提供主动触发回源能力,可以作为P2P节点中的根节点;

Peer组件:

使用 dfdaemon 部署,基于 C/S 架构,提供命令下载工具, 以及提供任务下载功能的正在运行的守护程序。P2P客户端,提供上传和下载功能;

Dfget:

客户端命令行下载工具,和Daemon之间为C/S模式;

5、部署Dragonfly

拉取源码

Dragonfly支持docker-compose、Helm、源码三种安装方式。因为Harbor是使用docker-compose部署的,参考Kubernetes私有镜像仓库——harbor详解,所以本处也使用docker-compose部署Dragonfly

[root@localhost ~]# yum install -y git
[root@localhost ~]# git clone https://github.com/dragonflyoss/Dragonfly2.git -b v2.0.9 #拉取v2.0.9版本的代码
[root@localhost ~]# cd ./Dragonfly2/deploy/docker-compose/
修改参数

同harbor安装在同一主机上时需要调整redis服务的名称,否则会和Harbor的redis冲突。修改docker-compose.yaml文件的services.redis.container_name参数值

[root@localhost docker-compose]# vim docker-compose.yaml
services:
redis:
image: redis:6-alpine
container_name: redis_dragonfly #需要修改(harbor的为redis)
command: >
–requirepass dragonfly
healthcheck:
test: [“CMD”, “redis-cli”, “-a”, “dragonfly”, “ping”]
interval: 1s
timeout: 2s
retries: 30
ports:
– 6379:6379
执行安装脚本进行安装

[root@localhost docker-compose]# export IP=192.168.58.110 && echo $IP #声明环境变量指定当前主机IP
[root@localhost docker-compose]# ./run.sh
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
manager dragonflyoss/manager:latest “/opt/dragonfly/bin/…” manager 17 hours ago Restarting (1) 29 seconds ago
mysql mariadb:10.6 “docker-entrypoint.s…” mysql 17 hours ago Up 26 seconds (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
peer dragonflyoss/dfdaemon:latest “/opt/dragonfly/bin/…” dfdaemon 17 hours ago Up About an hour (healthy) 0.0.0.0:65000-65002->65000-65002/tcp, :::65000-65002->65000-65002/tcp
redis_dragonfly redis:6-alpine “docker-entrypoint.s…” redis 17 hours ago Up 26 seconds (healthy) 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp
scheduler dragonflyoss/scheduler:latest “/opt/dragonfly/bin/…” scheduler 17 hours ago Restarting (1) 31 seconds ago
seed-peer dragonflyoss/dfdaemon:latest “/opt/dragonfly/bin/…” seed-peer 17 hours ago Restarting (2) 18 seconds ago

查看组件服务状态

[root@localhost docker-compose]# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
manager “/opt/dragonfly/bin/…” manager running (healthy) 0.0.0.0:8080->8080/tcp, 0.0.0.0:65003->65003/tcp
mysql “docker-entrypoint.s…” mysql running (healthy) 0.0.0.0:3306->3306/tcp
peer “/opt/dragonfly/bin/…” dfdaemon running (healthy) 0.0.0.0:65000-65002->65000-65002/tcp
redis-dragonfly “docker-entrypoint.s…” redis running (healthy) 0.0.0.0:6379->6379/tcp
scheduler “/opt/dragonfly/bin/…” scheduler running (healthy) 0.0.0.0:8002->8002/tcp
seed-peer “/opt/dragonfly/bin/…” seed-peer running (healthy) 0.0.0.0:65006-65008->65006-65008/tcp
修改docker配置

[root@localhost docker-compose]# vim /etc/docker/daemon.json
{
“registry-mirrors”:[“http://127.0.0.1:65001”],
“insecure-registries”:[“192.168.58.110:80”]
}

[root@localhost docker-compose]# sudo systemctl restart docker #重启docker
重启Dragonfly2

[root@localhost docker-compose]# docker-compose down && docker-compose up -d && docker-compose ps
登录Manager控制台管理界面

在浏览器输入主机IP和8080端口访问manager控制台,再输入用户和密码:root/dragonfly首次登录

6、Harbor配置分布式分发

登录Harbor UI管理界面,找到【系统管理】-【分布式分发】-【新建实例】

填写信息

供应商(必填):本处选择Dragonfly;
名称(必填):自定义一个名称即可;
端点(必填):http协议与Dragonfly地址及manager组件服务端口;
认证模式:NONE(无需身份验证)、Basic(需要 HTTP 基本身份验证模式、用户名和密码)、OAuth(OAuth 持有者令牌模式,需要持有者令牌)
选项:选择“启用”

7、设置p2p预热

设置规则

上传镜像

[root@localhost harbor]# docker tag flink:1.3.1 192.168.58.110:80/test/flink:1.3.1
[root@localhost harbor]# docker push 192.168.58.110:80/test/flink:1.3.1
The push refers to repository [192.168.58.110:80/test/flink]
fd7f6cebdab9: Pushed
baa68a06cd12: Pushed
d198f1949838: Pushed
b64f094f51d4: Pushed
7895e3aa4d4d: Pushed
5eef1747468c: Pushed
0c3915c55b74: Pushed
80bee1a65ead: Pushed
0583af55a445: Pushed
1ae7b18f5354: Pushed
d69122875478: Pushed
32ceb20ee08e: Pushed
d1de89c613d4: Pushed
71ce2dc7f761: Pushed
0d960f1d4fba: Pushed
1.3.1: digest: sha256:71389e89b4217b286f74c7a2e0d1ecfa3767c9700c6913ea88ccd9b90ef67ddd size: 3459
查看

声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/418918.html

(0)
联系我们
联系我们
分享本页
返回顶部