跳转至

SOP — 删除旧集群遗留资料目录 server/

项 内容
变更类型 清理(删除项目目录内已无引用的旧集群遗留资料)
执行时间 2026-09-29 21:15(Asia/Shanghai)
执行主体 本机 192.168.31.249(root 免密可用),操作用户 rain
目标对象 /home/rain/Documents/k8s_ins/server(删除前 312 文件 / 4.71 MB / 10 个顶层子目录)
影响集群 无(纯项目目录清理,不触碰任何主机与集群资源)
备份 无(经用户明确决定不留档,见第 7 章)
结论 已完成,目录不存在;项目内 17 个顶层目录,文档指针已同步

1. 背景

  • 触发条件:本轮核对 docs/PROJECT-MAP.md 指针时,server/ 条目仍标注「身份待澄清」(地图第 4 节)。用户确认其来源为旧集群(GlusterFS/NFS 时代)带来作参考的资料,当前集群已建成,要求评估是否可以删除。
  • 现役集群事实:rainchen-k8s 已于 2026-09-16 重建为 Rocky Linux 9.8 / K8s v1.36.4;监控由 prometheus_deploy/(kube-prometheus-stack chart 91.4.1)承载;各服务由对应 *-deploy 工程独立交付。
  • 评估结论(详见附录 A):server/ 与现役工程无任何引用关系,内容为旧集群手工清单与历史排障报告,仅具追溯价值。
  • 用户决定:直接删除,不留档。

2. 目标

  1. /home/rain/Documents/k8s_ins/server 不再存在。
  2. 项目目录中不再有任何指向该目录的路径引用或文档残留。
  3. docs/PROJECT-MAP.md 与 docs/HANDOFF.md 反映终态,无过时表述。

3. 前置条件

类别 要求
权限 本机对项目目录有写权限(目录属主 rain)
工具 GNU coreutils(rm、ls);python3 用于引用扫描与清单统计
占用 无进程/挂载占用该目录(见 5.1 检查)
版本控制 项目根无 .git,删除不可通过版本库找回——这是第 7 章「不可回滚」的直接原因

4. 影响范围

对象 影响
项目目录 顶层子目录由 18 个减为 17 个(减少 server/)
集群 / 主机 无。不涉及 kubectl、helm、ssh 任何操作
服务 无。server/ 是本地静态资料,非运行组件
停服 不需要
窗口期 无要求,随时可执行
在跑作业 不受影响(Slurm / LSF / K8s 均无关联)

5. 分步操作

步骤 1:引用扫描与安全检查

确认三件事:① 现役工程无路径引用;② 目标不是挂载点/符号链接;③ 无内部符号链接指向目录外(防止删除动作越界)。

坑:server/ 与 K8s 命名空间 server 同名,直接搜 server/ 会被命名空间语境(server/gitlab IngressRoute、server/traefik Service 等)大量淹没。必须按「路径引用」而非「字符串命中」判定,只看工程脚本/配置/文档中是否出现形如 server/<旧组件目录名> 的文件路径。

cd /home/rain/Documents/k8s_ins

# ① 引用扫描:旧组件目录名组合出现即需人工确认(正常结果为空)
grep -rnE 'server/(monitor|mysql|postgresql|dns|ssh|nfs-sc)' \
  --include='*.md' --include='*.py' --include='*.yaml' --include='*.yml' --include='*.json' . \
  | grep -v '^./server/'

# ② 挂载点与符号链接检查
findmnt -T /home/rain/Documents/k8s_ins/server -o TARGET,SOURCE,FSTYPE -n
mountpoint /home/rain/Documents/k8s_ins/server
python3 -c "
import os
p='/home/rain/Documents/k8s_ins/server'
print('是符号链接:', os.path.islink(p), '| realpath:', os.path.realpath(p))
print('内部符号链接数:', sum(1 for dp,dn,fn in os.walk(p) for n in dn+fn if os.path.islink(os.path.join(dp,n))))
"

