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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本篇文章则分享在大规模的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进行排错。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
12天前
|
运维 Kubernetes 数据安全/隐私保护
K8S 拉取私有仓库镜像
在Kubernetes中从私有仓库拉取镜像时,需先创建包含认证信息的Secret,然后在Pod或Deployment中引用此Secret。本文通过具体步骤演示了如何创建Secret、更新Kubernetes资源配置文件以引用Secret,并验证了镜像拉取及应用运行的成功。
47 6
|
22天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
56 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
28天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
2月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
194 4
|
2月前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
131 0
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
131 17
|
2月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
795 1