LSF实践专题(10):LSF运行容器作业

目录

配置方法

测试容器作业


这两年随着容器技术的成熟,用户已经开始将一些应用通过容器方式运行。LSF的主要工作负载目前仍然是传统应用(例如各类EDA仿真程序),但新版本的LSF也已经实现了对容器作业的支持。

在LSF上运行容器作业的好处在于,可以利用容器的技术特点,在保持计算节点系统版本不变的情况下,方便的运行需要不同系统版本支持的应用。例如有些应用只能运行在CentOS 6.9上,但是计算节点操作系统是CentOS 7.9,那就可以先做好一个基础镜像是CentOS 6.9的应用镜像,再提交到LSF上运行,而不需要专门准备一个CentOS 6.9的计算节点。

下面我们就来看一下如何在LSF上运行Docker作业(本文以Docker为例,LSF也支持Podman、Shifter、Singularity、Enroot等其它容器运行环境)。

配置方法

1. 在计算节点上安装并启动好docker。

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-02-18 16:53:36 CST; 13min ago
     Docs: http://docs.docker.com
 Main PID: 2057 (dockerd-current)
    Tasks: 80
   Memory: 7.2M
   CGroup: /system.slice/docker.service
           ├─2057 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=do...
           └─2493 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-int...

2. 在计算节点上创建好docker image,或者将docker image上传到内网里的容器镜像仓库。在计算节点上执行docker images命令查看容器镜像。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5d0da3dc9764        5 months ago        231 MB
ubuntu              latest              f643c72bc252        14 months ago       72.9 MB

3. 在lsf.shared文件里设置布尔类型资源docker。

Begin Resource
RESOURCENAME  TYPE    INTERVAL INCREASING  DESCRIPTION        # Keywords
...
docker        Boolean ()       ()          (docker container)
...
End Resource

4. 在lsf.cluster.<cluster_name>文件里标记有docker服务的计算节点(在计算节点的RESOURCES一列设置“docker”类型):

Begin Host
HOSTNAME  model    type    server   RESOURCES    #Keywords
...
host2       !       !       1       (docker)
...
End Host

5. 在lsb.queues文件里配置一个队列,设置CONTAINER和EXEC_DRIVER参数,例如:

Begin Queue
QUEUE_NAME = docker
PRIORITY = 50
USERS = all
HOSTS = all
CONTAINER = docker[image(centos:latest) options(--rm)]
EXEC_DRIVER = context[user(lsfadmin)] \
              starter[/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-starter.py] \
              controller[/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-control.py] \
              monitor[/lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-monitor.py]
DESCRIPTION  = test docker
End Queue

注释:

  • CONTAINER参数用于指定队列使用的容器镜像,上面例子是“image(centos:latest)”,表示该队列默认使用centos:latest镜像;此处也可以设置为“image($LSB_CONTAINER_IMAGE)”,表示在提交作业时用环境变量LSB_CONTAINER_IMAGE来指定作业所使用的容器镜像。

  • 在CONTAINER的options参数里建议设置“--rm”,这样在作业结束时,docker会自动清除容器实例。

  • 在options里也可以配置docker run命令支持的其它参数,例如“options(--rm -v /abc:/abc)”,这样可以通过-v选项将计算节点的/abc目录挂载到容器里的/abc目录下。 

  • 在EXEC_DRIVER里配置context用户,上面例子中的“context[user(lsfadmin)]”表示lsfadmin是容器的context用户,我们需要在计算节点上将lsfadmin加到docker用户组里,确保lsfadmin用户能正常运行docker run和docker exec命令。

  • EXEC_DRIVER参数通过starter、controller和monitor这三个参数指定LSF容器作业运行所需要的3个python脚本,这些脚本在LSF安装时已经被放置在$LSF_SERVERDIR目录下。

6. 确保$LSF_SERVERDIR目录下的3个python脚本权限正常(文件的属主必须是上面队列设置中的context用户,即lsfadmin,文件权限需要是0700)。

$ ls -l $LSF_SERVERDIR/*py
-rwx------ 1 lsfadmin lsf  6946 Dec  4  2020 /lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-control.py
-rwx------ 1 lsfadmin lsf 11944 Dec  4  2020 /lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-monitor.py
-rwx------ 1 lsfadmin lsf 15824 Dec  8 14:48 /lsf/10.1/linux3.10-glibc2.17-x86_64/etc/docker-starter.py

7. 确保计算节点上的python命令能正常运行,例如:

$ python -V
Python 2.7.5

测试容器作业

1. 提交两个交互式容器作业并观察作业输出,从这些输出可以看出该作业是在容器里运行,而不是直接在计算节点的OS上运行:

$ bsub -I -q docker id
Job <7401> is submitted to queue <docker>.
<<Waiting for dispatch ...>>
<<Starting on host2>>
uid=33224 gid=10007 groups=10007
$ bsub -I -q docker hostname
Job <7402> is submitted to queue <docker>.
<<Waiting for dispatch ...>>
<<Starting on host2>>
8a3ce4b19e60

2. 提交一个后台作业,作业开始运行后,使用LSF的battach命令进入该作业所在的容器进行查看:

$ bsub -q docker sleep 100
Job <7403> is submitted to queue <docker>.
$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
7403    user1   RUN   docker     host1       host2       sleep 100  Feb 18 10:37
$ battach 7403
Attaching job execution host: host2 for job: <7403>

sh-4.4$ hostname
4cc06cdf88e2

sh-4.4$ id
uid=33224 gid=10007 groups=10007

sh-4.4$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
33224        1     0  0 09:04 ?        00:00:00 /bin/sh /home/user1/.lsbatch/1645151870.7403
33224        8     1  0 09:04 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 100
33224        9     0  0 09:05 ?        00:00:00 /bin/sh
33224       18     9  0 09:05 ?        00:00:00 ps -ef

sh-4.4$ exit
exit 

前面我们提到,也可以在提交作业时用环境变量LSB_CONTAINER_IMAGE来指定作业使用的容器镜像,具体方法是:

1. 在队列里配置:

CONTAINER = docker[image($LSB_CONTAINER_IMAGE) options(--rm)]

2. 提交作业时,使用LSB_CONTAINER_IMAGE环境变量指定image,例如:

$ bsub -q docker -env "LSB_CONTAINER_IMAGE=ubuntu:latest" -I hostname
Job <7404> is submitted to queue <docker>.
<<Waiting for dispatch ...>>
<<Starting on host2>>
87cee9322ab8

可以看到,这个作业在提交时指定了需要在ubuntu的容器镜像上执行。

至此,我们在LSF里配置和使用了docker作业,根据实际需要,也可以使用podman等其它容器运行方式。

 欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。

HPC常青园

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ivyent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值