SOP — LSF submit 节点接入(192.168.31.28 / hpc-submit)¶
变更日期:2026-09-25;执行窗口:23:07 ~ 23:57;变更类型:C 类(生产变更) 实现体:
deploy/lsf/stages/submit_node.py(阶段 14)+ 配置deploy/lsf/config/lsf_deploy.yaml本文档为本次变更档案;日常使用与速查见 ../docs/RUNBOOK.md
一、背景¶
新增一台专用于 HPC 作业提交的主机 192.168.31.28(主机名 hpc-submit,Rocky 9.8,8C/15G,
已属 Slurm 集群的提交端,已挂载 /data/nfs/{home,projects,tools,pdk,modulefiles} 与 LDAP 认证),
要求把它作为 LSF 集群的 submit 节点接入:可提交/查询作业,但不接收作业执行。
原部署器只覆盖 masters/workers 两类角色,缺少 submit 角色与接入能力,故需扩展实现体。
二、目标¶
变更完成后应达到的可验证状态:
| # | 目标 | 判据 |
|---|---|---|
| 1 | hpc-submit 登记为集群成员 | lsf.cluster.lsfce Host 段含该主机(server 列 1) |
| 2 | 不接收作业执行 | lsb.hosts 中该主机 MXJ=0;bhosts -w 显示 closed_Full 且 MAX=0 |
| 3 | 本机 LSF 就绪 | lim/res/sbatchd 运行;/etc/profile.d/lsf.sh、/etc/lsf.sudoers(600) 就位 |
| 4 | 提交链路可用 | 从 hpc-submit bsub 提交 → 终态 DONE,执行主机落在 lsf-work-0x |
| 5 | 幂等 | 阶段 14 复跑「零变更跳过」;--drift 全阶段无漂移 |
三、前置条件¶
- 操作机可 root 免密登录 192.168.31.28(已具备)。
- 集群运行正常、无 RUN 作业(执行前已确认
bjobs -u all= No unfinished job)。 - hpc-submit 已挂载 NFS 共享(
/home等已就绪;/data/nfs/lsf由阶段 1 补挂)。 - 凭据文件
deploy/lsf/config/credentials.yaml(600)可用。 - 执行前只读预检无 BLOCK:
--precheck(本次仅 WARN:submit 相关 hosts 缺失按设计降级)。
四、影响范围¶
| 项 | 内容 |
|---|---|
| 目标主机 | 192.168.31.28(新增接入) |
| 既有集群 | 5 台(.23~.27):仅共享配置新增一行 + 6 台 /etc/hosts 追加一行;不改其 LSF 服务 |
| 是否停服 | 不停服。生效动作含 lsadmin reconfig(仅重启 master candidate LIM)与 badmin mbdrestart(重启 mbatchd),执行时集群无作业 |
| 窗口与在跑作业 | 执行窗口内确认无 RUN 作业;hpc-submit 不接收作业,无需 drain |
| 不可逆环节 | 无。共享配置与节点文件均可由备份还原 |
五、分步操作¶
以实现体为准;下列序列与
deploy/lsf/stages/submit_node.py等价,供阅读与复核。
cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
# 门禁:只读预检(配置校验 + 环境检查,落盘 reports/precheck_<ts>.txt)
.venv/bin/python main.py -c config/lsf_deploy.yaml --precheck
# 预演:零副作用输出变更清单
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit --dry-run
# 阶段0:依赖与互信(6 台,补齐 hpc-submit;含 /root/.ssh 双向互信)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage prepare
# 阶段1:NFS(仅 hpc-submit 新增 /data/nfs/lsf 挂载与 fstab)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage nfs
# 阶段2:LDAP 认证(仅 hpc-submit 补 openldap-clients)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage node-env
# 阶段14:submit 节点接入(本阶段为本次核心)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit
阶段 14 内部动作(幂等,均有前置状态探测):
# 1) /etc/hosts 双向补齐(执行节点 ↔ submit 节点),同目录备份 /etc/hosts.bak.<ts>
# 2) 共享配置登记(先 cp -a 备份到 <file>.bak.<ts>):
# lsf.cluster.<cluster> : <name> ! ! 1 () # server=1,集群成员
# lsb.hosts : <name> 0 () () () () () (Y) # MXJ=0,不接作业
# 3) 生效(交互命令需按提示应答;reconfig 只答第一问=仅重启 master LIM)
su - ldapadmin -s /bin/bash -c "bash -lc \"printf 'y\n' | lsadmin reconfig\""
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | badmin mbdrestart'"
# 4) submit 节点本机就绪
/data/nfs/lsf/lsf/10.1/install/hostsetup --top=/data/nfs/lsf/lsf --boot=y # 高危:写本机 systemd 单元
# /etc/profile.d/lsf.sh(内容与其它节点一致)
# /etc/lsf.sudoers(沿用集群 LSF_EAUTH_KEY,权限必须 600) # 高危
su - root -c "bash -lc 'lsf_daemons start'" # lim/res/sbatchd
# 5) 等待集群识别(轮询 lsload <name> 直到取到数据,不用固定 sleep)
# 6) 提交冒烟:从 hpc-submit bsub → 终态 DONE 且 exec_host 属执行节点
六、验证¶
# 1) 集群视图:hpc-submit 应为 closed_Full / MAX=0,其余 5 台 ok
ssh root@192.168.31.23 "source /data/nfs/lsf/lsf/conf/profile.lsf; bhosts -w"
# 实测:hpc-submit closed_Full - 0 0 0 0 0 0 / 5 台 ok
# 2) 从 submit 节点提交作业并查执行位
ssh root@192.168.31.28 "bash -lc 'bsub -o /tmp/.x.out sleep 8'"
ssh root@192.168.31.23 "bash -lc 'bjobs -a -o \"jobid stat exec_host\" | tail -3'"
# 实测:作业 739 DONE,EXEC_HOST=lsf-work-03;LDAP 用户 rain01 提交成功
# 3) 提交节点本机就绪
ssh root@192.168.31.28 "bash -lc 'for d in lim res sbatchd; do pgrep -x \$d >/dev/null && echo \$d=ok; done; ls -l /etc/lsf.sudoers'"
# 实测:三个守护均 ok;/etc/lsf.sudoers 权限 600
# 4) 冒烟标记(共享盘)
ls -l /data/nfs/lsf/lsf/.submit_ok.hpc-submit
# 5) 幂等:阶段 0/1/2/14 复跑应「零变更跳过」
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit # 实测 ⏭ 零变更跳过
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage prepare # 实测 ⏭ 零变更跳过
# 6) 全阶段只读漂移检测(退出码 0 = 无漂移)
.venv/bin/python main.py -c config/lsf_deploy.yaml --drift; echo rc=$?
# 实测:阶段 0/1/2/3-6/7-8/10/11/12/14 全部「无漂移」,rc=0
七、回滚¶
按「共享配置 → 节点文件 → 本机守护」顺序逆操作;备份清单与存放位置见 backup/README.md(含共享目录同目录备份与节点同目录备份两节)。
# 1) 共享配置还原(在任一可写 NFS 的节点以 root 执行)
cd /data/nfs/lsf/lsf/conf
cp -a lsf.cluster.lsfce.bak.20260925-232524 lsf.cluster.lsfce # 还原主机清单
cp -a lsbatch/lsfce/configdir/lsb.hosts.bak.20260925-232524 lsbatch/lsfce/configdir/lsb.hosts
# 2) 生效(同第五节第 3 步的应答方式)
su - ldapadmin -s /bin/bash -c "bash -lc \"printf 'y\n' | lsadmin reconfig\""
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | badmin mbdrestart'"
# 3) 节点侧还原(6 台):/etc/hosts;.28 另停守护并清理接入产物
ssh root@192.168.31.28 "cp -a /etc/hosts.bak.20260925-230743 /etc/hosts"
ssh root@192.168.31.28 "bash -lc 'lsf_daemons stop'; rm -f /etc/profile.d/lsf.sh /etc/lsf.sudoers /data/nfs/lsf/lsf/.submit_ok.hpc-submit"
# 4) 回滚后验证:bhosts 仅 5 台;lsf.cluster/lsb.hosts 不含 hpc-submit;drift 仍应为 0
工程代码的逆操作见 backup/README.md 第 1 节(逐文件列出)。
八、风险说明¶
| 风险 | 说明与缓解 |
|---|---|
| 改共享集群配置 | 先 cp -a 备份(.bak.<ts>),并逐次核对 badmin mbdrestart 的配置检查输出(No fatal errors) |
badmin mbdrestart 重启 mbatchd |
影响调度数秒;执行前确认无 RUN 作业;不可在集群繁忙窗口执行 |
| 交互命令空转 | lsadmin reconfig/badmin mbdrestart 均会提问,须按提示应答;空应答会导致「未执行但返回正常」的假象(本次踩过) |
| eauth 静默失效 | /etc/lsf.sudoers 权限非 600 时 LSF 不使用该 key,表现为 User permission denied(本次踩过,已固化为探测项) |
| 新增节点误接作业 | 由 lsb.hosts MXJ=0 静态限制;冒烟判据额外校验 exec_host 不得为 submit 主机 |
| 既有阶段误把 submit 计入期望值 | 已把 cluster_up/failover/cgroup_v1/lsf_install 的期望集合改为执行节点(exec_nodes()) |
附录 A:本次修复的既有缺陷(非本次引入,但由本次暴露)¶
| # | 缺陷 | 影响 | 修复 |
|---|---|---|---|
| 1 | _local_keyscan 未过滤 ssh-keyscan 注释行(3 字段,被当 key 行) |
阶段 0 的 mesh_ssh 恒判 pending,互信永远补不齐 | 过滤 # 行;显式 -t rsa,ecdsa,ed25519;空结果重试一次 |
| 2 | known_hosts 判据用 key 前缀(40/60 字符)比对 | ecdsa 公钥 base64 前缀雷同 → 互相误判「已存在」,缺失 key 永不写入 | 统一改为完整 key(keytype + key)比对 |
附录 B:交付物清单¶
| 文件 | 说明 |
|---|---|
deploy/lsf/stages/submit_node.py |
阶段 14 实现体(含踩坑注释) |
deploy/lsf/config/lsf_deploy.yaml |
新增 nodes.submit 角色配置 |
submit_node/SOP.md |
本文件 |
submit_node/backup/README.md |
备份台账(工程改动 + 集群侧备份) |
docs/HANDOFF.md |
交接快照(本次已更新) |
来源:
/home/rain/Documents/LSF/lsf_ins/submit_node/SOP.md| 最后更新:2026-09-26 00:13(由build/sync.py同步,请勿在站点侧修改)