admin管理员组

文章数量:1531485


2024年6月15日发(作者:)

面向高性能计算系统的容器技术综述

摘要:近些年,随着科技的进步,引入容器技术,实现对传统高性能应用模

式的改进,使高性能计算系统成为初步具备公共服务特性的云计算系统所作的实

践探索。容器本身并不是全新的虚拟化技术,事实上它只是操作系统级虚拟化技

术的一种。随着近几年容器编排平台的不断成熟,解决了集群管理、业务自动化

编排问题后,这项技术又重新进入了人们的视野。容器共享宿主机操作系统内核,

通过宿主操作系统提供相互隔离的运行环境。每个容器包含括独立的文件系统空

间,主机和域名空间,进程间通信空间,进程空间,网络协议栈空间,用户空间。

关键词:高性能;计算系统;容器技术

引言

容器技术在云计算行业已得到普遍使用,主要用于服务软件环境的快速移植

和自动化部署。随着高性能计算、大数据、人工智能技术的深度融合,高性能计

算系统的应用软件依赖和配置日益复杂,超算中心对于用户自定义软件栈的需求

越来越强烈。因此,容器技术在高性能计算系统的应用环境下也发展出多种实现

软件,以满足用户自定义软件栈等实际需求。文中总结了容器技术的发展历史,

阐述了容器在Linux平台的技术原理,分析并评价了于适用高性能计算系统的容

器实现软件,最后展望未来面向高性能计算系统的容器技术研究方向。

1 Docker技术概述

Docker是一种开源的轻量化容器技术,在IT领域已经得以广泛应用。最基

本的Docker系统由应用镜像和容器引擎组成,前者用于存储应用及其依赖的软

件包,后者负责创建容器,将镜像实例化为实际运行状态。

与虚拟机(VM)类似,Docker能够运行不同的Linux发行版,容器之间彼此

隔离,在很多场景下可以当作轻量化、模块化的VM使用。不同之处在于每个VM

实例都要启动其中的操作系统(OS)后才能运行应用程序,而Docker实例则是

运行于宿主OS的内核上,因此不仅镜像更小、启动更快,能够提供更接近于开

封即用的用户体验,还可以避免VM中OS的授权费、运行的资源消耗及独立运维

成本(这些成本通常被称作OS税或VM税)。

Docker还有着完善的生态环境,Docker官方和第三方都提供了开源的镜像

管理和容器集群管理工具,可用于镜像的编译、发布、共享、版本管理以及容器

或容器集群的启停与参数配置;清华、中科大等高校及网易、阿里、腾讯等企业

提供了Docker仓库镜像服务;AWS、Azure、华为云等云计算平台提供了对

Docker集群的支持。此外,Docker与微服务架构契合度很高,目前已经成为该

架构主流的落地实施方案之一。得益于这些优点,很多软件选择Docker镜像作

为发布形式,包括主流的Linux发行版、数据库及很多领域的专业软件以及大量

的定制化应用。

2 Singularity技术

Singularity始于2015年美国劳伦斯伯克利国家实验室(Lawrence

Berkeley National Laboratory)的开源项目,专门为大规模、跨节点HPC

(High Performance Computer)而开发的容器化技术,并且能够支持Docker镜

像格式的转换。Singularity具有以下特性:

Singularity的镜像包含了软件所有依赖关系的镜像,能够非常好的解决跨

计算环境的兼容性问题。科学计算领域的应用软件大部分需要借助于MPI之类的

并行技术,Singularity增加了MPI的兼容能力,带有与宿主机相同MPI版本的

Singularity容器可直接通过mpirun命令启动,与超算环境集成更加便捷。

Singularity可以直接与作业调度系统集成,无需为科学计算环境做额外的适配。

与Docker不同的是,Singularity启动时,能够保证用户上下文保持不变,使得

用户权限在容器内部和外部保持一致,避免用户权限提升等不安全因素,更加适

用于普通用户使用应用软件的场景3现有高性能计算系统的容器实现

Docker是目前最流行的容器技术,普遍适用于微服务和云计算平台。Docker

是个C/S架构的软件。Docker daemon以root权限运行,以便拥有管理适当资源

所需的访问权限。如果系统上存在名为docker的组,Docker会将套接字的所有

权应用于该组。因此,属于docker组的任何用户都可以运行Docker,而无需获

得系统管理员权限。Docker为了保持各个容器实例的独立性,采取了十分严格的

资源隔离和控制的策略,默认启用全部的命名空间和cgroup功能。

虽然Docker提供了很多特性,但是它更适用于服务进程而不是计算程序的

