Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker 快速部署 Slurm 集群

Docker 快速部署 Slurm 集群

作者头像
zhonger
发布于 2022-10-28 03:05:46
发布于 2022-10-28 03:05:46
6.1K20
代码可运行
举报
文章被收录于专栏:仲儿的专栏仲儿的专栏
运行总次数:0
代码可运行

前言

  前段时间为了能让运行的 CONQUEST 任务在后台运行、并尽可能地进行资源调控,特别采用了 Slurm 作业管理系统。Slurm 单节点的部署配置还是比较简单的,直接运行本人构建好的镜像就可以了。随着对 Slurm 的深入了解,笔者发现 Slurm 在集群部署上比其他作业管理系统更加简单方便,因此有了在多机集群上部署一个 Slurm 集群的想法。经过调查发现以下两种通用的部署 Slurm 集群的方案:

  • 第一种是:在物理机或虚拟机上采用 Slurm + Database 的方式部署,
  • 第二种是:在 Docker 集群上使用 Docker 部署。

  考虑到应用环境的部署应尽可能与物理机环境隔离开,所以个人偏向于采用 Docker 的方式部署 Slurm 集群。再者说,无论是部署、管理上的便捷性,还是未来的可扩展性,这种方式都是更有优势的。在网上经过一番搜索后,本人发现了一个类似的“使用 Docker 部署 Slurm 集群”的开源项目 SciDAS/slurm-in-docker。总的来说,这个项目在设计上的确是很完整的,设计的架构图也非常好,但是在对这个项目的学习和实践过程中也发现一个问题。不知道是不是经过了版本迭代的缘故,有一些代码的目录组织有些出入,在构建基础镜像的时候就失败了。加之,这个项目采用了数据库,而且只适用于单机上部署 Slurm 集群,和本人的诉求有些不一致。所以也排除了这种方法。

  本人目前的条件和需求如下:

  • 拥有若干台服务器的非 root 权限用户账号和 Docker 运行权限;
  • 服务器之间共用了同一个 NAS 服务器;
  • 想要在这些服务器上搭建一个可用的高性能 Slurm 集群。

  根据往常的经验,觉得可能还是需要先 Docker 集群化,然后在 Docker 集群上运行 Slurm 集群。而目前比较熟知的流行的 Docker 集群化方法主要有 swarm,kubernetes 以及 rancher 等,但是这些基本上都需要 root 权限,并需要安装某些软件在物理机系统上,这与现有的条件和想法还是有点冲突。所以产生了一个大胆的想法——如果没有 Docker 集群,能不能部署可用的高性能 Slurm 集群呢?这个想法其实在上面提到的开源项目的架构图(下图)中就找到了答案。如图所示,对于 Slurm 集群来说最重要的其实是 6817 和 6818 两个端口的通信。图中的数据库的目的是为了保证 Slurm 节点的用户名一致,事实上可以想到别的办法来替代它。所以,即使把数据库去掉,也不建立集群节点之间的相互无密码登录,只要保证 Slurm 节点的这两个端口能够互相访问到,就可以成功部署 Slurm 集群。

