Slurm on ACK是以容器化的方式在ACK上部署Slurm集群的部署方案,帮助客户解决Slurm集群节点环境不统一,节点增删复杂等问题。本文提供了Slurm集群在ACK中的常见问题的排查方法以及排查思路。
1. 责任共担模型
Slurm on ACK包含slurm-operator以及slurm-copilot两部分,slurm-operator仅负责创建slurm集群中Head节点、Worker节点的Pod以及关联的SVC,slurm-copilot负责在ACK与slurm-operator之间进行对账,避免节点超卖。Slurm on ACK的部署架构,详情信息,请参见基于ACK集群容器化部署Slurm以及ACK集群上实现Slurm HPC & Kubernetes负载混合调度。
在您设计和部署企业应用系统之前,请您充分理解企业自身和阿里云的安全责任边界。
Slurm on ACK架构下集群的责任共担模型如下图所示。
2. 常见问题排查
2.1. Slurm Pod相关问题
集群中没有Head Pod
Head Pod由StatefulSet管理。如果集群中不存在Head Pod,通常是由于StatefulSet创建Pod失败所致。可以通过以下步骤排查问题:
检查RayCluster所在命名空间下的StatefulSet,使用
kubectl describe statefulset <statefulset-name>
查看与Head Pod对应的StatefulSet的事件信息。如果未找到相关StatefulSet,可进一步查看
ack-slurm-operator
命名空间下ack-slurm-operator
的日志,以确定StatefulSet创建失败的具体原因。
集群中没有Worker Pod或Worker Pod数量不足
查看
ack-slurm-operator
命名空间下的ack-slurm-operator
的日志确定StatefulSet创建失败的原因。
2.2. GRES相关问题
节点的k8scpu
和k8smemory
显示为0
如果未启用
slurm-copilot
,则节点无需包含k8scpu
和k8smemory
资源。如果已启用
slurm-copilot
,按照以下步骤排查问题:在ACK中检查该节点的资源是否已被Pod全部占用。
确认
SlurmRestD
服务是否正常运行。使用
kubectl logs
查看Slurm Head Pod的日志,确认是否定期出现secret/ack-slurm-jwt-token patched
的日志记录。检查
slurm-copilot
的日志,确认是否存在访问SlurmRestD
失败的情况。
2.3. 任务调度相关问题
任务提交失败,提示
node configuration is not available
当提交的任务请求的资源超过节点的最大可用资源时,可能会遇到该问题。请按照以下步骤进行排查和解决:
检查任务的CPU和内存请求是否超过了节点的最大可用资源。
确认节点是否存在
k8scpu
和k8smemory
资源。如果存在,执行以下操作:使用
scontrol show node -F
查看集群中是否存在Future
类型的节点,并检查这些节点的k8scpu
和k8smemory
是否满足任务的资源请求。如果不满足,可通过以下命令创建
Future
类型的节点:scontrol create node=<node-name> gres=k8scpu=<value>,k8smemory=<value> state=Future
任务提交失败,提示
tres_per_job is not supported for now, ...
job_submit插件报错,这些任务提交方式目前未支持。详细插件功能说明,请参见ACK集群上实现Slurm HPC & Kubernetes负载混合调度。
任务提交失败,提示
job must set --ntasks
job_submit插件报错,这些任务提交方式目前未支持。详细插件功能说明,请参见ACK集群上实现Slurm HPC & Kubernetes负载混合调度。
任务提交成功,但Pod处于Pending状态
通过
squeue
查看任务处于Pending状态原因。详细信息,请参见Squeue Pending代码说明。
2.4. 节点运维相关问题
Slurm的Head Pod或Worker Pod持续重启
查看Pod日志以确认其是否正常启动:
如果Pod已正常启动,检查
/var/log/slurmctld.log
文件,定位SlurmCTLD启动失败的具体原因。如果Pod未正常启动,检查初始化脚本是否已正确执行并完成。
重建集群后分区丢失
slurm-operator
创建的Head Pod在启动时默认带有-R
参数,会尝试读取/var/spool/slurmctld/part.state
或/var/spool/slurmctld/part.state.old
文件中的记录以恢复集群状态。如果在重建集群后出现分区丢失的情况,可按照以下步骤进行排查:检查集群的
/var/spool
目录是否挂载了持久化存储。确认Worker Pod或Head Pod在退出前是否通过
scontrol update
命令更新了分区信息。检查Pod创建过程中初始化脚本及Command中是否存在更新分区的操作。