进程,而不适用于高性能计算系统的软硬件环境。并且,每个Docker引擎在本

地都有自己的镜像存储,无法共享。

Docker默认的强隔离性使得进程无法充分利用硬件资源进行加速和互联。

Docker早期对MPI的支持和作业管理系统的集成也都不够完善。为了解决

Docker在高性能计算环境中的一些缺陷,同时利用容器技术满足自定义软件栈的

需求,适用于高性能计算环境的容器实现相继出现,主要有Singularity,

Shifter,Charliecloud和Sarus。

3.1Singularity

2015年,美国劳伦斯伯克利国家实验室(LBNL)开发了Singularity的初始

版本。Singularity放弃了许多Docker支持的容器特性,专注于实现软件的可移

植性。Singularity的常用工作方式,用户可以自己构建镜像,并允许交互式修

改。之后将镜像传输到运行环境上,用户可以以无特权的方式运行镜像中的程序。

Singularity通过将整个程序和依赖都封装到单个镜像文件中来实现快速移植。

Singularity的工作流程基本独立,不依赖于Docker的组件,但为了利用

Docker庞大的生态,Singularity支持拉取dockerhub的镜像,并转换成它专有

的镜像格式。Singularity也有自己的官方镜像库Singularityhub。

Singularity没有采用Docker那样复杂的C/S架构,而是把启动容器、拉取镜像、

创建镜像等核心功能都放进了命令行的客户端里实现。Singularity默认使用

SETUID来实现特权操作。为了在没有root权限的机器上安装并正常使用,从

3.5版本开始,Singularity采用用户命名空间实现了fakeroot特性,可以让非

特权用户执行一些受限的特权操作,启动容器后,容器内进程的UID保持不变。

高性能计算系统中的工作流程不需要对容器进行严格的隔离。在基于作业管

理系统的传统成熟工作模式下,不同用户的作业都会直接作为一系列进程在节点

上运行。利用传统的Linux权限模型就足以保障用户各自的文件和进程的安全,

并维持整个系统环境的正常运作。Singularity的核心功能就是赋予容器独立的

文件系统视图,从而解决复杂依赖问题,因此容器引擎在启动容器进程时,会默

认创建新的挂载命名空间。

Singularity默认不启用cgroup做资源限制,因为全局的作业管理系统会统

筹规划每个用户的作业,包括限制作业可使用的资源,不需要在容器这一层面再

做重复的工作。为了让容器运行时在高性能计算系统上能够正常工作,

Singularity还需要额外为容器提供一些资源,比如默认会挂载用户的家目录,

从而允许封装的程序读取输入文件和持久化地保存计算结果;一些设备也需要挂

载到容器供其运行时使用,典型的有高速互联网络和加速卡。Singularity针对

高性能计算系统做了很多支持,并且单文件的镜像软件也给移植带来了便利,它

已经成为现在高性能环境上最流行的容器软件。

3.2 Shifter

Shifter是美国国家能源研究科学计算中心(NERSC)和Cray联合开发的容

器软件。为了利用Docker庞大的生态,Shifter复用了Docker在镜像创建和镜

像分发相关的组件,自研了容器引擎并自定义了镜像的格式。Shifter的架构比

Docker简单,容器命令行客户端是SETUID的程序,以此来允许用户特权操作。

Shifter有以下重要组件:命令行用户工具、镜像网关、称为“udiRoot”的运行

时启动器和工作负载管理器集成(WLM)组件。

用户命令行工具根据用户的选项,和其他组件交互。网关用于接受命令行工

具发来的restful请求,然后从各种来源(包括私有Docker仓库、公开的

Dockerhub和本地文件系统)导入镜像,将镜像转化成udiRoot组件可以使用的

格式,最后把转化后的镜像传输到与目标HPC关联的全局文件系统中。镜像文件

基于Squashfs格式。UdiRoot组件用于实例化和销毁容器。Shifter和

Singularity的思路理念一致,核心也是给容器内的进程构建一个独立的根文件

系统视图,因此也不需要隔离和限制很多的资源,它将资源管理工作都交给了系

统上运行的作业管理系统,如SLURM,ALPS等。启动后在默认情况下,文件系统

视图的根目录是挂载的SquashFS,所以镜像内的文件和目录都呈现只读的权限,

用户也需要额外挂载host上的目录来实现文件输入或者持久化存储。这个挂载

的SquashFS一般都会在分布式文件系统的某个目录中,而且是只读,以此可以

允许多个容器进程的rootfs共享,这在运行MPI这类并行程序的使用场景下能

够节省运行时的存储开销。工作负载管理器集成(WLM)组件用于和Slurm等工作

