暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

IT运维大爆炸 2024-07-17
130

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 持有者令牌模式,需要持有者令牌)
选项:选择“启用”
复制

<!--检测失败可查看harbor的服务日志/var/log/harbor/core.log进行排错-->

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
复制

查看

欢迎大家扫码关注:

本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。

文章转载自IT运维大爆炸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论