首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Shifter: 面向高性能计算的容器

Shifter: 面向高性能计算的容器

容器技术是一种操作系统层的虚拟化技术。它通过命名空间和 Cgroup        进行资源的隔离和控制,共享操作系统内核,分享系统资源。相比虚拟机,容器提供了一种更轻量级的虚拟化技术,它具有更高的资源利用率和更快的执行性能。Docker        作为一种容器技术,引入了应用镜像管理机制,适应快速的软件开发,部署和维护,推动了容器技术的普及和发展。
Shifter 容器的介绍用于高性能计算的容器        在高性能计算领域,应用软件通常有大量的系统依赖和复杂的环境配置:各种的软件包,不同版本的库和操作系统的发布版本等。这让系统的部署和维护都面临巨大的挑战。传统的虚拟化技术可以解决部署和维护的问题,但是由于在计算上增加了额外的虚拟化负载,无法最大化利用机器的物理资源用于有效计算。而容器技术可以解决这些问题。
Docker 的镜像管理机制可以帮助用户将复杂的软件环境打包,便于管理和维护。容器的轻量级隔离性增强了系统的安全,而不会降低系统的计算性能。尽管如此,Docker        容器在高性能计算领域的采用也存在一些问题。Docker 的资源管理功能与集群管理软件的功能有重叠,Docker        独立的后台管理进程和集群系统的进程管理功能也有冲突。这使得高性能集群系统中采用 Docker 有诸多不便。例如采集容器消耗的资源和对容器状态的控制,都需要进一步的集成到资源管理系统。而        Docker 的用户权限提升问题又给生产环境引入了不安全的因素。
Shifter 是为了利用容器技术的优势,同时解决 Docker 在高性能计算环境下的问题而产生。它是美国国家能源研究科学计算中心 (NERSC)        开发的开源容器技术。通过复用现有容器技术(Docker) 的系统镜像,给高性能计算应用提供更有效的容器解决方案。
Shifter 的体系结构 Shifter 由两部分组成:命令行工具 (shifter, shifterimg) 和镜像管理器 (image gateway)        后台进程。命令行工具负责管理镜像和容器操作。镜像管理器根据镜像管理操作的请求,负责容器镜像的查找,下载和维护。
当 shifterimg 发出下载镜像请求,镜像管理器将从 Docker Registry 下载镜像到本地网络文件系统。在任何一个挂载网络文件系统的机器上,shifter        加载对应镜像,启动容器,运行应用程序。如图 1 所示。
图 1. Shifter 体系结构 镜像管理进程的模块是 Shifter 提供服务的后台进程。它提供了镜像管理的基本功能,并对外提供服务。如图 2 所示,它的实现包括以下模块:
  • Restful API:提供管理服务的接口。
  • Image Manager:负责维护镜像数据。
  • Celery:管理和执行镜像下载任务。
  • 相关数据库:用于存储管理和系统数据。
图 2. 镜像管理器体系结构 如图 2 所示,当接收到下载请求时,镜像管理模块查询本地数据库(MongoDB),如果请求镜像已经下载到本地存储,直接返回成功。如果尚未下载,镜像管理模块创建下载任务,交给        Celery 执行。Celery 创建任务,下载镜像后,将镜像文件解压。解压后的文件集合用于创建 squash 文件系统。Squash        文件系统是一种压缩格式的文件系统,可以有效减少文件存储占用大小。它作为一个单独文件存在,文件内部是一个包含了原始 Docker 镜像内部所有文件的根文件系统。
体系结构本身的设计为镜像管理进程提供了灵活的部署方式。例如图 2,系统 A 中的 Celery Worker 运行在可以直接访问网络文件系统的服务器节点。系统 B 中的        Celery Workers 运行在管理节点上,通过 SCP 将镜像文件拷贝到文件服务器上。这是一种更灵活的部署选择,但是因为数据重复拷贝,效率上会差一点。
镜像管理器是一种简单灵活的实现,它充分利用现有的第三方软件和库,例如 Celery,MongoDB,Redis,Squash        文件系统等。使用少量的功能逻辑代码,有效地实现了镜像的集中管理功能。松耦合带来部署的灵活性、简单性,确保了系统的有效稳定。
图 3. Shifter 容器体系结构Shifter 容器主要依赖于 Linux 提供的系统接口。如图 3 所示, Shifter 容器构建在 kernel 上,应用程序运行于容器里的根文件系统环境。当 Shifter        构建一个容器时:
  • 建立自己的文件系统命名空间(Linux namespace)。
  • 将镜像文件系统以及用户请求的目录挂载到容器里。Shifter 直接从镜像存储目录加载镜像文件,以只读方式将镜像文件作为回环 (loopback)          设备挂载到容器中。镜像文件一般存储在网络文件系统中,这种挂载方式可以有效利用操作系统的文件缓存机制,加快访问文件系统中的数据。
  • 为了保持应用运行环境一致性,环境变量也会被传递到容器。
  • 通过 chroot()系统调用,将系统运行时环境切换到已经挂载的镜像文件系统中,完成容器启动,开始运行应用程序。
  • 输出数据将会被写入主机映射到容器的目录里面,固化到磁盘中。
