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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 阿里资深技术专家在阿里云开发者社区特别栏目《周二开源日》直播中,介绍刚于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秒,接近于热启动本地普通镜像。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
7天前
|
运维 持续交付 Docker
深入理解Docker容器化技术
深入理解Docker容器化技术
|
11天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
217 8
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
3天前
|
Ubuntu 网络安全 容器
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理。本文详细介绍了如何在 Ubuntu 22.04 上安装 KubeSphere,包括系统要求、安装依赖项、设置防火墙、下载安装脚本、选择安装选项、验证安装结果等步骤,并提供了常见问题的解决方法。希望本文能为读者提供实用的参考和帮助。
13 3
|
3天前
|
安全 持续交付 云计算
揭秘云计算中的容器化技术及其优势
揭秘云计算中的容器化技术及其优势
8 1
|
3天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
5天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
7天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
8天前
|
存储 Kubernetes 调度
基于容器化技术的性能优化实践
基于容器化技术的性能优化实践
17 3
|
7天前
|
数据中心 开发者 Docker
理解并实践Docker容器化技术
理解并实践Docker容器化技术

相关产品

  • 容器镜像服务