阿里巴巴开源 容器镜像加速技术DADI 上手指南

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 阿里资深技术专家在阿里云开发者社区特别栏目《周二开源日》直播中,介绍刚于3月份开源的容器镜像加速器项目 DADI ,并带大家快速上手使用。本文为直播内容文字整理,看直播回放,请点击文首链接~

查看精彩回放:https://developer.aliyun.com/live/246639


讲师:

讲解:李慧霸(鲁七)

演示:刘兰峥(南针)

 

内容简要:

一、DADI项目简介

二、容器 image 问题分析

三、DADI方案阐述

四、开源版本现状与未来计划

五、视频演示

 

 

一、DADI项目简介

DADIData Accelerator for Disaggregated Infrastructure的首字母缩写。这个项目关注的是存储和应用之间的加速层


我们知道做云计算的都可以看作是Data Center as a Computer,传统的Computer是有Cache, CPU和内存之间以及内存和磁盘之间都有CacheCache在性能方面扮演了举足轻重的角色。


到了云计算场景,我们认为也还是需要Cache,所以DADI就是做应用和存储系统之间的加速层。但是在分布式环境,云计算场景下加速技术并不只有Cache,可能会有更多可能性,比如说像p2p传输等。


本次介绍的是 DADI 在容器快速部署场景的应用。

1.png

 

 

二、容器 image 问题分析

DADI image加速技术已经支持阿里所有自营业务的秒级扩容,是大促必备的产品,并且已经集成进入了公共云多项容器服务以及容器衍生品服务中。


同时我们还在顶级的学术会议USENIX ATC20发表了文章,有兴趣的朋友们可以通过右上方的二维码进入论文的主页:

https://www.usenix.org/conference/atc20/presentation/ li-huiba

 

Background: Layered Image of Container

容器image都是需要先从registry下载并且解压解包,放到本地硬盘上之后才能使用。容器的image由多个层次组成,每一层包含相对于之前状态的变更集,也就是增加删除或者修改的文件,这些层合并起来成为一个image image是只读共享的,每个容器自身还包含一个可写的容器层,这个容器层也包含的是增加或者删除或者修改的文件,这些容器层之间都是私有的,互相不共享,所有的层次通常使用overlayfs进行合并,供容器内部使用。

1.png

 

Similar to Map Layers

这些容器的层其实和地图的图层或photoshop图层都非常相似。

 

1.png

 

The Problem

1.  问题在于容器的部署或冷启动非常缓慢,我们需要事先下载和解压image,过程通常可以达到几十秒钟甚至几十分钟。


有研究指出,日志里只有平均6.4%的数据是真正使用到的,其余90%多的数据都是垃圾。这样一个模式其实让我们回退到了至少10年以前,那个时候虚拟机的镜像也是需要下载到各个宿主机然后再使用。


2.  业内有很多解决这个问题的方法,比如说通过p2p的下载方式来加速下载过程,但这样是不够的。它只是解决了在大规模情况下的下载速度问题。

对于小规模情况,或者说对于容器 image的解压缩都是没有帮助的


3.也有一些工作试图精简image,但是精简工作其实并不能很通用,也并不能很自动,有不少的应用有动态的加载文件的需求,同时精简过的image也很难支持用户的一些临时性的操作需求。

 

Remote Image

当前image加速技术的主流方向是Remote Imageimage放在远程,可能在registry上或者别的什么地方,并不需要把它完整下载下来就可以直接开始使用。社区已经有一些方面的工作,比如说CRFS, Teleport, CernVM-FS等。对于大规模集群还需要配合p2p数据传输技术才能解决全部的问题。


然而如今image采用了tarball格式,这个格式不支持 remote image,因为它的设计是针对完整解压缩,不支持我们随机的seek到一个位置读取那个位置的数据,同时tarball格式很难支持高级功能,比如说扩展属性,跨层的数据引用等,所以最好还是重新设计一个新的文件格式。

 

Type of Image: Block!

摆在我们面前有两种选择,一个是基于文件系统的image,就像现代容器image,同时还有一种选择是用块设备作为image,就像虚拟机的image一直以来的样子。我们对这两种方式做了比较详细的比较,比较集中在三个方面,一个是复杂度,再一个是通用性,最后是安全性。


我们认为在这三个方面,基于块设备的image都有非常显著的优势,这个优势最根本上是源于块设备的image它比较简单但并不简陋。我们唯一需要做的是让块设备支持分层的特性,相比之下基于文件系统的image,在这些技术方面没有太多显著的优势,可能还会有一些不足。比如说性能会偏低,高级特性会比较缺失等。

1.png

 

三、DADI方案阐述

DADI Remote Image

基于这样的分析,我们义无反顾选择了基于块设备的image格式,第一个contribution是设计了基于块设备的分层镜像格式,我们把它称之为Overlay Block Device。它需要配合常规文件系统比如ext4一起使用给用户提供文件访问服务。


