目录
容器(container)技术是目前云服务的一个关键技术,通过容器可以更加方便快捷地部署软件环境,在云上快速建立所需要的环境进行相关工作。现在最著名的容器技术平台是docker,同时还有诸多各具优势的同类技术在不断的发展,例如podman、singularity、shifter、enroot以及用于GPU作业的nvidia-docker等。
之前我们介绍过,LSF也针对这些容器技术提供了运行作业的解决方案,并且介绍了基本的使用方法。(可以跳转回顾LSF实践专题(10):LSF运行容器作业)
这次,我们再补充介绍一些与LSF相关的细节。
LSF管理docker容器作业的优势
首先,我们可以直接在LSF的作业里调用docker命令来运行容器镜像并执行所需动作,那为什么还需要LSF来帮助管理容器中的作业呢?
1、安全性
首先一点,是基于安全性的考虑。
我们以任何用户运行一个容器镜像的时候,在启动的容器内,都将是以root用户身份进行操作的,所以在容器内的各种操作也是以root身份进行。当容器与外部环境有所交互时,就会有一些安全隐患。
而通过LSF管理容器作业时,LSF会接管容器的权限管理,让容器中的作业只具备作业提交者相应的权限。
同时,LSF管理员可以在LSF的application或者队列中设置docker image的镜像属性和docker的runtime选项,让管理员能够对镜像有全面的掌控,包括镜像的来源、名称和使用哪个版本,避免普通用户随意使用不明来源的镜像所带来的一些安全隐患。
2、将容器作业调度到专门预留的节点
通过设置特有资源的方式,LSF可以将准备在容器里运行的作业准确地调度到那些已经配置好容器环境的节点上,提高效率。
3、自动配置docker运行环境
根据不同需要,使用docker创建容器时可能会需要配置很多不同的运行参数,如果将不同类型的容器作业所需的容器镜像和运行参数配置到不同的application或者队列中,就不必在每次提交作业的时候都去填写这些信息,让用户能够更加方便地提交容器作业,避免因一些不必要的错误耽误时间。
4、使用容器启动并行作业
当需要在多个节点上运行跨节点的并行容器作业时,LSF会在每个执行节点上启动容器,并且将运行并行作业所需的MPI环境添加到镜像中,为这些容器设置相同的运行环境。
5、其他优点
LSF还具备同时支持docker默认使用的cgroupfs和红帽新版本中默认使用的systemd两种方式的cgroup来对容器资源进行管理,支持GPU作业需要使用的nvidia-docker等等。
容器环境的准备
我们首先需要准备可以运行docker的节点,保证节点上可以成功创建和运行docker容器,才能够将LSF的作业运行在节点上。
确保docker正常安装好,镜像仓库也可以正常访问,在LSF外面通过docker run命令能够正常创建容器。同时还要保证用于提交作业的用户加入到了docker用户组里。否则,该用户会无法运行docker命令,例如:
遇到这种情况,假设该用户是user1,可以通过命令usermod -aG docker user1将用户user1加入到docker用户组。
如果节点上的系统是RHEL8,那么系统默认的容器是podman,这时也有docker命令,但是只是podman的一个符号链接,这时候需要先卸载podman,并正常安装docker。当然,LSF也可以将作业调度运行到podman上,不过配置稍有不同。
同时,因为LSF对docker的支持中,需要在作业准备运行的环节执行python脚本,所以在docker的节点上,要提前安装好python2或python3,如果是python3,要确保/usr/bin/python被链接到了python3上。
LSF对于容器环境的配置以及作业运行
docker节点配置好之后,我们来完成LSF的相关配置。首先按照正常情况安装配置好LSF集群,在管理节点上,我们进行以下配置:
1、打开LSF_TOP/conf/lsf.conf文件,确认这三个参数配置如下:
2、按照之前文章的介绍(可以跳转回顾LSF实践专题(10):LSF运行容器作业),在LSF_TOP/conf/lsf.shared文件中,添加布尔型资源docker,并且在LSF_TOP/conf/lsf.cluster.clustername中为可以运行docker的节点配置这个resource属性。
3、接下来在application或者队列中配置docker image属性和运行参数。
在队列和application中的相关配置参数相同,但是如果作业指定的application和队列都有docker配置,则application中的配置生效。这里我们以在application配置为例。
对于docker中的options参数,上次介绍了--rm是在作业结束后将创建的container清除,下面再介绍一下其它几个参数:
--rm:在作业结束后删除为作业创建的container。
--net=host:用于通过网络启动跨节点并行作业的任务。
-v:可以用于将容器外的文件mount到容器内部,这个参数可以让LSF获取启动跨节点并行作业的用户名、userID及认证信息(eauth)。
例如,如果想要提交跨节点的并行docker作业,就需要配置成以下样子:
这里用-v指定了两个文件,一个是/etc/passwd, 这里面必须要包含docker作业提交用户的id和用户名,另一个文件是/etc/lsf.sudoers,这个文件是在LSF10.1.0.12版本以后用于eauth用户认证的文件。
并行作业的提交和运行
上次的文章已经演示了基础的docker作业,这次,我们演示一下跨节点的docker作业。
首先添加两个可以运行docker的节点。
确定application中设置了passwd和lsf.sudoers文件的映射。
提交并行作业<2211>:
我们看到,作业<2211>运行在了两个节点上,我们到每个节点看一下。
在第一个节点上,会启动两个container,其中一个是给作业本身的(上面docker ps输出中的第二个容器)。另外,第一个节点会负责在每个执行节点上启动一个task,所以,第一个节点上还会有一个为该节点的task启动的container(即本例中最终运行的sleep程序)。我们在docker ps的COMMAND一列可以看出来作业的container和task的container的区别。
在第二个执行节点上,则只有一个为task启动的container。每个节点上有几个task,就会相应启动几个container。
我们再提交一个4个task的作业<2212>验证一下。
作业<2212>在每个节点上各有2个task。
对应的,每个节点上也会启动2个container。
总结
上面就是docker作业的配置和运行举例,我们在开头提到的其它几种常用docker技术,LSF也提供了支持,配置方法类似,可以根据实际需要进行使用。
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。