跳转至

SOP — 新增作业提交节点 hpc-submit(--submit-node)

变更日期:2026-09-25 | 执行人:rain | 状态:已完成并验证 实现体:submit_node_deployer.py + submit_node_assets.py(工程根 main.py ---submit-node) 本文第 5 章的操作序列以实现体为准,仅供阅读、复核与手工复现。

1. 背景

集群此前只有控制节点(2 台)与计算节点(3 台),用户要提交作业必须登录到控制节点或计算节点。 新增一台专用主机 192.168.31.28 作为作业提交节点:只跑 Slurm 客户端命令,不承载作业, 把"提交/查询"与"计算与控制"在权限与负载上分开。

该主机为全新安装(Rocky Linux 9.8 最小化),主机名为 rocky9-01,未装任何 Slurm 相关软件包。

2. 目标

变更完成后应达到以下可验证状态:

  1. 主机名为 hpc-submit,集群 6 台节点的 /etc/hosts 均能按名解析它;
  2. munged 运行且 key 与集群一致(客户端命令的认证前提);
  3. Slurm 客户端命令可用:登录后 sinfo / squeue / sbatch 直接可用(configless 取配置);
  4. LDAP 认证可用:getent passwd cy01 可解析、su - cy01 可切换、家目录来自 NFS;
  5. 与计算节点同款的共享盘就绪:/home、/opt/modulefiles、/projects、/tools、/pdk;
  6. 不挂 Lustre(/mnt/lustre)与本地 scratch(/local_scratch)——该节点不承载作业;
  7. 不重启任何既有节点的 daemon、不改既有节点的 slurm.conf,在跑作业不受影响;
  8. 复跑一次为零变更、全跳过(幂等)。

3. 前置条件

项 要求 实现体检查项
免密 SSH 部署机 → 192.168.31.28 及全部既有节点 root 免密 pre_check 逐台 echo OK
主机名 目标机静态主机名必须已是 hpc-submit 比对 hostnamectl --static 与 yaml hostname,不符即中止
OS 契约 Rocky/RHEL 9.x、x86_64 _check_target_os(读 yaml os_check)
configless 源 目标机能连通控制节点 6817 逐台 TCP 探测 192.168.31.16:6817
NFS 服务端 目标机能连通 192.168.31.249:2049 逐台 TCP 探测
产物来源 控制节点或编译节点上存在 /usr/local/slurm-26.05/bin/sinfo _find_artifact_source
dnf 可用 目标机可执行 dnf _check_target_prereqs(缺则阻断)
配置合法性 submit_node / home_share / module_env / storage_layout / system_auth 均启用且字段合法 各 installer 的 validate_config()

软件包(munge、nfs-utils、sssd、Lmod 等)不要求在 pre_check 时已安装—— 全新节点必然缺失,由 deploy 阶段安装;pre_check 仅提示。

4. 影响范围

对象 影响
192.168.31.28(hpc-submit) 装包、建 slurm 用户、分发 Slurm 客户端产物、写配置、挂载共享盘、接入 LDAP
既有 5 台(.16/.17/.18/.19/.20) 仅改 /etc/hosts 的集群条目块(加入 hpc-submit 一行);不动服务、不动 slurm.conf
控制节点 slurmctld 只在打包产物时被读一次(tar);不重启、不 reconfigure
计算节点在跑作业 零影响(--submit-node 不重启 slurmd、不改作业钩子)
  • 是否需停服:否。
  • 窗口期:无需停机窗口;dnf 装包在目标机上产生瞬时 IO/网络占用。
  • 在跑作业:可照常运行。

5. 分步操作

对应实现:submit_node_deployer.py 的 deploy()(阶段 1–4)与六个生命周期方法。 下述命令为等价手工复现,以实现体为准。

# ---- 前置:主机改名(本次已执行;幂等,重复执行无副作用)----
# 高危:改主机名前必备份 /etc/hosts,改错会影响本机名解析
ssh root@192.168.31.28 "cp -a /etc/hosts /root/hosts.bak.\$(date +%Y%m%d-%H%M%S)"
ssh root@192.168.31.28 "hostnamectl set-hostname hpc-submit"
ssh root@192.168.31.28 'sed -i "s/rocky9-01/hpc-submit/g" /etc/hosts'   # 同步本机 /etc/hosts 条目

