由于项目组前期调研,需要通过slurmrestd服务来调用Slurm集群的能力,通过Rest接口进行作业的提交、节点信息、作业信息的查询,因此需要完成slurmrestd服务的配置和启动。
本文档建立在
05-19 Ubuntu18.04源码安装Slurm 21.08.md
文档的基础上,由于上述文章中部署的文档并不包含libjwt模块,slurmrestd服务通过使用JSON Web Tokens(JWT)对用户身份进行认证,因此需要重新部署slurm集群,以提供对于JWT认证的支持。
slurm
20.02版本中最新推出的功能。
Slurm provides a RFC7519 compliant implementation of JSON Web Tokens (JWT). This authentication can be used as an AuthAltType, usually alongside auth/munge as the AuthType. The only supported communication direction is from a client connecting to slurmctld and slurmdbd. This means that certain scenarios (specifically interactive jobs using srun) are currently not supported for clients with auth/jwt enabled (or that have SLURM_JWT in their environment).
需要首先明白,Slurm REST API是什么?
通过上图,我们可以简单的理解到,s在slurm集群内部的通信方式主要是采用Munge实现的,它们都属于Munge边界,而slurm的控制daemon和slurmdbd 进程在横向上又与slurmrestd作为一个整体,采用的AuthAltTypes边界,即JWT认证方式认证的。
slurmrestd整体配置过程如下所示:
配置的主要过程可以参见JWT认证。
由于已经配置好的slurm集群配置文件包括slurm.conf, slurmdbd.conf, slurmd.conf,为防止需要重新配置,可以备份一下/usr/local/slurm/etc
目录。
# cp /usr/local/slurm/etc ~
由于JWT需要libjwt库,库文件和开发头文件在Slurm被编译的时候,都必须可用,这是使用auth/jwt的前提。
在进行源码编译时,按照
05-19 源码安装路径约定.md
约定执行。
# git clone --depth 1 --single-branch -b v1.12.0 https://github.com/benmcollins/libjwt.git libjwt
# mv libjwt libjwt-1.12.0
# cd libjwt-1.12.0
# autoreconf --force --install
# ./configure --prefix=/usr/local/libjwt-1.12.0
在使用./configure配置时,报出如下问题:
但之前自己曾经已经把jansson安装在/user/local/jansson-2.14
,经过排查,发现需要考虑调整PKG_CONFIG_PATH环境变量,参见安装过程中出现PKG_CONFIG_PATH的问题解决方法的解决办法,由于之前编译过jansson-2.14的文件还在,因此可以采用如下的方式解决
# cd ~/jansson-2.14
# cp jansson.pc /usr/lib/pkgconfig/jansson.pc
然后继续执行如下程序,编译安装libjwt即可
# ./configure --prefix=/usr/local/libjwt-1.12.0
# make -j
# make install
# cd /usr/local
# ln -s libjwt-1.12.0 libjwt
完成libjwt的安装。
源码编译Slurm集群的过程参见
05-19 Ubuntu18.04源码安装Slurm 21.08.md
但需要修改的是,源码编译的部分,即./configure的部分
# ./configure --with-pmix=/usr/local/pmix --with-rrdtool=/usr/local/rrdtool --with-hwloc=/usr/local/hwloc --with-jwt=/usr/local/libjwt --prefix=/usr/local/slurm-21.08.8
其他过程不变。
然后把备份过的
新建JWT key到控制器。该文件位于/var/spool/slurm/statesave/jwt_hs256.key
# dd if=/dev/random of=/var/spool/slurm/statesave/jwt_hs256.key bs=32 count=1
# chown slurm:slurm /var/spool/slurm/statesave/jwt_hs256.key
# chmod 0600 /var/spool/slurm/statesave/jwt_hs256.key
# chown slurm:slurm /var/spool/slurm/statesave
# chmod 0755 /var/spool/slurm/statesave
由于slurmrestd服务需要主动与控制进程和slurmdbd服务使用JWT交互,因此需要配置这两个配置文件。
在两个配置文件添加如下的内容即可:
AuthAltTypes=auth/jwt
AuthAltParameters=jwt_key=/var/spool/slurm/statesave/jwt_hs256.key
需要注意的是,slurmdbd进程仅仅运行在管理节点上,但修改了两个文件之后,还是应该把两个配置文件同步到计算节点上。
重启slurmctld
和slurmdbd
。
重启之后,可以进行一个简单的认证,通过scontrol
命令为用户生成一个token
。
root@slurm-manager:~/jansson-2.14# scontrol token username=root
SLURM_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTM0ODQxMDAsImlhdCI6MTY1MzQ4MjMwMCwic3VuIjoicm9vdCJ9.oKnIJVq4HGkSXdL_LqReZtd2Pk3VcBmlv94_xmYHNng
这表明,jwt服务已经基本配置成功了。
为了方便守护,可以进一步把Slurm为我们准备的slurmrestd.service拷贝至/etc/systemd/system目录下,该文件位于slurm安装包源文件目录下
root@slurm-manager:~# cd ~/slurm-21.08.8/
root@slurm-manager:~/slurm-21.08.8# cp etc/slurmrestd.service /etc/systemd/system
修改成如下内容:
root@slurm-manager:/etc/systemd/system# cat slurmrestd.service
[Unit]
Description=Slurm REST daemon
After=network-online.target munge.service slurmctld.service
Wants=network-online.target
ConditionPathExists=/usr/local/slurm-21.08.8/etc/slurm.conf
[Service]
Type=simple
User=zjlab
EnvironmentFile=-/etc/sysconfig/slurmrestd
# Default to local auth via socket
#ExecStart=/usr/local/slurm-21.08.8/sbin/slurmrestd $SLURMRESTD_OPTIONS unix:/usr/local/slurm-21.08.8/com/slurmrestd.socket
# Uncomment to enable listening mode
Environment="SLURM_JWT=daemon"
ExecStart=/usr/local/slurm-21.08.8/sbin/slurmrestd $SLURMRESTD_OPTIONS 0.0.0.0:6820 -vvvvv
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
首先是把第一行ExecStart注释,然后取消对于环境变量Environment
的注释,最后使用第二个ExecStart,并配置需要的端口,为日志调试方便,我添加了5个vvvvv,以打印调试日志。
注意: Export the SLURM_JWT environment variable before calling any Slurm command.
注意:启动slurmrestd服务的用户不能是root用户和SlurmUser用户,因此在文件中配置了User=zjlab
这一步骤很关键,对应了systemrestd.service中的Environment行。
然后重新启动即可。
# systemctl daemon-reload
# systemctl restart slurmrestd
注意:在使用Slurm Rest API时,如果要执行运行作业的请求时,需要使用root用户及其对应的token,其他的查询接口,可以使用SlurmUser及其token。
注意:在使用token时,不要包括SLURM_JWT=前缀
使用Postman验证请求。
为了方便,在Collection中的Pre-request Scripts添加脚本
pm.request.addHeader("X-SLURM-USER-NAME:root");
pm.request.addHeader("X-SLURM-USER-TOKEN:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTM0ODQ4MTIsImlhdCI6MTY1MzQ4MzAxMiwic3VuIjoicm9vdCJ9.jHveZowLQNZIxrFot4Cgmrpo8f7jheYuuhp2WUoGHGg");
以设置全局Header,这是为了把认证用户和token身份提供给slurm集群进行认证的。
如上,接口正常请求,则表明slurmrestd服务已经正常工作。
注意:An optional lifespan=$LIFESPAN option can be used to change the token lifespan from the default 1800 seconds. The root account, or SlurmUser account can be used to generate tokens for any user. Alternatively, a user may use the command to generate tokens for themselves by simply calling
scontrol token
root@slurm-manager:/etc/systemd/system# scontrol token username=root lifespan=5555
SLURM_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTM0ODg4NzAsImlhdCI6MTY1MzQ4MzMxNSwic3VuIjoicm9vdCJ9.fM5HqmpY99t2GJSsdfk9TlZLLWDh75JQbg0NrfoHNRk
通过上述方式调整token令牌的有效期。
上述文章记录了如何在原有slurm-21.08.8集群的基础上支持slurmrestd服务的能力,并且给出了验证的过程,这对于使用指令集系统触发对于slurm集群的操纵是非常关键的一环。当时自己在搞
在此对上述的问题进行记录