跳到内容

使用Altair网格引擎与Docker

这比你想象的要简单

对于HPC应用程bob电竞官方序,容器是安装软件和确保跨集群和云的可移植性的好方法。容器可以封装完整的、预先测试过的环境,允许用户混合和匹配不同的应用程序和版本,而不会产生冲突。bob电竞官方软件提供商,如ESIOpenFoamUbercloud.而且其他人在容器中越来越多的包装软件,以便于部署。

幸运的是,Altair Grid Engine对Docker的本机支持使得运行容器化应用程序变得轻而易举。bob电竞官方在本文中,我将解释如何在Altair Grid Engine集群上部署、运行和管理容器化的工作负载,并对Altair Grid Engine如何在幕后管理容器化的工作负载提供一些见解。

停止您的集群

如果您的Compute主机上没有安装Docker,这是一个很好的开始。添加Docker不应该破坏现有应用程序,但首先在非生产主机上测试事物始终是一个bob电竞官方好主意。添加Docker就像添加Java Runtime。Docker Engine为需要它的集装箱工作负载提供运行时支持。

作为谨慎的语言,不要假设您必须在群集主机上安装最新版本的Docker。Docker API像天气一样改变,因此您将想下载您的版本的Altair网格引擎支持的稳定Docker版本。

在此示例中,我在Amazon Web服务(AWS)上的CentOS 7上运行Altair网格引擎V8.5.4。我用过AWS市场作为安装Grid Engine集群的一种简单方法。参考Altair Grid Engine发布说明,Docker 17.03版本是Altair Grid Engine 8.5.4支持的最新Docker,所以我将在我的集群计算主机上使用免费的Docker Community Edition包(Docker -ce-17.03.0.ce-1.el7.centos.x86_64)。

配置Docker存储库后(我很快介绍),您可以使用yum列表命令显示可用的Docker版本。在第二列中返回的文本是版本字符串Docker发布,你会想要做一个记录。

要显示可用的Docker 17.03包,我使用了这个命令:

根据您的操作系统,您可能需要使用不同的命令。这Docker CE文件有关其他Linux版本的详细说明,包括Debian,Fedora和Ubuntu。

由于我需要在多个主机上安装Docker,因此构建安装Docker以保存在每个主机上的相同命令中的脚本进行了意义。以下脚本以root和(至少为我至少)运行(对我而言)正确安装我的CentOS 7 Altair网格引擎计算主机上的Docker。

该脚本执行以下步骤:

  • 它安装所需的包装包括yum-ilils.其中包含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的限制。避免错误消息(docker-ce-selinux包被docker-ce ....淘汰)阻止Docker安装我需要手动将过时设置为false百胜命令行和下载docker-ceDocker-Ce-Selinux一起。该问题是详细解释的在这里

你需要注意这个细节。小事情总是最让人头疼的!

安装Docker后,您可以启动Docker并验证它是否通过运行几个docker命令并运行hello world码头毂的容器。这是一个好主意systemctl.启用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是一个有用的技巧,可以判断您的脚本是否在容器中运行。

我把这个脚本作为一个普通的、非容器作业提交给Grid Engine:

该脚本被分配一个作业id(31),并被分派到其中一个计算主机。作业输出记录在用户的主目录中,我们可以看到脚本的输出。正如预期的那样,作业在现实世界中(而不是在Docker容器中)运行在我们的一个AWS机器实例上。

要在容器中运行作业,过程几乎是相同的。我只需要告诉Altair Grid Engine,我们想使用一个Docker容器,并指定要使用的Docker图像。为了做到这一点,我使用- l在命令行上切换(小写l)以请求两个资源:Docker.docker_images..这将使用Docker.资源设置为TRUE和主机,其中可用图像列表包含我们所需的Docker Image(CentOS:最新).我们使用通配符将映像名称与每个主机上可用的较长的以逗号分隔的映像列表进行匹配。如果映像在主机上不可用,Altair Grid Engine可以自动为您提取映像,但出于性能原因,最好在已经本地存储了映像的主机上运行。