# ---- 预演:只输出变更清单,不改动任何系统状态 ----
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node --dry-run

# ---- 正式执行(幂等:已就绪项全部跳过)----
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node

# 实现体内部按以下顺序落地:
#   阶段 1  目标机系统准备:装 submit_node.packages(munge/nfs-utils/tar/gzip)、
#           建 slurm 用户(uid/gid 64030)、放通防火墙端口 6817/6818/6819
#   阶段 2  集群级:munge key 统一(经本机 SFTP 中转,不进命令行)、
#           写 /etc/hosts 集群条目块(控制+计算+提交节点,写全部 6 台)
#   阶段 3  在产物来源节点 tar 打包 install_dir → 上传目标机 → 解压 → 切 symlink
#           (同时补运行库缺失项:ldd 探测 + dnf 反查包名)
#   阶段 4  逐台(按 batch_size 分批):运行库 → symlink → 配置来源 →
#           节点基础环境(命令 PATH / sssd+authselect / 共享家目录)→
#           Lmod 与 /opt/modulefiles 挂载 → Tier1 挂载(/projects /tools /pdk)

配置来源(configless):目标机无 slurmd,改用环境变量片段 /etc/profile.d/slurm_configless.sh(内容 export SLURM_CONF_SERVER=slurm-master-01:6817,slurm-master-02:6817), 客户端命令据此向控制节点取配置。登录 shell 自动带上;脚本内需显式设置该变量。

6. 验证

变更后按下列顺序验证(均为本次实测结果):

# 1) 幂等复跑:第二次必须零变更、全跳过
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node
#    实测:✅ 状态已一致,零变更,无需部署(幂等跳过);29 项全跳过、退出码 0

# 2) 客户端可用性(实现体 health_check 的等价命令)
ssh root@192.168.31.28 'hostnamectl --static'                    # 预期 hpc-submit
ssh root@192.168.31.28 'systemctl is-active munge'               # 预期 active
ssh root@192.168.31.28 'findmnt -rno TARGET,SOURCE -t nfs,nfs4'  # 预期 5 行:/home /opt/modulefiles /projects /tools /pdk
ssh root@192.168.31.28 'getent passwd cy01'                      # 预期 cy01:*:4001:4000:...:/home/cy01:/bin/csh
ssh root@192.168.31.28 "su - cy01 -c 'id -un; echo HOME=\$HOME'" # 预期 cy01 且 HOME=/home/cy01
ssh root@192.168.31.28 'su - cy01 -s /bin/bash -c "sinfo -h -o \"%N %T\""'
#    预期:slurm-work-[01-03] idle(登录 shell 内 PATH 与 SLURM_CONF_SERVER 均已生效)

# 3) 集群侧登记(6 台都应含 hpc-submit,且块只出现一次)
ssh root@192.168.31.16 'sed -n "/BEGIN slurm-deploy/,/END slurm-deploy/p" /etc/hosts'

实测结论(2026-09-25):

