slurmrestd服务部署文档的撰写

文档简介

 由于项目组前期调研,需要通过slurmrestd服务来调用Slurm集群的能力,通过Rest接口进行作业的提交、节点信息、作业信息的查询,因此需要完成slurmrestd服务的配置和启动。

 本文档建立在

05-19 Ubuntu18.04源码安装Slurm 21.08.md

 文档的基础上,由于上述文章中部署的文档并不包含libjwt模块,slurmrestd服务通过使用JSON Web Tokens(JWT)对用户身份进行认证,因此需要重新部署slurm集群,以提供对于JWT认证的支持。

slurmrestd介绍

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

 需要首先明白,Slurm REST API是什么?

image-20220525195923701

Slurm REST API架构(rest_auth/jwt)

image-20220525200142107

 通过上图,我们可以简单的理解到,s在slurm集群内部的通信方式主要是采用Munge实现的,它们都属于Munge边界,而slurm的控制daemon和slurmdbd 进程在横向上又与slurmrestd作为一个整体,采用的AuthAltTypes边界,即JWT认证方式认证的。

部署步骤

 slurmrestd整体配置过程如下所示:

image-20220525195608649

配置

 配置的主要过程可以参见JWT认证

由于已经配置好的slurm集群配置文件包括slurm.conf, slurmdbd.conf, slurmd.conf,为防止需要重新配置,可以备份一下/usr/local/slurm/etc目录。

# cp /usr/local/slurm/etc ~

配置JWT支持

 由于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配置时,报出如下问题:

image-20220525201335715

 但之前自己曾经已经把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集群

 源码编译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

 其他过程不变。

 然后把备份过的

slurm对于JWT的支持

JWT Key

 新建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

配置文件

slurm.conf和slurmdbd.conf

 由于slurmrestd服务需要主动与控制进程和slurmdbd服务使用JWT交互,因此需要配置这两个配置文件。

 在两个配置文件添加如下的内容即可:

AuthAltTypes=auth/jwt
AuthAltParameters=jwt_key=/var/spool/slurm/statesave/jwt_hs256.key

 需要注意的是,slurmdbd进程仅仅运行在管理节点上,但修改了两个文件之后,还是应该把两个配置文件同步到计算节点上。

 重启slurmctldslurmdbd

 重启之后,可以进行一个简单的认证,通过scontrol命令为用户生成一个token

root@slurm-manager:~/jansson-2.14# scontrol token username=root
SLURM_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTM0ODQxMDAsImlhdCI6MTY1MzQ4MjMwMCwic3VuIjoicm9vdCJ9.oKnIJVq4HGkSXdL_LqReZtd2Pk3VcBmlv94_xmYHNng

 这表明,jwt服务已经基本配置成功了。

slurmrestd.service

 为了方便守护,可以进一步把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集群进行认证的。

image-20220525205240637

 如上,接口正常请求,则表明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集群的操纵是非常关键的一环。当时自己在搞

  • unspecified errors
    • 认证没通过, 搞了许久。
  • slurm_load_jobs error: Zero Bytes were transmitted or received
    • token失效了
  • Invalid account or account/partition combination specified
    • 只有root用户可以运行作业。
  • 请求失效,因为参数格式

 在此对上述的问题进行记录

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
这个错误提示"Error: Invalid or corrupt jarfile /app.jar"意味着系统无法找到或读取到/app.jar这个文件,可能是因为该文件不存在或损坏。根据引用中的分析,可能是在Dockerfile中指定的ADD命令中指定的路径和文件名有误导致的。请检查Dockerfile中的ADD命令,确保路径和文件名正确。另外,你还可以尝试从根目录的out/artifacts目录下查找jar包,并使用正确的命令来运行,比如使用java -jar命令来运行jar包。参考引用中的描述。如果你使用的是maven编译的jar包,你可以使用java -jar命令来运行,例如java -jar xxxx.jar。具体配置的端口号可以参考引用中的信息。希望这些信息能帮助你解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [docker logs 查看日志 出现Invalid or corrupt jarfile /app.jar,或者容器刚运行起来就exit,restart都不...](https://blog.csdn.net/weixin_44377911/article/details/105405293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Error:Invalid or corrupt jarfile xxx.jar关于使用 IDEA 打成jar包出错以及打包的正确姿势](https://blog.csdn.net/manqishizhizhu/article/details/121911423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [rocketmq-console-ng-1.0.0.jar](https://download.csdn.net/download/m0_37860933/10658490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值