对于容器,由于 Shifter 是为高性能批处理作业系统设计的,它的运行时容器环境和一般意义上的容器,比如 Docker,在概念上有点不同。在隔离性上,Shifter        只使用了挂载点(mount points)命名空间,做了基本的文件系统隔离。容器相关的资源管理和资源控制都交给作业管理系统来处理。另外,Shifter 基于基本的隔离和        chroot()系统调用来实现容器,相比于 Docker 容器,这可以让它运行在很多旧的 Linux        发布版本中。这在注重系统稳定性,更新系统谨慎的高性能计算领域是很有用的。Shifter 的用户管理机制也很简单,运行容器的用户即是容器内操作的用户,容器内不存在权限提升问题。
Shifter 容器的安装和使用在 Linux 中安装 Shifter 我们以 Ubuntu 系统为例,说明它的安装过程。
1.安装编译依赖
Shifter 需要进行编译安装。它依赖于基本的编译工具 gcc 和 make,同时需要工具集 libtool 和 autoconf。原代码编译依赖于库:libcap-dev,        libmunge-dev, libcurl4-openssl-dev 和 libjson-c-dev.
清单 1.        获取依赖组件
1
$ apt-get install libtool autoconf libcap-dev libmunge-dev libcurl4-openssl-dev libjson-c-dev




2.下载源代码并编译安装 我们可以从下载最新的源代码并编译,安装。
清单 2. Shifter        源码安装
1
2
3
4
5
6
7
8
9
10
11
12
13
$ git clone https://github.com/NERSC/shifter
Cloning into 'shifter'...
remote: Counting objects: 6512, done.
remote: Compressing objects: 100% (91/91), done.
remote: Total 6512 (delta 49), reused 0 (delta 0), pack-reused 6421
Receiving objects: 100% (6512/6512), 1.46 MiB | 1.10 MiB/s, done.
Resolving deltas: 100% (4241/4241), done.
Checking connectivity... done.
$ cd shifter
$ ./autogen.sh
$ ./configure
$ make
$ make install




3.安装第三方支撑软件
Shifter 需要第三方软件的配合运行,这部分依赖主要用于支持镜像管理器。
清单 3.        安装第三方软件
1
2
3
4
$ apt-get install mongodb munge redis-server redis-tools squashfs-tools
$ apt-get install python-pymongo python-celery python-flask python-redis
$ lsmod | grep squashfs
squashfs               48362  0




4.配置 Shifter 系统
配置文件模版已经安装在系统里,我们通过拷贝,创建本地配置文件/usr/local/etc/定制镜像管理和容器管理行。
清单 4.        创建配置文件
1
2
$ cp imagemanager.json.example imagemanager.json
$ cp udiRoot.conf.example udiRoot.conf




基本的安装过程到这里就结束了。接下来,还要做简单的配置:
  • 创建系统镜像存储目录:
默认为/images。但是一般使用网络文件系统路径,便于多节点共享镜像文件。后台进程和 shifter 命令行都会使用这个目录存储和访问容器镜像。
  • 配置 udiRoot.conf,设置 imageGateway 的地址和端口:
镜像管理工具 shifterimg 通过这个配置访问后台进程。
返回列表