
Slurm是一套功能非常强大的集群调度系统,能够实现按需调度计算资源。Singularity是一套轻量的容器系统,它可以无缝的和现有的环境结合,为应用提供一个”运行时环境“,你可以把它想象成一个没有Daemon进程没有网络虚拟化技术的Docker。那二者相结合会产生什么有趣的结果呢?
应用场景
我们先讨论一下这两个技术相结合的应用场景。假设你是一个高大上的用户,需要在一个集群上运行一些高大上的科学计算任务,例如利用集群实现DNA的快速比对,你还会用集群进行气象数据的预测、用集群进行汽车风阻数据模拟计算等等,总之你是一个会在集群中使用各种应用的用户,这样的应用场景在研究所或者高校是非常常见的。显然这些应用都有各种不同的配套软件,而这些软件又可能在不同的系统中才有,那你会怎么办呢?你一定会想到应用容器技术。这就是Slurm结合Singularity的意义。关于为什么要使用Singularity而非Docker,我在另外一篇文章中有介绍到,这里你只需要知道Singularity是非常适合HPC环境的容器技术即可。
技术分析
如果你用过OpenStack,应该知道一个最基本的提供计算服务的云环境需要哪些基本服务,分别是Nova、Neutron、Glance和Keystone,它们分别提供计算、网络、镜像及整个系统的身份鉴权。Nova是Openstack的计算服务,负责启动实例、调度实例、管理系统计算资源,Glance则为实例提供镜像管理。Slurm和Singularity可以实现容器启动、资源调度和镜像使用这三个核心功能。这个过程很简单也很有趣,如果我们把启动指定容器的命令作为一个计算任务丢给Slurm,我们就在一台机器上启动了容器,Slurm能够通过cgroups限制作业对硬件资源的使用。如此一来我们就轻易的实现了一套简单粗暴的容器云。
上面的内容简单总结就是: 将启动容器这个操作,作为一个作业由Slurm调度到某个计算节点上执行
技术验证
我们在一套实验环境中进行上述实验,先在两台安装CentOS系统的机器上部署Slurm及Singularity,克隆一个Ubuntu的系统镜像,然后写一个简单的脚本:
1 |
|
再往调度系统中提交这个作业:
1 | srun -p demo01 -w node01 --pty test.sh |
看看效果吧:
node01本身安装的系统是CentOS,从输出我们可以看到我们的bash实际运行在Ubuntu的系统内。并且这是一个Slurm的作业,这个环境下使用的硬件资源、时长等等都可以被限制。这样一来,有了资源调度、限制、环境隔离……再深入一点,我们如果能让用户随时重新连接到这个环境内,提供命令行或者web的操作,这不就是一个轻量级的容器云了吗?事实上笔者已经实现了上述内容,细节太多就不展开说了。
总结
这是一次有趣且有价值的尝试,也是一次技术的融合与碰撞。经过这次尝试再反观目前的云平台技术,以OpenStack为代表的一站式解决方案实际上是对各种虚拟化和云计算相关的技术的整合,其中包含了许多云和虚拟化相关的技术,但是也由于其架构和组件众多带来很多复杂性,无论是安装部署或者开发维护都变得较为复杂。但是OpenStack的架构以及其背后的各种技术是非常值得借鉴与参考的,他们有多种替代品,而将各个组件拆分出来独立使用也可以打造出新的东西,打开新世界的大门。