从Grid Engine用户的角度来看,一切工作方式都是相同的。用户可以像删除其他作业一样删除或操作容器作业。容器化作业显示为Altair Grid Engine作业32,并在我们的AWS主机上的一个容器中运行。

如果我监视执行主机上的Docker,我会看到码头容器基于图像CentOS图像启动。作为网格引擎用户,这对我来说是透明的,但很高兴知道发生了什么。

作业完成后,我从作业的输出文件中看到作业在容器中运行,如docker命令行(4539e0b94529)所示。

使用软资源请求在飞行中提取Docker图像

在上面的示例中,我知道其中一个计算主机已经有所需的码头图像(CentOS:最新).通常,需要在任何集群主机上存在所需的图像。Altair网格引擎可以自动下载所需的图像,但要执行此操作,我们需要使用软资源请求。软资源请求向Altair网格引擎指示图像是“很好的”,但没有必要在主机上安排作业。在该示例中,下面我们指定了不同的Docker映像(Ubuntu:14.04)我们知道在群集主机上不可用,并使其存在软件请求而不是硬请求。

Altair Grid Engine尝试找到需要的主机ubuntu图像,但是当没有可用时,它将作业安排到符合硬资源要求的主机(Docker.), Altair Grid Engine会自动触发docker守护进程来下载所需的映像并启动容器。重新运行了qhost命令显示,我们的第一个计算主机现在拥有所需的映像,作业像以前一样运行。

这是一个重要的特性,因为它意味着用户可以保证他们的容器化作业可以运行,即使所需的Docker映像在计算主机上不可用。

了解幕后发生的事情

要完成所有这些,网格引擎在幕后做了一些聪明的东西。首先,由于这不是二进制作业,因此网格引擎必须将脚本从提交主机转移到执行主机。从那里,脚本被复制到假脱机目录中。

对于能够看到脚本的容器,将需要将SPOOL目录绑定(Docker项)到容器。文件in.$ sge_root.也绑定到容器,Altair Grid Engine自动检测可能需要的任何其他目录,并将它们绑定到容器内的子目录/uge_mnt下。将其他目录绑定到包含用户主目录的目录,以便作业输出可以写入用户期望的位置,以及通过- o- e开关QSUB.命令行。

Docker.检查命令使我们能够在工作运行时发生的情况。我想看到关于这项工作的详细信息,所以我保存了输出Docker检查在作业的容器运行的情况下,文件如图所示:

有太多细节Docker检查命令提供完整的输出,所以我缩写了它以显示一些感兴趣的物品。

首先,注意当Docker作业运行时,入口点是sge_container_shepherd.根据集装箱内部运行,程序基本上“牧羊人”的计划。这是网格引擎二进制文件需要在集装箱内部提供的网格引擎二进制文件之一/ uge_mnt..其他绑定显示了其他绑定/ var./选择,/家庭/账单(我们的工作作为bill运行),因此这些需要从容器访问。

工作目录被设置为主机上作业的spool目录,与Grid Engine作业相关的其他信息存储在Docker标签中。

从Linux管理员的角度来看,了解计算主机上的过程树也是有效的。输出pstree(或者PS AUXF.)过于兼容,以完全显示,但下面显示了流程层次的剥离版本。

通常,当一个Grid Engine用户提交一个非容器化作业时,执行主机上的进程层次结构是这样的:

网格引擎作业是sge_execd执行主机和执行的过程由a管理SGE_SHEPHERD.的过程。实际工作负载在提交作业的用户的用户ID下运行。

当同一个作业作为容器作业运行时,构成该作业的进程是Docker守护进程的子进程。在这个视图中,我们看到sge_container_shepherd.运行在容器内的进程是实际作业的父进程。

其他有用的提示和酷炫的东西

Altair Grid Engine作业通常希望操作特定目录中的数据,例如可以从所有计算主机访问的NFS共享。目录可以使用Docker’s手动绑定到容器中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,我们已经在网格引擎集群上积累了许多运行集装箱的经验。如果您对本文有任何意见或疑问,我很乐意获得您的反馈。