一种实现大规模容器快速部署的方法转让专利

申请号 : CN201710939453.4

文献号 : CN107729020B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 沃天宇杜炼杨任宇胡春明

申请人 : 北京航空航天大学

摘要 :

本发明提出一种实现大规模容器快速部署的方法,采用块存储服务RBD将集群中所有镜像的数据存储于网络存储中,在所述RBD中,容器镜像以分层结构存储,每个镜像对应一个Ceph块设备,其中父镜像和子镜像之间的冗余数据被剔除,对父Ceph块设备做快照,然后克隆快照,生成与做快照时的父块设备相同的块设备作为子Ceph块设备,所述Ceph块设备的写时拷贝粒度是对象,所述对象为Ceph中的基本存储单元,容器部署的仓库仅作为一个元数据服务器,其中只存储了镜像列表、镜像的层次信息和镜像层与Ceph块设备之间的映射关系。

权利要求 :

1.一种实现大规模容器快速部署的方法,其特征在于,采用块存储服务RBD将集群中所有镜像的数据存储于网络存储中,在所述RBD中,容器镜像以分层结构存储,每个镜像对应一个Ceph块设备,其中父镜像和子镜像之间的冗余数据被剔除,对父Ceph块设备做快照,然后克隆快照,生成与做快照时的父块设备相同的块设备作为子Ceph块设备,所述Ceph块设备的写时拷贝粒度是对象,所述对象为Ceph中的基本存储单元,容器部署的仓库仅作为一个元数据服务器,其中只存储了镜像列表、镜像的层次信息和镜像层与Ceph块设备之间的映射关系;所述大规模容器快速部署的方法包括三个步骤:步骤1、加载镜像元数据;步骤2、挂载镜像块设备;步骤3、构造本地容器层;所述步骤1中,当工作节点收到容器部署命令时,从仓库中加载相关的镜像元数据并进行解析,快速获取所对应Ceph块设备的信息,所获取的时间为0.2~0.3秒;所述步骤2中,将镜像所对应的Ceph块设备映射到本地,并将其挂载到本地目录,挂载后的目录包含一个完整的根文件系统,所述映射为在本地内核注册Ceph网络块设备,使所述Ceph网络块设备成为一个可本地访问的块设备;所述步骤3中,进行文件级别的写时拷贝生成容器的存储层,工作节点从容器存储层中读取程序二进制和配置数据,数据块以按需加载的形式从Ceph块设备中拉取,启动容器需要读取的数据占据的比例不超过整个镜像大小的8%,当需要修改镜像中的文件时,容器将镜像中的文件先拷贝到容器存储层中再进行修改,不改变原镜像的内容。

说明书 :

一种实现大规模容器快速部署的方法

技术领域

[0001] 本发明涉及一种文件管理方法,尤其涉及一种实现大规模容器快速部署的方法。

背景技术

[0002] 容器技术能取得成功很大程度上归因于它在打包和部署应用方面带来的便利。一个应用所需要的二进制文件和所依赖的库文件都被打包到一个镜像中,保证了应用运行时环境的一致性,简化了部署工作。然而,随着镜像大小的增长,应用部署的效率也受到了不利影响。
[0003] 图1展示了传统的容器部署架构,是个典型的中心化系统,镜像仓库在集群的镜像分发过程中扮演着中心的角色。Docker镜像由多个镜像层(layer)组成,每个镜像层代表着一个软件或者库的文件集合。所有的镜像层都以gzip压缩文件的方式存放在镜像仓库中,镜像元数据(image metadata)也存放于镜像仓库中。镜像元数据包含了镜像和镜像层之间的映射关系。为了能在集群中部署容器,工作节点必须拉取(pull)完整的镜像,然后将其存放在本地的写时拷贝(copy-on-write,COW)结构的存储中。工作节点的本地存储由存储驱动管理,代表性的存储驱动有Aufs、Devicemapper、Overlay和Overlay2。当镜像拉取完毕之后,存储驱动会在镜像之上再构造一个写时拷贝层,作为容器存储层。
[0004] 现有技术的部署方式在性能上还远远不能满足需求。由同一局域网下的两台主机构成,分别是一个私有镜像仓库和一个工作节点,测试Docker Hub上下载量排名前69的镜像的部署时间。测试结果表明,容器的平均部署时间高达13.4秒。然而,有许许多多的场景对部署延迟有着很高的要求:为了应对突发流量,服务要迅速横向扩展;为了保证系统的高可用,应用需要尽快地从故障状态中恢复;在持续集成(Continuous Integration)的工作流中,缩短部署时间对提高生产效率来说也很重要。
[0005] 现有技术例如并行下载和压缩数据可以加快拉取速度,然而拉取整个庞大的镜像依然是部署性能的短板。特别是在大规模容器的部署中,对于中央镜像仓库的竞争会进一步拖慢下载。为了解决这个问题,必须尽量减少部署过程中传输的数据量。

发明内容

