Dragonfly 和 Nydus Mirror 模式集成实践

news2024/11/24 17:09:58

图片

文|戚文博 (花名:百蓦)

Dragonfly Maintainer蚂蚁集团软件工程师

图片

主要负责「基于 P2P 的文件以及镜像加速系统」。

本文 2175 字 阅读 15 分钟

PART. 1 背景

自 17 年开源以来,Dragonfly 被许多大规模互联网公司选用并投入生产使用,并在 18 年 10 月正式进入 CNCF,成为中国第三个进入 CNCF 沙箱级别的项目。2020 年 4 月,CNCF 技术监督委员会 (TOC) 投票决定接受 Dragonfly 作为孵化级别的托管项目。Dragonfly 多年生产实践经验打磨的下一代产品,它汲取了上一代 Dragonfly1.x[1] 的优点并针对已知问题做了大量的优化。

Nydus 作为 Dragonfly 的子项目优化了 OCIv1 镜像格式,并以此设计了一个用户态文件系统,使容器可以按需下载镜像,不再需要下载完整镜像即可启动容器。在最新版本中 Dragonfly 完成了和子项目 Nydus 的集成,让容器启动即可以按需下载镜像,减少下载量。也可以在传输过程中利用 Dragonfly P2P 的传输方式,降低回源流量并且提升下载速度。

PART. 2 实践

图片

注:如果没有可用的 Kubernetes 集群进行测试,推荐使用 Kind[2]。

安装 Dragonfly

基于 Kubernetes cluster 详细安装文档可以参考:

https://d7y.io/docs/next/getting-started/quick-start/kubernetes/

使用 Kind 安装 Kubernetes 集群

创建 Kind 多节点集群配置文件  kind-config.yaml ,配置如下:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker    
extraPortMappings:
- containerPort: 30950 
hostPort: 65001  
- role: worker

使用配置文件创建 Kind 集群:

kind create cluster --config kind-config.yaml

切换 Kubectl 的 context 到 Kind 集群:

kubectl config use-context kind-kind

Kind 加载 Dragonfly 镜像

下载 Dragonfly latest 镜像:

docker pull dragonflyoss/scheduler:latest
docker pull dragonflyoss/manager:latest
docker pull dragonflyoss/dfdaemon:latest

Kind 集群加载 Dragonfly latest 镜像:

kind load docker-image dragonflyoss/scheduler:latest
kind load docker-image dragonflyoss/manager:latest
kind load docker-image dragonflyoss/dfdaemon:latest

基于 Helm Charts

创建 Dragonfly P2P 集群

创建 Helm Charts 配置文件 charts-config.yaml 并且开启 Peer 的预取功能, 配置如下:

scheduler:  
replicas: 1  
metrics:    
enable: true  
config: 
verbose: true    
pprofPort: 18066
seedPeer:  replicas: 1  
metrics:    
enable: true  
config:    
verbose: true    
pprofPort: 18066    
download:      
prefetch: true
dfdaemon:  
hostNetwork: true  
config:    
verbose: true    
pprofPort: 18066   
metrics: :8000    
download:    
prefetch: true   
proxy:      
defaultFilter: 'Expires&Signature&ns'    
security:     
insecure: true     
tcpListen:      
listen: 0.0.0.0   
port: 65001   
registryMirror:   
dynamic: true    
url: https://index.docker.io   
proxies:    
- regx: blobs/sha256.*
manager: 
replicas: 1 
metrics:   
enable: true 
config:   
verbose: true  
pprofPort: 18066

使用配置文件部署 Dragonfly Helm Charts:

$ helm repo add dragonfly 
https://dragonflyoss.github.io/helm-charts/$ helm install --wait --create-namespace --namespace dragonfly-system dragonfly 
dragonfly/dragonfly 
-f
charts-config.yamlNAME: dragonflyLAST
DEPLOYED: Wed Oct 19 04:23:22
2022NAMESPACE: dragonfly-system
STATUS: deployedREVISION: 1TEST 
SUITE: None
NOTES:

1. Get the scheduler address by running these commands:  export SCHEDULER_POD_NAME=$(kubectl get pods --namespace dragonfly-system -l
"app=dragonfly,release=dragonfly,component=scheduler" -o jsonpath={.items[0].metadata.name})  export SCHEDULER_CONTAINER_PORT=$(kubectl
get pod --namespace dragonfly-system $SCHEDULER_POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
kubectl --namespace dragonfly-system port-forward $SCHEDULER_POD_NAME 8002:$SCHEDULER_CONTAINER_PORT  echo "Visit http://127.0.0.1:8002 to use your scheduler"

2. Get the dfdaemon port by running these commands:  export DFDAEMON_POD_NAME=$(kubectl get pods
--namespace dragonfly-system -l
"app=dragonfly,release=dragonfly,component=dfdaemon" -o jsonpath={.items[0].metadata.name})  export DFDAEMON_CONTAINER_PORT=$
(kubectl get pod --namespace dragonfly-system $DFDAEMON_POD_NAME -o jsonpath="{
.spec.containers[0].ports[0].containerPort}")  You can use $DFDAEMON_CONTAINER_PORT as a proxy port in Node.

3. Configure runtime to use dragonfly:  https://d7y.io/docs/getting-started/quick-start/kubernetes/

检查 Dragonfly 是否部署成功:

$ kubectl get po -n dragonfly-systemNAME 
READY   STATUS    RESTARTS 
AGEdragonfly-dfdaemon-rhnr6 
1/1     Running   4 (101s ago)   3m27sdragonfly-dfdaemon-s6sv5  
1/1     Running   5 (111s ago)   3m27sdragonfly-manager-67f97d7986-8dgn8
1/1     Running   0              3m27sdragonfly-mysql-0             
1/1     Running   0              3m27sdragonfly-redis-master-0    
1/1     Running   0              3m27sdragonfly-redis-replicas-0      
1/1     Running   1 (115s ago)   3m27sdragonfly-redis-replicas-1      
1/1     Running   0              95sdragonfly-redis-replicas-2    
1/1     Running   0              70sdragonfly-scheduler-0        
1/1     Running   0              3m27sdragonfly-seed-peer-0          
1/1     Running   2 (95s ago)    3m27s

创建 Peer Service 配置文件 peer-service-config.yaml 配置如下:

apiVersion: v1
kind: Servicemeta
data:  name: peer  
namespace:
dragonfly-systemspec: 
type: NodePort  ports:    
- name: http    
nodePort: 30950      
port: 65001  
selector:  
app: dragonfly    
component: dfdaemon  
release: dragonfly

使用配置文件部署 Peer Service:

kubectl apply -f peer-service-config.yaml

Containerd 集成 Nydus

生产环境 Containerd 集成 Nydus 详细文档可以参考:

https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md#nydus-setup-for-containerd-environment

下面例子使用 Systemd 管理 nydus-snapshotter 服务。

下载安装 Nydus 工具

下载 containerd-nydus-grpc 二进制文件, 下载地址为:

https://github.com/containerd/nydus-snapshotter/releases/latest 。

NYDUS_SNAPSHOTTER_VERSION=0.3.0w
get 
https://github.com/containerd/nydus-snapshotter/releases/download/v$NYDUS_SNAPSHOTTER_VERSION/nydus-snapshotter-v$NYDUS_SNAPSHOTTER_VERSION-x86_64.tgztar zxvf nydus-snapshotter-v$NYDUS_SNAPSHOTTER_VERSION-x86_64.tgz

安装 containerd-nydus-grpc 工具:

sudo cp nydus-snapshotter/containerd-nydus-grpc /usr/local/bin/

下载 nydus-imagenydusd 以及 nydusify 二进制文件, 下载地址为

https://github.com/dragonflyoss/image-service/releases/latest :

NYDUS_VERSION=2.1.0wget 
https://github.com/dragonflyoss/image-service/releases/download/v$NYDUS_VERSION/nydus-static-v
$NYDUS_VERSION-linux-amd64.tgztar zxvf nydus-static-v
$NYDUS_VERSION-linux-amd64.tgz

安装 nydus-imagenydusd 以及 nydusify 工具:

sudo cp nydus-static/nydus-image nydus-static/nydusd nydus-static/nydusify /usr/local/bin/

Containerd 集成

Nydus Snapshotter 插件

配置 Containerd 使用 nydus-snapshotter 插件, 详细文档参考:

https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md#configure-and-start-containerd

首先修改 Containerd 配置在 /etc/containerd/config.toml 添加下面内容:

[proxy_plugins] 
[proxy_plugins.nydus]  
type = "snapshot"   
address = "/run/containerd-nydus/containerd-nydus-grpc.sock"
[plugins.cri] 
[plugins.cri.containerd]   
snapshotter = "nydus"  
disable_snapshot_annotations = false

重启 Containerd 服务:

sudo systemctl restart containerd

验证 Containerd 是否使用 nydus-snapshotter 插件:

$ ctr -a /run/containerd/containerd.sock plugin ls | grep nydusio.containerd.snapshotter.v1          nydus                    -              ok

Systemd 启动

Nydus Snapshotter 服务

Nydusd 的 Mirror 模式配置详细文档可以参考:

https://github.com/dragonflyoss/image-service/blob/master/docs/nydusd.md#enable-mirrors-for-storage-backend

创建 Nydusd 配置文件 nydusd-config.json,配置如下:

{  "device": {    "backend": {      "type": "registry",      "config": {        "mirrors": [          {            "host": "http://127.0.0.1:65001",            "auth_through": false,            "headers": {              "X-Dragonfly-Registry": "https://index.docker.io"            }          }        ],        "scheme": "https",        "skip_verify": false,        "timeout": 10,        "connect_timeout": 10,        "retry_limit": 2      }    },    "cache": {      "type": "blobcache",      "config": {        "work_dir": "/var/lib/nydus/cache/"      }    }  },  "mode": "direct",  "digest_validate": false,  "iostats_files": false,  "enable_xattr": true,  "fs_prefetch": {    "enable": true,    "threads_count": 10,    "merging_size": 131072,    "bandwidth_rate": 1048576  }}

复制配置文件至

/etc/nydus/config.json 文件:

sudo mkdir /etc/nydus && cp nydusd-config.json /etc/nydus/config.json

创建 Nydus Snapshotter Systemd 配置文件 nydus-snapshotter.service , 配置如下:

[Unit]Description=nydus snapshotterAfter=network.targetBefore=containerd.service
[Service]Type=simpleEnvironment=HOME=/rootExecStart=/usr/local/bin/containerd-nydus-grpc --config-path /etc/nydus/config.jsonRestart=alwaysRestartSec=1KillMode=processOOMScoreAdjust=-999StandardOutput=journalStandardError=journal
[Install]WantedBy=multi-user.target

复制配置文件至

/etc/systemd/system/ 目录:

sudo cp nydus-snapshotter.service /etc/systemd/system/

Systemd 启动 Nydus Snapshotter 服务:

$ sudo systemctl enable nydus-snapshotter$ sudo systemctl start nydus-snapshotter$ sudo systemctl status nydus-snapshotter● nydus-snapshotter.service - nydus snapshotter     Loaded: loaded (/etc/systemd/system/nydus-snapshotter.service; enabled; vendor preset: enabled)     Active: active (running) since Wed 2022-10-19 08:01:00 UTC; 2s ago   Main PID: 2853636 (containerd-nydu)      Tasks: 9 (limit: 37574)     Memory: 4.6M        CPU: 20ms     CGroup: /system.slice/nydus-snapshotter.service             └─2853636 /usr/local/bin/containerd-nydus-grpc --config-path /etc/nydus/config.json
Oct 19 08:01:00 kvm-gaius-0 systemd[1]: Started nydus snapshotter.Oct 19 08:01:00 kvm-gaius-0 containerd-nydus-grpc[2853636]: time="2022-10-19T08:01:00.493700269Z" level=info msg="gc goroutine start..."Oct 19 08:01:00 kvm-gaius-0 containerd-nydus-grpc[2853636]: time="2022-10-19T08:01:00.493947264Z" level=info msg="found 0 daemons running"

转换 Nydus 格式镜像

转换 python:latest 镜像为 Nydus 格式镜像, 可以直接使用已经转换好的

dragonflyoss/python-nydus:latest 镜像, 跳过该步骤。转换工具可以使用Nydusify[3] 也可以使用 acceld[4]。

登陆 Dockerhub

转换 Nydus 镜像,

DOCKERHUB_REPO_NAME 环境变量设置为用户个人的镜像仓库:

DOCKERHUB_REPO_NAME=dragonflyosssudo nydusify convert --nydus-image /usr/local/bin/nydus-image --source python:latest --target $DOCKERHUB_REPO_NAME/python-nydus:latest

Nerdctl 运行 Nydus 镜像

使用 Nerdctl 运行 python-nydus:latest , 过程中即通过 Nydus 和 Dragonfly 下载镜像:

sudo nerdctl --snapshotter nydus run --rm -it $DOCKERHUB_REPO_NAME/python-nydus:latest

搜索日志验证 Nydus 基于 Mirror 模式通过 Dragonfly 分发流量:

$ grep mirrors /var/lib/containerd-nydus/logs/**/*log[2022-10-19 10:16:13.276548 +00:00] INFO [storage/src/backend/connection.rs:271] backend config: ConnectionConfig { proxy: ProxyConfig { url: "", ping_url: "", fallback: false, check_interval: 5, use_http: false }, mirrors: [MirrorConfig { host: "http://127.0.0.1:65001", headers: {"X-Dragonfly-Registry": "https://index.docker.io"}, auth_through: false }], skip_verify: false, timeout: 10, connect_timeout: 10, retry_limit: 2 }

PART. 3

性能测试

测试 Nydus Mirror 模式与 Dragonfly P2P 集成后的单机镜像下载的性能。测试是在同一台机器上面做不同场景的测试。由于机器本身网络环境、配置等影响,实际下载时间不具有参考价值,但是不同场景下载时间所提升的比率是有重要意义的。

图片

OCIv1: 使用 Containerd 直接拉取镜像并且启动成功的数据。

Nydus Cold Boot: 使用 Containerd 通过 Nydus 拉取镜像,没有命中任何缓存并且启动成功的数据。

Nydus & Dragonfly Cold Boot: 使用 Containerd 通过 Nydus 拉取镜像,并且基于 Nydus Mirror 模式流量转发至 Dragonfly P2P,在没有命中任何缓存并且启动成功的数据。

Hit Dragonfly Remote Peer Cache: 使用 Containerd 通过 Nydus 拉取镜像,并且基于 Nydus Mirror 模式流量转发至 Dragonfly P2P,在命中 Dragonfly 的远端 Peer 缓存的情况下并且成功启动的数据。

Hit Dragonfly Local Peer Cache: 使用 Containerd 通过 Nydus 拉取镜像,并且基于 Nydus Mirror 模式流量转发至 Dragonfly P2P,在命中 Dragonfly 的本地 Peer 缓存的情况下并且成功启动的数据。

Hit Nydus Cache: 使用 Containerd 通过 Nydus 拉取镜像,并且基于 Nydus Mirror 模式流量转发至 Dragonfly P2P,在命中 Nydus 的本地缓存的情况下并且成功启动的数据。

测试结果表明 Nydus Mirror 模式和 Dragonfly P2P 集成。使用 Nydus 下载镜像对比OCIv1的模式,能够有效减少镜像下载时间。Nydus 冷启动和 Nydus & Dragonfly 冷启动数据基本接近。

其他命中 Dragonfly Cache 的结果均好于只使用 Nydus 的情况。最重要的是如果很大规模集群使用 Nydus 拉取镜像,会将每个镜像层的下载分解按需产生很多 Range 请求。增加镜像仓库源站 QPS 。

而 Dragonfly 可以基于 P2P 技术有效减少回源镜像仓库的请求数量和下载流量。最优的情况,Dragonfly 可以保证大规模集群中每个下载任务只回源一次。

|相关链接|

[1]Dragonfly1.x:https://github.com/dragonflyoss/Dragonfly
[2]Kind:https://kind.sigs.k8s.io/
[3]Nydusify:https://github.com/dragonflyoss/image-service/blob/master/docs/nydusify.md
[4]Acceld:https://github.com/goharbor/acceleration-service

|社区相关网址|

Dragonfly 社区官网网站:

https://d7y.io/

Github 仓库:

https://github.com/dragonflyoss/Dragonfly2

Slack Channel:

#dragonflyonCNCF Slack

Discussion Group:

dragonfly-discuss@googlegroups.com

Twitter: @dragonfly_oss

Nydus 社区官方网站:

https://nydus.dev/

Github 库:

https://github.com/dragonflyoss/image-service

Slack Channel:   #nydus

点击原文,了解更多…

Dragonfly Star 一下✨:

https://github.com/dragonflyoss/Dragonfly2

** 本周推荐阅读**

Dragonfly 基于 P2P 的文件和镜像分发系统

Dragonfly 中 P2P 传输协议优化

Nydus | 容器镜像基础

Nydus —— 下一代容器镜像的探索实践

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++贪吃蛇游戏开发实践

C贪吃蛇游戏开发实践 对象分析 我们首先需要确定一个像素点组成的地图(画布),要确定行数、列数和像素点大小。这个地图上将会有两个对象:蛇和食物。 蛇由头和身子组成,他们都有自己的位置,所以考虑使用位置…

移动端测试必备技能: adb命令和抓包

移动端测试 是指对移动应用进行的测试,即实体的特性满足需求的程度,进行测试前需要搭建测试环境。 1 移动端自动化环境搭建 1.1 java安装 java JDK 安装jdk-8u181-windows-x64.exe 配置环境变量: JAVA_HOME:D:\developer to…

基于C#+SqlServer开发(WinForm)学生宿舍管理系统【100010056】

学生宿舍管理系统 一、前言 学生宿合是学生们最为熟悉的领域,假定学校有若干栋宿会楼,每栋宿合楼有若干层,每层有若干个寝室,每个寝室可住若干个学生。以往的手工操作已经不能适应现在办公的需要.为了摆脱繁琐的劳动,提高工作效…

HTML XHTML HTML5区别

文章目录HTML & XHTML & HTML5区别HTMLXHTMLHTML5区别HTML & XHTML & HTML5区别 HTML HTML,全称“HyperText Mark-up Language(超文本标记语言)”,它是构成网页文档的主要语言。我们常说的HTML,指的…

金融服务机构提高移动应用程序安全性的 3 种方式

金融移动应用程序的使用正在迅速加速, 2020 年用户会话数量增长了 49% 。VMware报告称,金融应用程序的网络攻击在同年也增长了 118%。 Intertrust的另一份报告显示,77% 的金融服务应用程序至少包含一个可能导致数据泄露的安全漏洞。最近发现…

【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

VMwareLinux详细安装步骤

一、VmWare虚拟机的安装 目录 一、VmWare虚拟机的安装 1、安装虚拟机 二、在虚拟机上安装CentOS 1、创建新虚拟机 2、选择典型→ 下一步 3、选择稍后安装操作系统 4、选择操作系统和版本 5、输入虚拟机名称和安装路径 6、设置磁盘大小 7、选择CentOS安装镜像文件 8、…

射线检测中的像质计

像质计,透度计 Image Quality Indicators,Penetrameters 分类:线型像质计、阶梯孔型像质计、平板孔型像质计、双丝型像质计。 前三种像质计的作用:测定检测图像的厚度(密度)对比度; 后一种像质…

数论专题(1)数论函数,整数分块

从今天起,我们将要开始数论的学习,是不是感觉很难?难的话就听我讲吧,讲了后就不难了(bushi) 数论函数定义 (数论函数) 数论函数的定义:在全体正整数(或者整数)上定义的函数称作数论函数。 积性的定义:若 gcd(a,b)1,则f(ab)f(a)f(b)。举个栗…

适合制造业的ERP系统有哪些? 制造业的ERP对企业有什么作用?

在当前的激烈的市场竞争下,制造企业如果想要长期稳定地发展,除了需要把外部因素做好把控,还需要提升企业自身的管理水平,来提高自己的竞争力,而信息化是企业发展的必经之路。 适合制造业的ERP系统在企业管理中起到了至…

《Science》教你如何写好一篇博士毕业论文!

博士生涯的完美结束少不了一篇优秀的毕业论文。但是说起来容易,写起来有时让人痛不欲生。不仅内容多,还需要用严谨的逻辑把章节联系起来,常常耗时耗力。而且博士论文要的不仅仅是学术工作的质量,如何将这些工作合理、完整地呈现也…

基于Java实现(PC)大学班级事务管理系统【100010059】

大学班级事务管理系统 要求 本次设计要求利用 Java 实现 C/S 模式的大学班级内日常事务管理系统(PC 版,应用于校内网有线网络访问,暂不开发移动端),不得依赖现有的建模框架,使用 swings 技术完成如下基本…

IP地址分类及范围详解

IP地址分为公网IP地址(合法IP地址)和私有IP地址 公网IP地址主要应用于Internet上的主机访问,而私有IP地址应用于局域网中计算机的相互通信。 IP地址的表示形式:分为二进制表示和点分十进制表示。现在使用的IP地址长度均为32位/4个…

阿里云oss访问图片出现跨域问题

需要服务器端支持,开一下cdn Access-Control-Allow-Origin字段是服务端添加了才有的,前端加了crossOrigin"anonymous"是想跨域获取这张图片,好用在canvas.toDataURL()上,但是服务端不一定同意,服务端添加了…

开始摸索学习go,具体内容和过程就慢慢补充吧。

计划学习路线 文章目录计划学习路线书籍开源项目资料网站课程书籍 《go语言核心编程》 -腾讯作者 《go语言编程之旅》 -5个项目 --对go语言能做的内容做了整体介绍吧,对细节还不够细化,对独立编写代码帮助有限 第二章 swaage 有版本冲突,等…

37.卷积神经网络(LeNet)的代码实现(在colab上)

ps:在教材上直接打开colab,运行原来的代码!pip install githttps://github.com/d2l-ai/d2l-zhrelease # installing d2l是会报错的,改成这句代码,可以正确运行:!pip install d2l0.14.,直接制定了d2l的版本 …

利用Bat打开exe程序并传入值

目录 一、分清楚exe接收值的方式 1、打开exe时提示输入1、2、3... 2、知道exe形参(程序主函数中定义的argv[]) 二、call和start的区别 一、分清楚exe接收值的方式 1、打开exe时提示输入1、2、3... 如图: 这种是程序运行时接收用户输入…

SuperMap GIS 三维硬件设置优化

目录一、简介二、查看硬件显卡三、显卡设置1、NVIDA显卡设置2、AMD显卡设置一、简介 我们都知道为了体验更好的大型3D游戏,那么好的显卡是必不可少的。但是有了好的显卡当配置不对时,此时体验感也会大打折扣。同样的道理,在SuperMap中也需要…

Redis原理篇—通信协议

Redis原理篇—通信协议 笔记整理自 b站_黑马程序员Redis入门到实战教程 RESP协议 Redis 是一个 CS 架构的软件,通信一般分两步(不包括 pipeline 和 PubSub): 客户端(client)向服务端(server&a…

VMC证书是什么?获取认证标志证书步骤是怎样的?

VMC证书是什么? VMC证书(全称:Verified Mark Certificate),也称认证标志证书,是由权威CA机构颁发,用于验证商标所有权的数字证书。 VMC 通过提供验证机制与 BIMI 协同工作,BIMI标准可以在电子邮件中的“发…