预期:① 仅 server/ 自身内部文件命中(被 grep -v 过滤后为空),项目其余部分零命中;② mountpoint 返回「不是一个挂载点」(退出码 32 属正常);③ 是符号链接: False、内部符号链接数: 0。 失败判断:若出现 server/monitor、server/mysql 等的真实路径引用 → 停止删除,先处理引用方。

步骤 2:删除目录

高危:不可逆操作。行内做三重校验——路径等于白名单常量、-d 为真、-L 为假——任一不满足即中止。

坑:不要使用通配(rm -rf server*),避免误伤 server 命名空间相关目录或未来的同前缀目录;必须写全路径。

p="/home/rain/Documents/k8s_ins/server"
if [ "$p" != "/home/rain/Documents/k8s_ins/server" ]; then echo "ABORT: 路径不在白名单"; exit 1; fi
if [ ! -d "$p" ] || [ -L "$p" ]; then echo "ABORT: 目标不存在或为符号链接"; exit 1; fi
echo "【高危】即将删除目录: $p"
rm -rf -- "$p"

预期:无输出或仅打印高危提示行,退出码 0。 失败判断:退出码非 0,或后续 ls 仍可见 → 检查权限与占用(lsof +D),不要重复强删。

步骤 3:验证删除结果

test -e /home/rain/Documents/k8s_ins/server && echo "失败: 目录仍存在" || echo "OK: 目录已不存在"
ls -1 /home/rain/Documents/k8s_ins/ | wc -l    # 预期 18(docs + 16 个工程/主题 + 本主题目录;本主题目录尚未创建时为 17)

预期:OK: 目录已不存在,顶层条目数 18(本主题目录尚未创建时为 17)。 失败判断:仍存在 → 回到步骤 2 排查;条目数不符 → 清点是否有误删。

步骤 4:同步文档指针

删除后 server/ 在 docs/PROJECT-MAP.md 的三处标注(任务路由表、留档卡片、第 4 节存疑项)与 docs/HANDOFF.md 均须更新,否则下个会话会按地图去找一个不存在的目录。

# 定点修订前先备份根级档案(各主题备份归各自 backup/,根级归 docs/backup/)
ts=$(date +%Y%m%d-%H%M%S)
cp docs/PROJECT-MAP.md "docs/backup/PROJECT-MAP.md.bak.$ts"
cp docs/HANDOFF.md     "docs/backup/HANDOFF.md.bak.$ts"
# 随后用编辑器定点修订,并登记 docs/backup/README.md

预期:两份 .bak.<时间戳> 落地,docs/backup/README.md 台账各增一行。 失败判断:备份未生成就落笔修改 → 立即停手,先补齐备份。

6. 验证

检查项 命令 预期
目录已删 test -e /home/rain/Documents/k8s_ins/server 退出码非 0(不存在)
顶层目录数 ls -1 /home/rain/Documents/k8s_ins/ \| wc -l 18(含本主题目录;删除刚完成时为 17)
无遗留路径引用 grep -rn 'server/monitor\|server/mysql\|server/postgresql\|server/nfs-sc' --include='*.md' . 仅本 SOP 与本主题目录内的历史描述命中
地图无残留 grep -n 'server/' docs/PROJECT-MAP.md 仅剩 K8s 命名空间语境(server 命名空间相关表述)
交接快照无残留 grep -n 'server/' docs/HANDOFF.md 无指向该目录的表述

7. 回滚

本次无备份,故无回滚路径。 这是用户 2026-09-29 在明确知悉「不可恢复、无回滚」后作出的决定(原始选项文本见附录 B),与全局规则「高危操作须附带备份与完整回滚步骤」的默认要求不一致,此处按用户明确指令优先执行,特此留痕。

项 说明
备份位置 无(未生成任何 .bak / .tar.gz)
回滚步骤 不存在。唯一理论恢复途径是重新从旧集群取回资料,而旧集群已销毁,其手工清单仅存于被删目录本身
回滚后验证 不适用
影响的可逆性 目录删除本身在本机层面不可逆;对现役集群与业务无任何影响(本来就无引用)