[0006] 本发明提出一种实现大规模容器快速部署的方法。本发明设置一个基于网络存储的Docker容器部署系统。所述方法能显著降低部署过程传输的数据量,进而大大加快容器部署速度。
[0007] 本发明提出的一种实现大规模容器快速部署的方法,采用块存储服务RBD将集群中所有镜像的数据存储于网络存储中,在所述RBD中,容器镜像以分层结构存储,每个镜像对应一个Ceph块设备,其中父镜像和子镜像之间的冗余数据被剔除,对父Ceph块设备做快照,然后克隆快照,生成与做快照时的父块设备相同的块设备作为子Ceph块设备,所述Ceph块设备的写时拷贝粒度是对象,所述对象为Ceph中的基本存储单元,容器部署的仓库仅作为一个元数据服务器,其中只存储了镜像列表、镜像的层次信息和镜像层与Ceph块设备之间的映射关系。

附图说明

[0008] 图1为现有技术的容器部署架构的整体框架图;
[0009] 图2为现有技术中拉取和运行的效果图;
[0010] 图3为本发明基于网络存储的容器部署结构图。

具体实施方式

[0011] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0012] 容器部署过程分为两步操作:
[0013] 步骤1.镜像层以gzip压缩的形式存储在镜像仓库中。一个镜像包含多个镜像层,工作节点可以进行并发下载。当被下载到本地时,镜像层会被立刻解压到本地的存储中。虽然镜像层能够并发下载,但是其解压的过程却不能并行化,原因是镜像层之间有先后依赖的顺序。本地存储的具体结构依存储驱动而定,Devicemapper驱动将镜像存储在精简配置(thin-provisioned)的块设备中,而Overlay驱动将镜像存储在特殊构造的本地文件系统中。
[0014] 步骤2.镜像被成功导入到本地存储之后可用于重复启动容器实例。在启动一个容器之前,存储驱动首先会在镜像之上创建一个Init层,用于初始化一些容器特有的文件,比如hostname文件、DNS地址文件等。之后,Init层之上会创建另外一个容器层,作为容器的根文件系统。所有这些本地存储中的容器层均利用写时拷贝生成,以提高空间利用率和启动性能。另外,不同的驱动有不同的写时拷贝粒度:Aufs和Overlay是文件级的写时拷贝;Devicemapper是块级别的写时拷贝。最终,容器在隔离的根文件系统中启动。
[0015] 图2展示了部署期间拉取(pull)和运行(run)两个阶段各自所花费的时间,每个点代表一次镜像部署。从图中可以明显看到,随着镜像大小的增长,运行时间保持在稳定的水平,平均来说是1.1秒。而拉取的时间和镜像大小之间有显著的正相关关系。平均的拉取时间为12.3秒,占据了92%的部署时间(13.4秒)。缓慢的拉取过程是容器部署的效率瓶颈所在。
[0016] 本发明的实现大规模容器快速部署的方法采用网络存储的Docker容器部署系统,能显著降低部署过程传输的数据量,进而大大加快容器部署速度。
[0017] 图3展示了本发明快速部署系统的系统架构。相对于将镜像存储于镜像仓库中然后向工作节点分发的方式,所述系统将集群中所有镜像的数据存储于网络存储中,本发明采用Ceph块设备(RADOS Block Device,RBD)池。RBD是Ceph提供的块存储服务。在RBD池中,Docker镜像以一种分层的结构存储,每个镜像对应一个Ceph块设备。利用写时拷贝技术,父镜像和子镜像之间的冗余数据被剔除。例如,Nginx镜像不需拷贝Debian镜像的所有数据,只需在Debian镜像之上构造一个写时拷贝层然后写入增量数据即可。由于镜像之间有父子依赖关系,对应的Ceph块设备也具有父子依赖关系。创建子Ceph块设备须经两步:对父Ceph块设备做快照,然后克隆快照。克隆操作会生成一个与做快照那一刻的父块设备相同的块设备。Ceph的写时拷贝粒度是对象(object),所述对象特指Ceph中的基本存储单元。系统中的仓库(registry)只作为一个元数据服务器,它只存储了镜像列表、镜像的层次信息和镜像层与Ceph块设备之间的映射关系。本发明的部署过程主要包含三个步骤:
[0018] 1)加载镜像元数据
[0019] 当工作节点收到容器部署命令时,从仓库中加载相关的镜像元数据并进行解析,获取所对应Ceph块设备的信息。相对于整个镜像,元数据的大小几乎可以忽略不计,一般只有几百KB。加载和解析元数据的时间相当短,只需0.2~0.3秒。因此在面对并发下载请求时,仓库的压力可以大大缓解。
[0020] 2)挂载镜像块设备
[0021] 直接把镜像所对应的Ceph块设备映射到本地,并将其挂载到本地目录。挂载后的目录会包含一个完整的根文件系统。“映射”在这里指的是在本地内核注册Ceph网络块设备,使其成为一个可本地访问的块设备。
[0022] 3)构造本地容器层
[0023] 利用存储驱动overlayfs实现文件级别的写时拷贝,生成容器的存储层,为了运行容器,工作节点从容器存储层中读取程序二进制和配置等数据,所述数据块以按需加载的形式从Ceph中拉取,启动容器需要读取的数据占据的比例不超过整个镜像大小的8%,当需要修改镜像中的文件时,容器将镜像中的文件先拷贝到容器存储层中再进行修改,不改变原镜像的内容。事实上,容器存储层也可以放到网络存储中,但是在大规模并发部署容器时,这种方式会给网络存储带来较大的压力,影响部署速度。
[0024] 最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。