如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
这是一个使用 Kubernetes 的多容器 Slurm 集群。Slurm 集群 Helm 图表会创建一个命名卷,用于 MySQL 数据文件的持久化存储。默认情况下,它还会安装 RookNFS Helm 图表(也位于此仓库中),以在 Slurm 集群节点间提供共享存储。
需满足以下要求:
Helm 图表将运行以下容器:
Helm 图表将创建以下命名卷:
/var/lib/mysql)还需要一个挂载至 /home 的命名 ReadWriteMany (RWX) 卷,该卷可以是外部卷,也可使用提供的 rooknfs 图表目录部署(参见“部署集群”)。
slurm-cluster-chart/files 中的所有配置文件将在启动时挂载到容器中,以配置各自的服务。注意,对这些文件的更改不会全部传播到现有部署(参见“重新配置集群”)。Helm 图表的 values.yaml 文件中可找到其他参数。注意,其中部分值也需在集群重启后才会生效(参见“重新配置集群”)。
仅在初始部署时运行以下命令:
./generate-secrets.sh [namespace]
这会在目标命名空间中生成一组供 Slurm 集群使用的密钥。如需重新生成这些密钥,请参见“重新配置集群”。
请务必记录 Open Ondemand 凭据,通过浏览器访问集群时需要使用。
集群节点间的共享存储需要 ReadWriteMany (RWX) 卷。默认情况下,Rook NFS Helm 图表会作为 Slurm 集群图表的依赖项安装,以提供支持 RWX 的 Storage Class 用于所需的共享卷。如果目标 Kubernetes 集群已有应使用的存储类,则应在 values.yaml 中将 storageClass 设置为该现有类的名称,并通过设置 rooknfs.enabled = false 禁用 RookNFS 依赖项。无论哪种情况,均可通过设置 storage.capacity 的值来配置已配置 RWX 卷的存储容量。
使用 RookNFS 提供共享存储卷时,有关更多配置选项,请参见单独的 RookNFS 图表 values.yaml。
要通过 ssh 访问集群,需提供公钥。可通过运行以下命令添加本地主机的所有公钥:
./publish-keys.sh [namespace]
其中 namespace 是 Slurm 集群图表将部署到的命名空间(即使用 helm install -n ...)。这将在相应命名空间中创建一个供 Slurm 集群使用的 Kubernetes Secret。省略命名空间参数将在默认命名空间中安装密钥。
使用适当的 kubeconfig 文件配置 kubectl 后,使用 Helm 图表部署集群:
helm install slurm-cluster-chart
[!NOTE] 如果使用 RookNFS 依赖项,则必须在安装 Slurm 集群图表之前运行以下命令:
> helm dependency update slurm-cluster-chart
>
后续版本可使用以下命令部署:
helm upgrade slurm-cluster-chart
注意:使用 helm upgrade 更新集群时,如果 Slurm 队列中有运行中的作业,预升级钩子将阻止升级。尝试升级会将所有 Slurm 节点设置为 DRAINED 状态。如果因运行中作业导致升级失败,可等待运行中作业完成后重试升级,或作为特权用户访问集群手动解除节点排水状态。也可通过使用 --no-hooks 标志运行 helm upgrade 绕过钩子(可能导致运行中作业丢失)。
使用以下命令获取登录节点的外部 IP 地址:
LOGIN=$(kubectl get service login -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
然后以 rocky 用户身份连接集群:
ssh rocky@$LOGIN
在 shell 中执行 Slurm 命令,例如:
[root@slurmctld /]# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
normal* up 5-00:00:00 2 idle c[1-2]
容器中包含 Intel MPI 基准测试。可使用 mpirun 和 srun 运行,也可使用 apptainer 作为容器化工作负载运行。
作业脚本示例:
#!/usr/bin/env bash
#SBATCH -N 2
#SBATCH --ntasks-per-node=1
echo $SLURM_JOB_ID: $SLURM_JOB_NODELIST
srun /usr/lib64/openmpi/bin/mpitests-IMB-MPI1 pingpong
#!/usr/bin/env bash
#SBATCH -N 2
#SBATCH --ntasks-per-node=1
echo $SLURM_JOB_ID: $SLURM_JOB_NODELIST
/usr/lib64/openmpi/bin/mpirun --prefix /usr/lib64/openmpi mpitests-IMB-MPI1 pingpong
#!/usr/bin/env bash
#SBATCH -N2
#SBATCH --ntasks-per-node=1
MPI_CONTAINER_TAG="main"
echo SLURM_JOB_NAME: $SLURM_JOB_NAME
echo $SLURM_JOB_ID: $SLURM_JOB_NODELIST
srun singularity exec docker://ghcr.io/stackhpc/mpitests-container:${MPI_CONTAINER_TAG} /usr/lib64/openmpi/bin/mpitests-IMB-MPI1 pingpong
注意:mpirun 脚本假设以用户“rocky”身份运行。如果以 root 身份运行,需包含 --allow-run-as-root 参数。
对 slurm-cluster-chart/files/slurm.conf 中 Slurm 配置的更改,可通过运行以下命令传播(可能需要几秒钟)到除 slurmdbd pod 外所有 pod 的 /etc/slurm/slurm.conf:
helm upgrade slurm-cluster-chart/
然后可在 Slurm pod 内以 root 身份运行 scontrol reconfigure 读取新的 Slurm 配置。slurm.conf 文档指出,某些更改需要重启所有守护进程,此时需按以下说明重新部署 Slurm pod。
对其他配置文件(如 Munge 密钥等)的更改需要重新部署相应的 pod。
要重新部署 pod,请使用:
kubectl rollout restart deployment
用于 slurmdbd、login 和 mysql pod;使用:
kubectl rollout restart statefulset
用于 slurmd 和 slurmctld pod。
通常需要重启 slurmd、slurmctld、login 和 slurmdbd。
通过重新运行以下命令重新生成密钥:
./generate-secrets.sh
部分密钥持久化在卷中,因此轮换密钥需要完全拆除并重启这些卷及其挂载的 pod。运行:
kubectl delete deployment mysql
kubectl delete pvc var-lib-mysql
helm upgrade slurm-cluster-chart
然后重启其他依赖部署以传播更改:
kubectl rollout restart deployment slurmd slurmctld login slurmdbd
来自真实用户的反馈,见证轩辕镜像的优质服务