残留参考物(非同源,供日后追溯时知悉):cleanup-20260929/backup/monitoring_upgrade.bak.20260929-151522.tar.gz 保存了旧集群监控栈升级档案(CentOS 7 / K8s v1.22→v1.34.3),与本目录同属旧集群时期资料,可作为旧集群经验的间接参考。

8. 风险说明

风险 缓解 / 现状
删除不可逆,旧集群排障经验永久丢失 用户已确认接受:两篇 Pod 启动排障报告与旧手工清单的追溯价值不足以支撑保留
删除时误伤同名对象 已做白名单路径校验 + 禁止通配 + 符号链接/挂载点检查
文档指向已删目录,误导后续会话 已同步修订 PROJECT-MAP(3 处)与 HANDOFF,并备份登记
残留明文凭据 删除前探测到 gitlab/00-gitlab-secret.yaml、gitlab/old/02-gitlab-sts.yaml、postgresql/00-pgsql-secret.yaml 及 postgresql/.00-pgsql-secret.yaml.swp 等含凭据文件;已随目录一并删除,该项风险随之消解(详见附录 A)

附录 A — 删除前评估证据

A1. 引用关系:全项目文本扫描(*.md/*.py/*.yaml/*.yml/*.json/*.txt)中,除 server/ 内部自指与 docs/PROJECT-MAP.md 的留档标注外,无任何现役工程、脚本、配置以文件路径形式引用该目录。命中的 server/xxx 全部为 K8s 命名空间语境(如 server/gitlab IngressRoute、server/traefik Service、Secret server/gitlab-gitlab-initial-root-password)。

A2. 内容构成(删除前实测)

顶层子目录 文件数 顶层子目录 文件数
monitor/ 255(旧 kube-prometheus-stack chart + values + helm 回滚快照) gitlab/ 10(含 old/)
mysql/ 10 postgresql/ 10
ssh/ 6(含 pak/libjemalloc.so.1,207 KB 二进制) traefik/ 6
ldap/ 5 redis/ 5
dns/ 4 nfs-sc/ 1

合计 312 文件 / 4.71 MB;扩展名以 .yaml 272 个为主;文件 mtime 跨 2014-04-01 → 2026-08-24;三份 backup/README.md 为 2026-09-19 16:12 生成(本项目备份台账格式,说明这批历史备份曾在本项目期间补过登记)。

A3. 含凭据文件(已随删除移除):gitlab/00-gitlab-secret.yaml、gitlab/old/02-gitlab-sts.yaml、postgresql/00-pgsql-secret.yaml、postgresql/.00-pgsql-secret.yaml.swp(vim 交换文件),以及 monitor chart 的模板类 secret*.yaml(模板占位,非真实凭据)。

A4. 身份判定:旧集群遗留(地图原列「留档」,标注「身份待澄清」);本次由用户确认来源与去留,澄清闭环。

附录 B — 决策记录

  • 2026-09-29:用户在四个处置选项中选定「直接删除,不留档」,其余三选项(剔除凭据后打包留档再删 / 整目录打包到项目外 / 先只删凭据文件)均未采用。
  • 该选择意味着放弃唯一恢复途径,参见第 7 章。

附录 C — 交付物清单

文件 说明
SOP.md 本文件
(无 backup/) 本次未产生备份,故不建备份目录、不建 backup/README.md
(无 RUNBOOK.md) 本次为一次性删除动作,无交付物留存,按规范不需要运行手册

附录 D — 关联文档

  • docs/PROJECT-MAP.md — 已移除 server/ 的路由行、留档卡片与存疑项
  • docs/HANDOFF.md — 已同步本轮变更
  • cleanup-20260929/SOP.md — 同类先例:删除旧集群遗留工程 monitoring_upgrade/(该次保留了 tar.gz 备份)

来源:/home/rain/Documents/k8s_ins/cleanup-server-legacy-20260929/SOP.md | 最后更新:2026-09-29 21:13(由 build/sync.py 同步,请勿在站点侧修改)