P2P镜像分发:Harbor+Dragonfly优化k8s集群镜像拉取速度(二)

简介: 本篇文章则分享在大规模的kubernetes集群中,通过Harbor与Dragonfly来优化镜像的拉取速度。

Dragonfly(蜻蜓)简介

项目地址:https://github.com/dragonflyoss/Dragonfly2

官方文档:  https://d7y.io/zh/docs/

         Dragonfly(蜻蜓)是一款开源的基于 P2P 的智能镜像和文件分发工具。它旨在提高大规模文件传输的效率和速率,最大限度地利用网络带宽。在应用分发、缓存分发、日志分发和镜像分发等领域被大规模使用。是由CNCF(云原生计算基金会)作为孵化级项目(阿里)。



1.1 Dragonfly的功能

  • 基于 P2P 的文件分发:通过利用 P2P 技术进行文件传输,它能最大限度地利用每个对等节点(Peer)的带宽资源,以提高下载效率,并节省大量跨机房带宽,尤其是昂贵的跨境带宽。
  • 非侵入式接入:Dragonfly 可无缝支持多种容器用于分发镜像。
  • 主机级别的限速:除了像许多其他下载工具针对当前下载任务的限速之外,Dragonfly 还支持针对整个机器的限速。
  • 高度一致性:Dragonfly 可确保所有下载的文件是一致的,即使用户不进行最终一致性校验。
  • 隔离异常节点:Dragonfly 会自动隔离异常节点来提高下载稳定性。
  • 生态:Harbor 可以基于 Dragonfly 进行镜像分发以及预热。镜像加速项目 Nydus 可以在容器运行时使用 Dragonfly 进行数据分发。

1.2 特性

目前,蜻蜓专注于:

  • 简单:定义明确的面向用户的API(HTTP),对所有容器引擎都是非侵入性的;
  • 高效:种子对等支持,基于P2P的文件分发,节省企业带宽;
  • 智能:主机级限速,主机检测智能流量控制;
  • 安全:阻止传输加密,HTTPS连接支持。

1.3 架构浅析

Dragonfly架构图

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模式。



docker部署Dragonfly

  Dragonfly支持docker-compose、Helm、源码三种安装方式

  因为Harbor是使用docker-compose部署的,所以本处也使用docker-compose部署Dragonfly。

2.1 拉取源码

$ yum install -y git
$ git clone https://github.com/dragonflyoss/Dragonfly2.git -b v2.0.9   #拉取v2.0.9版本的代码
$ cd ./Dragonfly2/deploy/docker-compose/

2.2 修改参数

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

$ cat 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

2.3 执行安装脚本进行安装

$ export IP=192.168.2.19  && echo $IP  #声明环境变量指定当前主机IP
$ ./run.sh

2.4 查看组件服务状态

$ 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

2.5 修改docker配置

$ cat /etc/docker/daemon.json
{
   ...
"registry-mirrors":["http://127.0.0.1:65001"],   #添加该项配置参数
...
}
$ sudo systemctl restart docker      #重启docker

2.6 重启Dragonfly2

$ docker-compose down && docker-compose up -d && docker-compose ps

2.7 验证测试

从dockerhub上拉取一个镜像,然后检验该镜像是否通过 Dragonfly 来传输完成。

$ docker rmi nginx:1.23.3
$ docker pull nginx:1.23.3
$ docker-compose exec dfdaemon grep "peer task done" /var/log/dragonfly/daemon/core.log

输出以下结果则正常:

{
  "level":"info",
  "ts":"2023-06-08 01:55:19.445",
  "caller":"peer/peertask_conductor.go:1330",
  "msg":"peer task done, cost: 37128ms",
  "peer":"192.168.2.19-1-a40c51df-315d-462a-ac4b-f55e9610065b",
  "task":"baaea6a3f961160e86d114571b3dd4d95b2145bc72d27969448da4570b32ae3f",
  "component":"PeerTask",
  "trace":"31814778b12db5a0834f916dc269e442"
}

测试结果


2.8 登录Manager控制台管理界面

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

重新登录:

登录界面主界面


Harbor配置分布式分发

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

填写信息:

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

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
305 1
|
2月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
263 89
|
7月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
309 9
|
7月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
9月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
900 33
|
8月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
9月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
528 19
|
9月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
12月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
9月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
352 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性

热门文章

最新文章

推荐镜像

更多