项 结果
首轮执行 退出码 0;81 条记录(71 变更 / 10 跳过);✅ submit 节点客户端可用性校验通过
幂等复跑 退出码 0;29 条全跳过;✅ 状态已一致,零变更
sinfo(cy01 / bash 登录 shell) slurm-work-[01-03] idle
五处挂载 全部指向 192.168.31.249:/data/nfs/*
/etc/hosts 31.16 块内含 192.168.31.28 hpc-submit,且历史重复块被规范化为一处

7. 回滚

# 卸载提交节点(卸挂载 + 移除认证与 PATH 配置 + 摘 symlink + 重建 /etc/hosts 块)
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node --rollback
  • 备份位置:各节点 /var/backups/slurm/submit_node_<YYYYmmdd_HHMMSS>/ (提交节点备份 /etc/hosts、/etc/fstab、/etc/nsswitch.conf、/etc/pam.d、sssd.conf; 既有节点仅备份 /etc/hosts)。
  • 本机备份:submit_node_onboarding/backup/,逐条登记见 backup/README.md。
  • 主机改名回滚:/etc/hosts 与静态主机名的改名前备份在目标机 /root/hosts.bak.20260925-011353; yum 源改动的原名备份在目标机 /root/yum.repos.d.bak.20260925-014652。
  • 回滚不删除数据:共享盘内容、目标机上已分发的 Slurm 产物目录(/usr/local/slurm-26.05) 均保留,需人工确认后清理。
  • 回滚后验证:目标机 findmnt -t nfs 无上述 5 处挂载、systemctl is-active sssd 非 active、 既有节点 /etc/hosts 块中无 hpc-submit。

8. 风险说明

风险 缓解
改既有 5 台 /etc/hosts 时误删其它条目 只替换 # BEGIN/END slurm-deploy 标记块内的内容;变更前逐台备份 /etc/hosts
主机名与配置不一致导致注册错节点 pre_check 强校验 hostnamectl --static 与 yaml 的 hostname 一致,不符即中止
目标机缺包导致中途失败 包安装排在 munge key 同步之前(key 权限校正依赖 munge 包);fail_tolerance=0 时任一节点失败即停止后续批次
产物打包占用控制节点 IO 仅在有节点缺产物时才 tar;已就绪时跳过(幂等复跑无打包动作)
提交节点被误当计算节点 submit_node_assets.validate() 强制 role 恰为 ["submit"];slurm.conf 的 NodeName 只含计算节点
公网镜像极慢(本次实际踩到) 目标机 Rocky/EPEL 源改指 mirrors.aliyun.com(实测 15 MB/s,官方 mirrorlist 仅 1 KB/s);原名备份见第 7 章
dnf 后台 makecache 抢锁 目标机 dnf-makecache.timer 在装包期间临时停用,装完已恢复 enabled;残留 dnf 进程用精确 PID 终止(pkill -f "dnf install" 会匹配到执行命令的 shell 自身,切勿使用)
LDAP 用户 loginShell 为 /bin/csh csh 不读 /etc/profile.d/*.sh,故 su - <用户> 后 sinfo 不在 PATH —— 与既有计算节点行为一致(31.18 实测同样如此);需要命令时用 su - <用户> -s /bin/bash 或绝对路径 /usr/local/slurm/bin/sinfo

附录 A:交付物清单

文件 说明
submit_node_deployer.py 新子命令实现体(--submit-node,继承主部署器复用其阶段方法)
submit_node_assets.py submit_node 配置段解析与合法性校验
main.py 新增 --submit-node 互斥选项与用法示例
slurm_deployer.py _hosts_block() 纳入 submit 节点;抽出 _configless_profile_content() 供两处共用
config/slurm_deploy.yaml(及 .example) nodes.submit 新增 hpc-submit;storage_layout.node_groups 增加 submit;新增 submit_node 段
docs/RUNBOOK.md 新增 4.12 提交节点运维;速查表与节点清单同步
docs/HANDOFF.md 本轮交接快照
submit_node_onboarding/ 本文档、backup/(工程文件备份 + 台账)、logs/(dry-run 与三轮执行日志)

附录 B:执行日志索引

日志 内容
logs/dryrun.log 首次预演(修复 pre_check 门禁后)
logs/deploy-1.log 首轮失败:munge key 校正早于 munge 包安装(chown: invalid user)→ 修正阶段顺序
logs/deploy-2.log 二轮失败:dnf install 被慢源 + makecache 抢锁拖至超时
logs/deploy-3.log 三轮成功:装包 → 产物分发 → 配置 → 挂载 → 校验通过
logs/deploy-4-idempotent.log 幂等复跑:零变更、全跳过

来源:/home/rain/Documents/slurm/slurm_ins/submit_node_onboarding/SOP.md | 最后更新:2026-09-25 01:55(由 build/sync.py 同步,请勿在站点侧修改)