(上图引用自 https://github.com/SciDAS/slurm-in-docker )

安装配置

  Slurm 集群的节点之间通过 6817 和 6818 两个端口进行通信,其基础的配置就是 munge key 和 slurm.conf 两个文件一致,相互之间互信。如果不同服务器上采用相同的 Docker 镜像的话,那么 munge key 肯定是一致的。而 slurm.conf 文件的一致性可以在启动时用挂载的方式使用同样的文件来保证。当然,这里也需要集群节点之间能够互相“认识”对方,即可以通过主机名来知道对方的 ip,并通过开放的端口进行通信。为此,使用同样的、有完整 ip 对应的 hosts 文件以及固定的 hostname 也是有必要的。

  事实上,这里有两点我们还需要注意一下:

  • 当 Slurm 集群中的节点互相之间都可以通过给定的两个端口进行通信之后,任何一个节点都可以作为任务管理节点。这也就是说,节点之间是等价的,不存在绝对的管理节点,这也从侧面提高了集群的可靠性。
  • 服务器的操作系统和 Docker 版本对这个方案没有任何影响,只要 Docker 镜像完全相同即可。

  因为本人的主要目的还是要在 Slurm 集群上运行 CONQUEST,所以就以 CONQUEST 的 slurm-ssh 镜像为例。

环境描述

  • 有三台已安装 Docker 的 Ubuntu 服务器
  • 已安装 docker-compose 工具

部署配置文件

  将 slurm.conf 和 Hostname 文件放置在 NAS 共享目录 /data/slurm/,文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=worker01
#ControlAddr=
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/pgid
ReturnToService=1
SlurmctldPidFile=/var/run/slurm-llnl/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm-llnl/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurm-llnl
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
#SchedulerType=sched/backfill
#SelectType=select/linear
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=workq
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=3
#SlurmctldLogFile=
#SlurmdDebug=3
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=worker01 CPUs=128 State=UNKNOWN
NodeName=worker02 CPUs=128 State=UNKNOWN
NodeName=worker03 CPUs=128 State=UNKNOWN
PartitionName=cpu Nodes=ALL Default=YES MaxTime=INFINITE State=UP
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.100.11     worker01
192.168.100.12     worker02
192.168.100.13     worker03

启动 Docker 实例

  为了便于启动和管理 Docker 实例,这里建议采用 docker-compose 的方式。以下为 docker-compose.yml 文件内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.9'

services:
  worker01:
    image: zhonger/conquest:slurm-ssh
    container_name: worker01
    stdin_open: true
    tty: true
    volumes: 
      - /data/slurm/slurm.conf:/etc/slurm-llnl/slurm.conf
      - /data/slurm/hosts:/etc/hosts
      - /data/cq:/home/ubuntu/cq
    ports:
      - 6817:6817
      - 6818:6818
    environment:
      - GITHUB_NAME=zhonger
    restart: always
    hostname: worker01
    networks:
       extnetwork:
          ipv4_address: 192.168.16.2

networks:
   extnetwork:
      ipam:
         config:
         - subnet: 192.168.16.0/24
           gateway: 192.168.16.1

注意

  这里为了支持 ssh 登录特意添加了 networks 节来规范容器实例 ip,非管理节点建议去掉这一节。另外,每个主机上的 container_name 和 hostname 都应该分别对应修改为 worker02 和 worker03。

  使用 docker-compose up -d 命令在三台主机上启动容器实例(此处主机启动实例先后顺序没有区别,可以随意调整)。在最后启动的实例所在宿主机上使用 docker logs {container_name} 命令可以看到所有 Slurm 集群节点都处于 idle (空闲)状态。至此,一个可用的 Slurm 高性能集群就搭建成功了,是不是觉得有点简单哈?

问题解决

问题

问题描述:偶然发现 Slurm 集群中某些节点状态变成了 Unknown 怎么办?

解决办法

解决办法:在该节点的容器内使用 sudo service slurmctld restart 尝试重启 slurmctld 服务。一般情况下这样做是有效的,但也有不好使的时候,那么就可以在宿主机上 docker-compose.yml 所在目录使用 docker-compose down && docker-compose up -d 重建该节点。注意,由于配置文件和主要代码文件都是用的 NAS,这里的容器销毁和重建是不会有任何影响的。

问题

问题描述:集群的管理节点成功启动但是一直处于 Unknown 状态怎么办?

解决办法

解决方法:这个问题和上一个问题描述上听着有点差不多,但是有所区分。如果是管理节点处于 Unknown 状态,并且经过上一问题解决方法还是不在线,那么就需要将管理节点调整到其他节点。调整管理节点就是将 slurm.conf 文件中 ControlMachine 字段修改一下就可以,修改之后对所有节点进行重建(不是重启容器实例哦)。

问题

问题描述:如果没有共用 NAS 怎么办?

解决办法

解决方法:在没有共用 NAS 的情况下,想要 Slurm 集群的节点共用同样的配置和代码目录可以通过“在管理节点物理机上搭建 NFS 服务器”的方式来解决。关于 NFS 服务器的搭建和容器中挂载 NFS 文件系统的有关教程可以在网络上搜索到,这里就不再赘述了。

问题

问题描述:集群中的某个节点在集群中的状态为 Down 怎么办?

解决办法

解决方法:这种情况下,只需要在 Down 状态的节点中运行 sudo scontrol show node 命令确认一下是否因为物理机重启而造成节点状态发生改变。如果是 Reason=Node unexpectedly rebooted,就是这个原因导致的。可以采用 sudo scontrol update NodeName=worker01 State=IDLE 命令将该节点的状态重新设为空闲可用。

参考资料

版权声明:如无特别声明,本文版权归 仲儿的自留地 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 Docker 快速部署 Slurm 集群 》

本文链接:https://cloud.tencent.com/developer/article/2142981

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
我搭建了flannel,使得三台主机上的容器能相互联通,在成功启动slurm服务后,三台节点都是idle状态,但是srun -N2 hostname后,只有当前所在node能执行任务,另一台node无法执行,日志显示connect io:connection refused,不知道是什么原因
我搭建了flannel,使得三台主机上的容器能相互联通,在成功启动slurm服务后,三台节点都是idle状态,但是srun -N2 hostname后,只有当前所在node能执行任务,另一台node无法执行,日志显示connect io:connection refused,不知道是什么原因
11点赞举报
srun 申请两个节点没有尝试过,个人一般使用 sbatch 提交脚本的方式申请多节点,测试运行是没有问题的。
srun 申请两个节点没有尝试过,个人一般使用 sbatch 提交脚本的方式申请多节点,测试运行是没有问题的。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
CONQUEST 编译安装指南 Slurm 篇
  在实际的生产环境中,使用单用户模式直接运行命令的机会不是很多,通常是采用提交作业任务给集群计算的方式。这样一来既能节约资源和时间,又能申请到更大规模的计算资源,对于平台管理人员还是用户来说都是非常有利的。国家超算中心,地方超算中心,学校超算中心一般都对外提供这样的服务,不过需要按核时进行计费。所谓“核时”就是一个 CPU 核运行一个小时,这也是高性能计算中通常使用的资源衡量单位。作为超算中心或者高性能集群,必不可缺的就是集群作业管理系统,它可以根据用户的需求,统一管理和调度集群的软硬件资源,保证用户作业公平合理地共享集群资源,提高系统利用率和吞吐率。
zhonger
2022/10/28
2.7K0
【swarm】docker环境下的集群服务
Docker Client:客户端 Swarm Manager: 管理器节点 Scheduler:调度器
Xiongan-桃子
2023/06/10
3280
【swarm】docker环境下的集群服务
附016.Kubernetes_v1.17.4高可用部署
Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。HA有通常有如下两种架构:
木二
2020/06/18
9470
附016.Kubernetes_v1.17.4高可用部署
附022.Kubernetes_v1.18.3高可用部署架构一
Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。
木二
2020/06/16
1.3K0
基于 Docker 快速部署 Elasticsearch 集群
在刚刚新建的目录(/root/app/elasticsearch)创建docker-compose.yml文件,基于镜像elasticsearch:7.4.0
茶半香初
2021/11/26
1.6K0
基于 Docker 快速部署 Elasticsearch 集群
附037.Kubernetes_v1.29.2高可用部署架构二
该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm 、kubelet 、kubectl。
木二
2024/03/11
1.1K0
slurm--网络配置指南
在Slurm集群中,有很多组件需要能够相互通信。有些站点有安全要求,不能打开机器之间的所有通信,需要有选择地打开必要的端口。本文件将介绍不同的组件需要怎样才能相互交流。
姚华
2023/02/22
2.7K0
Prometheus监控Docker Swarm集群(二)
前面我讲解了对于Docker的一些监控知识以及Docker监控开源工具Weave Scope做了一个概述,以及简单安装。
Kubernetes技术栈
2020/07/02
2.7K0
Prometheus监控Docker Swarm集群(二)
使用Docker三剑客部署集群
DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。
Marky Lumin
2018/01/23
2.1K0
Docker Swarm 初步认识 及 集群搭建
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
鳄鱼儿
2024/05/22
2300
Docker Swarm 初步认识 及 集群搭建
Slurm学习笔记(二)
scontrol show partition显示全部队列信息,scontrol show partition PartitionName或 scontrol show partition=PartitionName显示队列名PartitionName的队列信息,输出类似:
种花家的奋斗兔
2021/01/06
4.4K0
017.Kubernetes二进制集群扩容worker
为了更方便远程分发文件和执行命令,本实验配置master节点到其它节点的 ssh 信任关系。
木二
2020/07/01
5680
017.Kubernetes二进制集群扩容worker
slurm--核算和资源限制
Slurm可以被配置为收集每个作业和作业步骤执行的核算信息。核算记录可以被写入一个简单的文本文件或一个数据库。目前正在执行的作业和已经终止的作业的信息都是可用的。sacct命令可以报告正在运行或已经终止的作业的资源使用情况,包括单个任务,这对于检测任务之间的负载不平衡非常有用。sstat命令可用于仅对当前正在运行的作业进行统计。它也可以为你提供关于任务之间不平衡的有价值的信息。sreport可以用来生成基于特定时间间隔内执行的所有作业的报告。
姚华
2023/03/08
3.6K0
Slurm 快速入门:资源管理与作业调度系统
本文将介绍slurm,一个 Linux服务器中的集群管理和作业调度系统。并对其基础命令和运行方式进行实战演练。
数据科学工厂
2023/02/27
5.3K0
Slurm 快速入门:资源管理与作业调度系统
在腾讯云上构建高性能计算平台:从零开始的实战指南
随着科技的发展,高性能计算(High-Performance Computing,HPC)已成为数据科学、人工智能、金融建模等领域的关键需求。作为一名技术爱好者,我决定在腾讯云上构建一个高性能计算平台,以满足我在大数据分析和机器学习训练方面的需求。本文将详细介绍这个过程,希望能为其他有相似需求的朋友提供一些参考。
Echo_Wish
2025/01/22
2520
在腾讯云上构建高性能计算平台:从零开始的实战指南
2-Kubernetes入门之CentOS安装部署集群
描述: 通过上一篇K8s入门体系架构学习我们初步的了解单节点的master与worker的工作部署流程,但是前面所用的是kuboard所提供的安装脚本作为测试练手安装还是可以将就的,但是在实际的生产的环境中由于业务的复杂性和多样性需要依靠集群来保证其安全可靠性;
全栈工程师修炼指南
2022/09/29
1.1K0
2-Kubernetes入门之CentOS安装部署集群
Exceptionless 5.0.0本地Docker快速部署介绍
在之前我有专门写两篇文章介绍过Exceptionless这款开源日志项目的使用和部署,但是当时是基于4.1.0版本(2017年的release),时隔两年多Exceptionless也推出了5.0.0版本。
心莱科技雪雁
2019/11/07
1.1K0
docker-compose快速部署elasticsearch-8.x集群+kibana
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文《Docker下elasticsearch8部署、扩容、基本操作实战(含kibana)》介绍了用docker快速部署es和kibana的过程,然而整个过程人工操作步骤还是多了点,能不能更简单些呢?毕竟很多时候大家关注的是使用,不愿在部署上费太多时间 借助docker-compose,可以将es集群+kibana的安装过程可以进一步简化,精简后的步骤
程序员欣宸
2022/06/13
5.5K2
docker-compose快速部署elasticsearch-8.x集群+kibana
附018.K3S-ETCD高可用部署
K3S是一个轻量级Kubernetes发行版。易于安装,内存消耗低,所有二进制文件不到40mb。
木二
2020/05/22
2.1K0
附018.K3S-ETCD高可用部署
docker swarm 和 docker-compose ?
要用到的通信接口开放,集群节点之间保证2377/TCP、7946/TCP、7946/UDP和4789/UDP端口通信(或者直接关闭防火墙 systemctl stop firewalld)
友儿
2022/09/13
1K0
推荐阅读
相关推荐
CONQUEST 编译安装指南 Slurm 篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验