使用Altair网格引擎与Docker
它比你可能想象的更容易
对于HPC应用程bob电竞官方序,容器是安装软件的好方法,并确保跨群集和云的可移植性。容器可以封装完整的预测试环境,允许用户混合和匹配不同的应用程序和版本而不发生冲突。bob电竞官方ESI等软件提供商OpenFoam.那Ubercloud.而且其他人在容器中越来越多的包装软件,以便于部署。
幸运的是,在Altair网发动机中对Docker的本机支持使得运行集装箱应用令人鼓舞。bob电竞官方在本文中,我将解释如何在Altair网格引擎集群上部署,运行和管理容器化工作负载,并为Altair网格引擎如何管理幕后的集装工地工作负载提供一些见解。
Dockerizing集群
如果您的Compute主机上没有安装Docker,这是一个很好的开始。添加Docker不应该破坏现有应用程序,但首先在非生产主机上测试事物始终是一个bob电竞官方好主意。添加Docker就像添加Java Runtime。Docker Engine为需要它的集装箱工作负载提供运行时支持。
作为谨慎的语言,不要假设您必须在群集主机上安装最新版本的Docker。Docker API像天气一样改变,因此您将想下载您的版本的Altair网格引擎支持的稳定Docker版本。
在本例中,我在Amazon Web Services (AWS)的CentOS 7上运行Altair Grid Engine v8.5.4。我使用了AWS市场安装网格引擎集群的简单方法。Consulting the Altair Grid Engine release notes, Docker version 17.03 is the latest supported Docker for Altair Grid Engine 8.5.4, so I’ll be using the free Docker Community Edition package (docker-ce-17.03.0.ce-1.el7.centos.x86_64) on my cluster compute hosts.
一旦配置了Docker存储库(我将很快介绍),就可以使用yum列表命令以显示可用的Docker版本。第二列返回的文本是版本字符串对于码头的释放,您将要注意到。
要显示可用的Docker 17.03包,我使用了这个命令:
根据您的操作系统,您可能需要使用不同的命令。这Docker CE文件有关其他Linux版本的详细说明,包括Debian,Fedora和Ubuntu。
因为我需要在多个主机上安装Docker,所以有必要构建一个安装Docker的脚本,以便在每个主机上输入相同的命令。下面的脚本以根用户身份运行,并且(至少对我来说)正确地在我的CentOS 7 Altair网格引擎计算主机上安装Docker。
该脚本执行以下步骤:
- 它安装所需的包装包括yum-utils其中包含yum-config-manager在第二个命令中使用的实用程序。
- 它将稳定的docker库添加到yum环境中,以便yum可以找到所需的docker包。你需要在yum列表上面显示的命令将有效。
- 最终命令安装所需的Docker版本(17.03)。我得到了长期讨厌的名称,其中包含版本的字符串yum列表命令。
安装命令可能需要一些解释。有知识的读者(唯一读过这个博客的人)可能希望看到这样的内容:yum安装码头工人- ce 17.03.0.ce el7.centos——1.“。这是我的第一次猜测。
只是为了证明没有什么是容易的,我了解到安装旧版本的Docker CE可以有点戏剧。在Docker-CE 17.06.0中引入了一个新的“obsoletes”限制,无论出于何种原因,yum repo适用于所有版本的Docker的限制。避免错误消息(Package Docker-CE-SELinux由Docker-CE过时......)阻止Docker安装我需要手动将过时设置为false百胜命令行和下载docker-ce和Docker-Ce-Selinux在一起。对此问题进行了详细的说明在这里。
你需要注意这个细节。总是一些小事情会引起最大的头痛!
安装Docker后,您可以启动Docker并验证它是否通过运行几个docker命令并运行hello world码头毂的容器。这是一个好主意systemctl.启用Docker,以便在节点引导时自动启动Docker。您可能希望将这些命令添加到您自己的安装脚本中。
一个详细信息 - 要允许常规用户运行docker命令,您将希望将群集上的每个用户添加到Docker组。下面的命令将用户账单添加到Docker组。
配置网格引擎使用Docker
现在我们已经到了很酷的部分。如果您正确地安装了Docker,则不需要做任何其他操作。网格引擎应该已经知道Docker和安装在每个主机上的任何Docker映像。
从网格引擎节点执行下面的命令说明了这一点:
对于不管理网格引擎以谋生的人,qhost正在显示群集中的计算主机。我有一个主主机和两个计算主机。您可以看到AWS主机名。这- fSwitch显示每个主机上特定资源的值。
Altair网格引擎在Altair网格引擎V8.4.0中添加了两个新的默认资源,以帮助管理Docker工作负载:
- Docker.:自动检测到的布尔资源,值为0或1,具体取决于Docker是否安装在主机上
- docker_images:逗号分隔的列表(类型rescriging),列出了主机上可用的Docker映像
假设您的Altair Grid Engine环境认识到Docker安装在每个主机上并查看可用图像,您已完成!您已换来了您的群集,可以开始提交和管理容器化应用程序。bob电竞官方
运行和管理容器化作业
Altair Grid Engine使得在容器内或容器外运行作业变得很容易。为了说明这是如何工作的,我创建了一个简单的脚本,名为testjob.sh.。脚本执行一些简单的事情,例如确定它是否在容器中运行并报告其主机名和IP地址。我添加了一个睡眠命令,因为我想脚本运行足够长,以便我可以针对运行容器进行Docker命令。如果读者想知道,检查隐藏文件的存在.dockerenv是一个有用的技巧,可以判断您的脚本是否在容器中运行。
我将此脚本提交到网格引擎作为正常的非容器作业:
脚本被分配了作业ID(31),并将其分派给其中一个计算主机。作业输出记录在用户的主目录中,我们看到脚本的输出。正如预期的那样,在我们的AWS机器实例之一,真实世界(而不是在Docker Container)中运行。
要在容器中运行作业,过程几乎相同。我只需要告诉Altair网格引擎,我们要使用Docker容器并指定要使用的Docker映像。为此,我使用了- l在命令行上切换(小写l)以请求两个资源:Docker.和docker_images。这将选择主机Docker.资源设置为true,并在可用映像列表中包含所需的Docker映像(CentOS:最新)。我们使用通配符将图像名称与每个主机上可用的更长的逗号分隔的图像列表相匹配。如果图像在主机上不可用,Altair网格引擎可以自动将图像自动拉动,但出于性能原因,最好在主机上运行已在本地存储的图像。
从网格引擎用户的角度来看,一切工作方式都是一样的。用户可以像删除或操作其他作业一样删除或操作容器作业。容器化的作业显示为Altair Grid Engine作业32,并在一个AWS主机上的容器中运行。
如果我在执行主机上监视Docker,我看到一个Docker容器已经基于映像centos映像启动。作为一个Grid Engine用户,这对我来说是透明的,但是知道发生了什么是很好的。
作业完成后,我从作业的输出文件中看到作业在Docker命令行(4539E0B94529)所示的容器中运行。
使用软资源请求在飞行中提取Docker图像
在上面的示例中,我知道其中一个计算主机已经拥有所需的Docker映像(CentOS:最新)。通常,需要在任何集群主机上存在所需的图像。Altair网格引擎可以自动下载所需的图像,但要执行此操作,我们需要使用软资源请求。软资源请求向Altair网格引擎指示图像是“很好的”,但没有必要在主机上安排作业。在该示例中,下面我们指定了不同的Docker映像(ubuntu: 14.04),并使其出现为软请求而不是硬请求。
Altair网格引擎试图找到所需的主机ubuntu图像,但是当没有可用时,它将作业安排到符合硬资源要求的主机(Docker.), Altair Grid Engine会自动触发docker守护进程来下载所需的映像并启动容器。重新运行了qhost命令表明,我们的第一个计算主机现在具有所需的图像,并且工作如前所述。
这是一个重要的特性,因为它意味着用户可以保证即使在计算主机上没有所需的Docker映像时,他们的容器化作业也能运行。
了解幕后发生的事情
要完成所有这些,网格引擎在幕后做了一些聪明的东西。首先,由于这不是二进制作业,因此网格引擎必须将脚本从提交主机转移到执行主机。从那里,脚本被复制到假脱机目录中。
对于能够看到脚本的容器,将需要将SPOOL目录绑定(Docker项)到容器。文件in.$ sge_root.也绑定到容器,Altair网格引擎会自动检测可能需要的任何其他目录,并在容器内的子目录/ UGE_MNT下绑定它们。其他目录绑定到包括用户主目录的目录,以便在用户期望它与通过通过传递的目录以及通过的目录一起编写作业输出- o或- e开关QSUB.命令行。
这Docker.检查命令使我们能够在工作运行时发生的情况。我想看到关于这项工作的详细信息,所以我保存了输出码头工人检查在作业的容器运行的情况下,文件如图所示:
有太多细节码头工人检查命令提供完整的输出,所以我缩写了它以显示一些感兴趣的物品。
首先,注意当Docker作业运行时,入口点是sge_container_shepherd.根据集装箱内部运行,程序基本上“牧羊人”的计划。这是网格引擎二进制文件需要在集装箱内部提供的网格引擎二进制文件之一/ uge_mnt.。其他绑定显示了其他绑定/ var.那/选择,/home/bill(我们的工作ran作为账单),以便从容器中可以访问这些。
工作目录被设置为主机上作业的spool目录,与网格引擎作业相关的其他信息存储在Docker标签中。
从Linux管理员的角度来看,了解计算主机上的过程树也是有效的。输出Psstree.(要么ps auxf)过于兼容,以完全显示,但下面显示了流程层次的剥离版本。
通常,当Grid Engine用户提交一个非容器化作业时,执行主机上的进程层次结构如下所示:
网格引擎作业是sge_execd执行主机和执行的过程由a管理SGE_SHEPHERD.过程。实际工作负载在提交作业的用户的用户ID下运行。
当与容器作业运行相同的作业时,包含作业的进程是Docker守护程序的子项。在这个观点中,我们看到了sge_container_shepherd.在容器内运行的进程是实际工作的父级。
其他有用的技巧和酷的东西
通常,Altair网格引擎作业将希望操纵特定目录中的数据,例如,从所有计算主机可访问NFS共享。目录可以使用docker手动将手动绑定到容器中Host-dir:container-dir格式使用xd切换以传递Docker选项。
在计算节点上,有一个目录叫做/ nfs_share可能包含共享数据。在本例中,我们可以绑定目录/数据在共享的docker容器中/ nfs_sharedocker主机可见的文件系统。在Altair Grid Engine命令行上传递的路径需要引用容器中可见的路径。
到目前为止,这些例子已处理脚本,而不是二进制文件。二进制文件在某种程度上更容易,因为它假设调用的命令已经驻留在容器中。在Docker容器中启动二进制文件时,这是一个好主意,以指定应该用于启动二进制文件的shell。否则shell可能默认为CSH.,通常不存在于码头容器中。一个例子如下所示:
Altair Grid Engine Docker集成有许多功能,包括支持阵列作业,MPI并行作业以及访问GPU设备。此外,Grid Engine可用于启动和管理包装的容器,将入口点构建到容器图像中的长期运行服务。我们将在后续文章中介绍其中一些其他主题。
在Altair,我们已经在网格引擎集群上积累了许多运行集装箱的经验。如果您对本文有任何意见或疑问,我很乐意获得您的反馈。