第二个contribution是设计了可支持随机访问的压缩文件格式叫ZFile,因为容器镜像普遍是压缩存储,我们不能在这方面留下短板。第三个contribution是我们设计了基于p2p的按需传输技术,以应对大规模和超大规模集群的需求。

1.png

 

DADI I/O Path

单机内的I/O路径如下,首先应用在容器中,读取文件的请求会传递到位于内核的常规文件系统当中,比如ext4,文件系统会把读请求转发给一个虚拟块设备,这个虚拟块设备使用的是TCMU框架实现,内核的虚拟块设备会把请求转发给用户态的服务进程OverlayBD


OverlayBD会通过查询内存中的索引,把读请求分解为对具体layer的读取,如果被读取的layer已经下载到本地,那么就直接在本地文件系统上来读取layer。如果layer是新发布的,还没有下载到本地,那么就通过 rpc到远程去访问。

 

Overlay Block Device

DADI image 格式当中,每一个layer就是一个被修改的数据块的集合,在这个层面上没有文件或者文件系统的概念,我们每个修改的粒度最小是512字节,和我们常规的块设备是一致的。同时OverlayBD会维护一个内存索引来实现快速的读取,索引具有变长和区间查询的特性,非常高效,它的原理可以用下图来表示。

1.png

在加载image的时候,我们可以一次性的把 image里所有layer的索引进行合并,合并后一次查询就能处理任意数量的layer,使得overlayBD的性能不随layer的增加而下降,只跟合并过后的索引记录数量有关。

 

Index Merge

我们统计了生产环境当中大量image的索引合并过后的元素数量,结果如下图所示,元素数量最多不超过4.5k, 换算到内存占用不超过100k,我们也测试了单核CPU下能够提供的处理能力,结果如图所示,每秒几百万次的QPS还是非常充足的。

1.png

1.png

ZFile

ZFile是支持随机读取的压缩文件格式,它的原理也很简单,把文件按照固定的数据块大小一块一块地进行压缩,每次读取的时候只解压缩需要的数据块,不需要的数据块不解压缩。同时ZFile格式并不是仅局限于DADI,它是非常通用的支持随机访问的文件格式。

1.png 

 

Performance

Wordpress Startup with DADI

最后我们来看一下性能,我们最关注的是冷启动耗时,所以我们最先来测试这一项指标,我们选取了GitHub上的Wordpress镜像,Wordpress是一个非常流行的CMS系统,它号称支撑了整个外部世界1/3的网站,所以选用Wordpress具有一定代表性。


结果当中的第一列是普通格式的Wordpress镜像,我们测试环境当中的Image PullApp Launch两个步骤的耗时,总计有10多秒钟。


第二列测试的是CRFS的相对早期的版本,它的耗时竟然比下载解压方式更慢一些。


第三列是模仿学术界的Slacker工作,就是把image解压缩之后放到NFS服务器上,然后从NFS服务器启动容器,它的耗时显著比下载解压的模式要更快一些,只有不到4秒钟时间。


最后两列是DADI方案的两种情况,一个是从Registry的下载数据,另一个是从共享的存储服务器下载数据,可以看出,DADI的效果要比其他方案好很多。

1.png

性能测试,我们分别用dutar来对image进行扫描, du读取所有文件的元信息,而tar是读取所有文件的数据,他们分别侧重随机小块读和顺序大块读的两种不同的workload


I/O性能测试结果来看,DADI也具有显着的优势,特别是在使用云盘的场景下,因为DADI采用的压缩格式突破了云盘的带宽限制,所以取得了更好的效果。

1.png

 

四、开源版本现状与未来计划

Open Soure Edition

最后再介绍一下开源版本的状况,整个项目在GitHub上分成了两个repo,其中一个主要跟容器世界打交道实现了snapshotter,另一个就是overlaybd,这两项工作均可以通过右方的链接或者二维码进行访问。

1.png

目前开源的工作当中也包含了镜像格式转换工具,可以把已有的tgz格式转换成DADI格式,我们目前正在做并且近期还会开源的工作包括这么几项:


1.bulidkit


2.基于trace的数据预取,可以进一步提高冷启动速度,尤其是高延迟、高带宽的场景中。


3.支持ext4之外的文件系统,有些linux发行版已经默认使用xfs,提供更多高级功能,性能也更好,支持多种文件系统有利于提高overlaybd的竞争力。


4.overlaybd 内核模块,image下载到本地后可以通过内核模块启动,这样I/O路径就不用经过用户态再次转发。


5.可供应用使用的可写层。可以摆脱overlayfs的依赖,可以提高性能。

 

 

五、视频演示

演示从DADI Overlaybd格式远程镜像来启动容器的过程。

1.png

首先需要完整安装Overlaybd的运行环境。