管理系统集成,例如上文提到的作业中多个进程的rootfs共享宿主机文件系统

下的目录,就需要WLM的支持。

3.3Charliecloud

Charliecloud是美国洛斯阿拉莫斯国家实验室(LANL)研发的容器软件。

Charliecloud是一个轻量级的容器实现,它依赖于Docker实现镜像管理,只独

立实现了核心的容器运行时。Charliecloud和之前分析过的Singularity以及

Shifter一样,默认只创建新的挂载命名空间,资源控制也交给上层的作业管理

系统完成。由于Charliecloud的轻量实现,它的工作模式需要依赖用户额外的

机器和Docker。首先,用户需要一台拥有root权限的机器,在此机器上利用

Docker完成前期的准备工作,即通过Docker构建或者拉取镜像;然后利用

Docker自带的export命令导出镜像,导出的格式为tarball压缩包;并利用网

络将镜像的压缩包从自己的机器传输到高性能计算机器上。之后,用户在超算集

群的登陆节点上操作。为了启动容器,用户需要解压镜像压缩包,通常解压到

tmpFS或者共享文件系统上,解压之后是一个目录,这个目录就是后续启动容器

的rootfs;然后利用容器引擎启动进程。容器引擎会创建新的挂载命名空间,绑

定挂载主机上必要的目录,使用pivot_root将容器rootfs更改为镜像解压后的

目录,最后执行命令给定的程序。这里创建挂载命名空间是特权操作,

Charliecloud通过启用用户命名空间,让用户能够无需特权完成这项操作。

Charliecloud巧妙地将一部分工作转移到高性能计算系统之外的机器上,从而避

免了对Docker的依赖。它使用了用户命名空间来无特权启动容器。用户命名空

间需要Linux内核为3.8以上,所以Charliecloud对一些老的高性能计算系统

支持不够好。

3.4 Sarus

Sarus是瑞士国家超级计算中心(CSCS)2018年研发的容器软件,它符合

OCI运行时规范,并能够直接使用Docker庞大的镜像仓库。Sarus也没有采用

Docker的C/S架构,只简单地分为命令行组件、镜像管理器、运行时组件3个部

分。命令行组件用于收集命令行参数并执行用户请求的操作,一般会调用镜像管

理器或运行时组件。镜像管理器负责从Dockerhub下载镜像,将其转换成Sarus

自己的格式,并存储在本地的分布式文件系统上;运行时组件用于启动容器,它

会从镜像中提取出rootfs目录,把主机系统上必要的目录也挂载到相应的位置,

然后生成容器进程。容器进程根据配置创建不同的命名空间,并进行rootfs的

切换,最后执行相应的命令。Sarus运行时符合OCI标准,可以在容器启动时设

置OCIhook函数,这些hook回调函数将在容器生命周期的不同阶段执行,以拓

展容器运行时提供的功能。开发或运维人员可以创建hook函数实现新功能,让

容器与高性能计算环境的其他基础设施集成。Sarus利用hook拓展了许多功能:

为了保证MPI程序运行时容器内和宿主机上的库ABI兼容,并且有效利用MPI库

针对集群硬件调优后的性能优势,Sarus可以将容器内的MPI库替换成主机系统

上的版本;arus集成了NVIDIAcontainerruntime中的hook,会在容器中挂载主

机上的GPU设备、cuda运行库依赖等,保证了CUDA程序的正常执行;为了支持

ApacheSpark这类需要ssh服务的程序,Sarus提供了一个在容器内提供OpenSSH

软件栈的hook;为了防止特殊情况下Slurm分配的资源不可用而导致进程启动不

同步,Sarus还提供了一个hook,可以在对用户程序非侵入的情况下提供同步屏

障。

结语

容器技术主要是对软件和其依赖环境的标准化打包,将应用之间相互隔离,

并能运行在很多主流操作系统上,具有自动化部署、高性能转发、安全可靠等优

势。容器技术在高性能计算系统上正在逐渐成熟,未来容器可能会改变高性能计

算软件传统的开发和部署模式,为高性能计算以及大数据与人工智能计算的深度

融合提供强有力的技术手段。

参考文献

[1]张云泉,袁良,袁国兴,李希代.2019年中国高性能计算机发展现状分析与

展望[J].数据与计算发展前沿,2020,2(1):18-26.

[2]张璞. 基于Docker容器的智能航保云平台架构设计[J]. 航海,

2020(6):50-52

[3]葛虎.基于Linux容器实现NFV平台的研究[J].电子技术,2016,(8):10-

:10.3969/.1000-0755.206.08.004.


本文标签: 容器镜像用户高性能