Overlaybd有两个必须的依赖,一个是target_core_user,这是tcmu的内核模块。第二个依赖是containerd,而且必须是1.4以上的版本。Containerd1.4版本后支持远程镜像拉取,在Image pull的时候,可以不下载全部镜像数据而只是注册镜像,早期的Containerd并没有这个特性。

1.png

Overlaybd有两个组件事先必须将它们运行起来,分别是overlaybd-snapshotteroverlaybd-tcmu组件。

1.png

首先启动Overlaybd snapshotter,可以直接作为二进制程序运行。


需要说明的是如果是首次使用,必须要修改Containerd的配置,把Overlaybd snapshotter作为一个plugin添加进去。

1.png

然后启动Overlaybd-tcmu组件,这是OverlaybdBacking Store,也可以作为二进制来运行。启动之后,它后续日志将存放在var/log路径下,需要说明的是我们建议通过服务来管理这两个组件,这样即使出现意外也可以重新拉起,Overlaybd本身也支持故障恢复。


下面看一下本次测试的配置文件。

1.png

上方是Overlaybd-tcmu的配置文件,首先配置一个4GB大小的本地缓存,路径为opt/overlaybd/register_catch,远程镜像数据加载后会存放到本地缓存,这样再次请求相同数据时,可以直接从本地缓存获取,不需要再次通过网络拉取,测试前我们已经清空了本地缓存。


credentialFilePath是鉴权信息的存放路径,Overlaybd的鉴权文件需要单独配置。虽然在拉取镜像还在Containerd时已经传入了用户名密码,但是远程拉取的是另一条鉴权路径,跟Containerd是分开的。如果你的镜像是私有的,需要事先配置好鉴权文件。


download是后台下载的配置,我们这次测试将这个功能关闭,如果开启了这个功能,那么在镜像启动后,会在后台自动将镜像数据完整下载到本地。下载完成后,该镜像变成一个纯本地镜像,再次启动时,即使断网也不会受任何影响。

1.png

本次测试环境使用的是ACR企业版-ACREE,宿主机使用的是一台ECS,部署在杭州机房,它们之间的网络是公网。

1.png

本次测试使用的镜像是wordpress镜像,我们事先将一个已经转换为Overlaybd格式的wordpress存放到Registry中。

1.png

如上图所示,我们看一下测试的脚本。


测试脚本首先执行一个rpull指令拉取镜像。CtrContainerd的一个调试工具,它很多功能其实是没有的,例如Containerd支持远程镜像拉取所需要的这些标签,Ctr本身是没有的,所以我们在Ctr中扩展了一个新的指令rpull,它可以帮助我们将所需要的标签传进去。


对于普通镜像而言,rpull就是镜像的下载和解压。对OverlayBD镜像,rpull相当于注册一个镜像,并不会实际去下载镜像。然后我们启动一个容器,这里必须指明snapshotter使用的是Overlaybd snapshotter。它兼容Overlayfs,对于普通镜像而言,相当于通过Overlayfs启动,对于Overlaybd格式的镜像则进入远程拉取的逻辑。


下面看一下如何计时。

1.png

首先我们看80端口是否就绪,就绪以后检查wordpress的文件是否可以访问,如果访问得到,我们认为服务就绪,停止计时。


我们本次分为三个测试,第一个是普通镜像的冷启动测试,第二个是Overlaybd镜像的冷启动测试,第三个是Overlaybd的热启动测试,分别来看一下三个测试的启动时间。

1.png

 

1.普通的冷启动测试

镜像下载之后进行解压,我们看到总共的时间接近27秒。然后我们执行一下清理脚本,主要是清空刚才创建的容器和下载的镜像,并且清除Overlaybd

1.png

 

2.OverlayBD镜像的冷启动测试

1.png

拉取耗时0.6秒,接着加载远程数据,总共用时13秒,速度提升了一倍。下面仍然进行清理,清理的也是镜像和刚才创建的容器以及系统缓存。但这里并没有清理OverlaybdCache,所以再次启动时,需要远程加载的数据将命中本地缓存。


3.OverlayBD的热启动测试

1.png

启动时间是2.3秒,接近于热启动本地普通镜像。

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Kubernetes 开发者 Docker
基于容器技术的微服务架构
基于容器技术的微服务架构
32 0
|
4天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
14 0
|
27天前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。
|
29天前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
74 0
|
1月前
|
运维 API Docker
深入浅出:微服务架构与容器化技术的完美融合
【2月更文挑战第13天】 在现代软件开发领域,微服务架构和容器化技术已成为推动企业快速发展的两大核心力量。本文将从微服务的基本概念出发,深入探讨其与容器化技术结合的必然性与优势,进而分析如何在实践中有效地实现二者的完美融合。通过对微服务架构的细致解析及容器化技术的应用展示,旨在为读者提供一种全新的视角,理解并掌握这一前沿技术趋势,以指导实际工作中的技术选择与架构设计。
|
1月前
|
Oracle 关系型数据库 数据库
|
10天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
12 0

相关产品

  • 容器镜像服务