跳到正文
cyxc.club

记录一次给 6 个旧 HDD OSD 挂槽 10 缓存盘

/ 约 22 分钟

2026-09-11 到 2026-09-14。三台 Dell R730xd:k8s-10-1-16-2110.1.16.21)、k8s-10-1-16-22k8s-10-1-16-23。Rook v1.17.9,Ceph Squid 19.2.3(镜像 harbor.cyxc.club/quay/ceph/ceph:v19.2.3),host-based OSD。集群 fsid 7a0e0897-87d2-41e7-9d91-02e2765a7191。SSH:ssh root@10.1.16.212223

对象池 ceph-objectstore.rgw.buckets.data:EC 2+1、故障域 hostmin_size=2。块 / CephFS / RGW 索引钉在 ssd。定位硬盘只用 WWN / 序列号 / 槽号,不要用 /dev/sdX。PERC:0:0:槽:0

下面按实际怎么做的写。命令和数字可以原样复现。改 CR 不会把已有 OSD 的 WAL/DB 搬家;removeOSDsIfOutAndSafeToRemove=false。这次没有 helm upgrade。 以后换 16T / 槽 10 见 机械盘和缓存盘故障时怎么换,不要跟这篇重建混。

目录


要解决什么

每台前舱 2U,4 列 × 3 行,从左上角第一列往下编号:

0 3 6 9
1 4 7 10
2 5 8 11

槽 0 系统盘。槽 1–4 各一块 16T HC550,对象数据走 hdd。槽 10 是一块 Samsung PM883 1.92T SATA SSD,只当 BlueStore 的 WAL/DB,不是 OSD。背面槽 12/13 是 960G ssd

2026-09 上旬,每台槽 1–4 已经有 4 个 HDD OSD。其中 每台 2 块是整盘 BlueStore:WAL/DB 和数据同住 16T。另外 2 块是 09-11 新加的,创建时就把 DB 放到了槽 10。

BlueStore 不会在 OSD 活着的时候把 RocksDB 从 HDD 搬到 SSD。CR 里写了 metadataDevice 也只对新创建的 OSD 生效。所以那 6 个旧 OSD 只能:out → 等 remap → purge → 擦 16T → 再做成带 block.db 的 OSD。


槽 10 怎么切

官方量级是 HDD 容量的大约 4% 给 DB;现场按 2.5% 切:16T × 2.5% ≈ 430 GiB。Rook 字段是 databaseSizeMB: "440320"(440320 MiB = 430 GiB)。

每台 4 个 HDD OSD × 430 GiB = 1720 GiB。PM883 在 LVM 里大约 1788.5 GiB,切完剩约 68 GiB。缓存 WWN 不进 devices:,只出现在各 HDD 的 metadataDevice。按盘写,不写节点全局,免得槽 9 以后的 SSD / 槽 5–8 误继承。

host-based Rook 走 ceph-volume lvm batch --db-devices不要写 walSizeMB:会被忽略,WAL 同住那条 430 GiB DB LV,没有独立 osd-wal。helm rev 30 已经把 walSizeMB 从 CR 拿掉,当时没有重建任何 OSD。


第一波:空盘能过

2026-09-11 晚上,三台槽 10 刚擦过,还是空盘。helm rev 29 把每台剩下的 2 块 16T 加进 devices:,并给槽 1–4 都写上 metadataDevice。槽 10 当时没有 LVM 子设备,inventory 认得出这块盘,lvm batch 一次切出 2 条 430 GiB osd-db

做成:

当时已挂槽 10 当时仍是整盘
16.21 osd.15 / osd.17 osd.5(槽1)/ osd.11(槽3)
16.22 osd.13 / osd.16 osd.6(槽1)/ osd.8(槽2)
16.23 osd.12 / osd.14 osd.3(槽1)/ osd.7(槽3)

每台槽 10 还剩约 928 GiB,刚好够再挂 2 条 430 GiB。扩容回填结束后,对象数据已经主要在这 12 块 16T 上。10.1.16.254(原 TrueNAS)已关机,12 块 16T 都在 21/22/23,不要开机、不要把盘插回去。


为什么旧 6 个必须删掉重建

09-13 检查:那 6 个仍是 bluefs_dedicated_db=0。CR 早已写好 metadataDevice,改配置、helm upgrade、重启 OSD 都不会搬家

要挂槽 10,只能重建。removeOSDsIfOutAndSafeToRemove 是 false,Rook 不会自动 purge。不要用 osd.rook.io/replace,也不要用 rook-ceph-purge-osd Job。


6 块一起,还是 3+3

曾想先做干净的 3 块(当时的 osd.11 / 8 / 7),避开 SMART 重分配偏高的两块。算过墙钟之后改成 6 块一起 out

  • 每台 out 2 块,数据搬到同机剩下的 2 块已挂缓存 HDD,大约每台 6.4 TiB。
  • 3+3 要等两轮 remap,墙钟更长。
  • 对象池 EC 2+1、min_size=2。6 个 out 之后每台还剩 2 个 HDD OSD,集群还能写。再丢一台就到 min_size,重建期间不要整机维护、不要动 N9K。

SMART attr 5(Reallocated_Sector_Ct),2026-09-13 19:48 对照 09-04/05。pending / uncorr 当晚全是 0,12 块都 PASSED。

序列号 当时 记录 当晚 涨了?
2PGBPU7V 22 槽1 osd.6 397 / 0 · 35282h 397 / 0 · 35494h 没涨(进 Ceph 前就是 397)
2PGBRYGV 23 槽1 osd.3 222 / 0 · 36779h(TrueNAS sda 224 / 0 · 36992h +2(做成 OSD 这 9 天同盘 WAL 又映射了 2 个扇区)
2PGAK6VT 21 槽2 osd.15(已挂槽 10) 8 / 0 8 / 0 · 36991h 没涨,不重建
2CKHK8HN 21 槽1 osd.5 0 / CRC=99 0 / CRC=99 · 22960h 盘片没涨(CRC 是旧 ICRC)
2PG180HT 21 槽3 osd.11 0 0 干净
2PG13TMT 22 槽2 osd.8 0 0 干净
2PG15T0T 23 槽3 osd.7 0 0 干净

重分配对照必须看序列号,不要看当时的 OSD 号。重建之后号换了,见下文。


必须等 remap

6 个 OSD 里有 30 个 PG 三份都在这 6 块上out 之后 Ceph 会把它们搬到还 in 的盘。safe-to-destroy 在 remap 完成前是 EBUSY

不要在 EBUSY 时 purge,也不要加 --force 那 30 个 PG 会丢。等 393 个 PG 全 active+clean、没有 remapped,再 ceph osd safe-to-destroy 3 5 6 7 8 11


时间线(CST,UTC+8)

时间 发生了什么
09-11 晚 槽 10 三块 PM883 擦盘。helm rev 29:新 6 个 HDD OSD 挂槽 10(osd.12–17)。旧 6 个整盘不动
09-11 后 helm rev 30:CR 去掉无意义的 walSizeMB,未重建 OSD。扩容回填结束
09-13 20:13 ceph osd set noscrub / nodeep-scrubceph osd out 3 5 6 7 8 11。开始第一趟 remap
09-13 22:24 临时 osd_mclock_profile=high_recovery_opsosd_max_backfills=24(原 balanced / 16)。osd_recovery_max_active_hdd 仍是 3
09-14 14:08 393 PG 全 active+clean,无 remapped。safe-to-destroy 3 5 6 7 8 11 通过。6 个仍 up/out
09-14 14:10–14:48 operator→0。停 6 个 OSD。purge。按 WWN 擦 6 块 16T。开 operator → prepare 报 metadata device … is not found
09-14 14:34–14:38 确认上游限制:已占用的 metadataDevice 不能再加 OSD。否决「把槽 10 上已有 OSD 全删重建」
09-14 14:40–14:48 16.21 验证:预切 LV + ceph-volume lvm prepare --block.db。2CKHK8HN→osd.3,2PG180HT→osd.5
09-14 14:50–14:55 16.22 / 16.23 同样做完。18 OSD 全 up/in。operator=1
09-14 15:00 仍 第二趟 remap:158 clean / 235 remapped,约 55.6% shard misplaced,回填约 450–560 MiB/s

第一趟 remap

刚 out 时 misplaced 50.6%(约 1031 万 / 2038 万 shard)。数据从每台 2 块旧盘搬到同机 2 块已挂缓存的 HDD。

时刻 misplaced 还在 remap 的 PG
09-13 20:13 out 50.6% · 1031 万 224
09-13 22:16 45.0% 218
09-13 22:25(加大并发后) 44.7% 218
09-14 09:19 7.5% · 153 万 41
09-14 13:50 0.22% · 4.4 万 7(osd.7/11 已空)
09-14 14:08 0 · 393 clean 0

墙钟约 17 小时 55 分。6 个 OSD 此时是空壳,还在 up/out。数据已经在每台剩下的 2 块 HDD 上。purge 前不要关机、不要动盘。

加大并发的命令(toolbox):

Terminal window
ceph config set osd osd_mclock_profile high_recovery_ops
ceph config set osd osd_max_backfills 24

原值 balanced / 16第二趟 remap 干净之前不要改回去。


purge 和按 WWN 擦盘

顺序:

  1. kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=0
  2. scale rook-ceph-osd-{3,5,6,7,8,11} --replicas=0,等 6 个 pod 消失
  3. 必要时 ceph osd down 3 5 6 7 8 11
  4. 分别 ceph osd purge <id> --yes-i-really-mean-itceph osd tree 里没有这 6 个 ID
  5. 三台各擦 2 块 16T(下一节附录)。禁止 dmsetup remove_all禁止碰槽 10
  6. kubectl delete deploy rook-ceph-osd-{3,5,6,7,8,11}。残留 prepare job 也删

擦盘:

Terminal window
DEV=$(readlink -f /dev/disk/by-id/wwn-0x…)
lsblk -ndo SERIAL,SIZE,MODEL "$DEV" # 必须对上序列号
wipefs -a "$DEV"
sgdisk --zap-all "$DEV"
dd if=/dev/zero of="$DEV" bs=1M count=64 oflag=direct status=progress
partprobe "$DEV"
wipefs "$DEV" # 应为空

不要 /dev/sdX,不要 blkdiscard,不要 ceph-volume lvm zap 槽 10。osd.6 / osd.3 当时那两块有历史重分配,擦的是分区签名,不是全盘 shred。擦完槽 10 的 VFree 仍应约 928g,已有 osd-db 还在。


开 operator 之后:metadata device is not found

擦完 16T,以为开 operator 就会按 CR 再挂槽 10。prepare 报:

metadata device /dev/disk/by-id/wwn-0x5002538e… is not found

槽 10 在第一波里已经是 LVM PV:上面有 VG,还有 2 条 430 GiB osd-db(osd.15/17、13/16、12/14 还在跑)。Rook inventory 看到有 child 的盘就跳过,WWN 进不了可用设备表。CR 里的路径于是查不到。

同一件事的下一层:手跑 ceph-volume lvm batch --db-devicesfast devices were passed, but none are available。ceph-volume 也把「已经有 VG 的 DB 盘」当成不可用。

这不是擦盘擦坏了,也不是 WWN 写错。空盘第一次挂槽 10 能过;往已有 VG 上再加第 3、第 4 个 OSD 就会踩。对应 Rook 源码就是 context.Devices 里找不到这块盘,然后 metadata device %s is not found

09-14 14:34 联网搜的结论:这不是个案,Rook 自己就记着。databaseSizeMB 只影响第一次切 LV 的大小,不会让二次添加突然可用。单靠开 operator / helm 过不去。

  • rook#13634:往已经占用的 LVM metadata 盘再加 OSD → 同样 metadataDevice is not found。维护者原话:ceph-volume lvm batch 第一次会把 DB 盘按当时的数据盘切满;以后再加盘时这块 DB 盘不再 available
  • rook#15220(travisn):节点上 已经有 OSD 占用了这张 metadata 盘,再加新 OSD,目前不支持
  • rook#13240:共享 metadata 盘上换单块 OSD,Rook 还没做完。
  • rook#7121 + ceph-users:手动 lvm batch 时,必须把当初那一组数据盘全部再传一遍(已做好的会 skip),只传新盘会报 none are available
  • Ceph tracker #44749lvm batch 不会自动吃 VG 上剩余的 VFree

社区给出的几条路

当天从表里挑,没有「改个 CR 就能接着挂」的开关。

做法 适用 当天怎么选
共享这块 SSD 的 OSD 全部删掉、一次 batch 建齐 Rook 官方态度;要这台 HDD OSD 能先 remap 走 3 台时否决。EC 2+1 / host,没有第四台接数据。≥4 台有 HDD 时可以一台一台做
手动 ceph-volume lvm batch数据盘名单含已存在的那两块(例如 21 上是槽 2/4 + 两块新盘),--db-devices 仍用槽 10,--block-db-size 430GiB ceph-volume 维护者推荐;Rook 不会自己这么调 没走。只传新盘已经报 none are available。tracker #44749:就算把 4 块 HDD 全传进去,batch 也不会去吃现有 VG 的 VFree
自己先 lvcreate 430G,再 ceph-volume lvm prepare --block.db vg/lv 绕开 batch 对「已占用 DB 盘」的过滤;Rook 再 lvm list 收养 选定。DB 用已经存在的 LV,不再让 batch 去发现整块槽 10。16.21 上 2CKHK8HN 当天就做成了 osd.3
新盘不挂槽 10,DB 跟数据盘在一起 能避开这个 bug,但和这次目标相反 否决
第一次就预留 --block-db-slots 4 已经切过的 VG 补不上,只对下一轮空盘有用 当时槽 10 已经切过,补不上

为什么不把槽 10 上已有 OSD 全删重建

表里第一行是 Rook 官方态度:把共享这块缓存盘的 HDD OSD 全部删掉,槽 10 变回空盘,再一次 lvm batch。理论上能绕过限制。

现在只有 3 台,这条走不通。 对象池是 EC 2+1、故障域 host、min_size=2。每个 PG 已经用满三台。把一台槽 1–4 的 4 个 HDD OSD 全 out,第三份没有第四台可搬safe-to-destroy 不会通过。若不等 remap 就 purge,等于故意丢掉这台身上那 1/3,靠另外两台做 EC 重建;全程只剩 min_size,再坏一台就丢数据。当天否决的就是这个。

机器够多时可以按官方做。 至少 4 台已经有 HDD OSD 的机,才能一台一台:out 这一台全部 HDD → 等 remap 到另外三台 → safe-to-destroy → purge → 擦槽 10 → 一次 batch 把这台 4 块 16T 建齐。一次只动一台,对象池还能放满 2+1。这是「想让 Rook 自己 batch」时才需要的路径,不是换单块 16T 的必经之路;换一块仍然用第三行(预切 LV + prepare --block.db)。

当天选定第三行:预切 LV + ceph-volume lvm prepare --data vg/lv --block.db vg/lv,然后 operator lvm list 收养。不走 lvm batch,不动已经在跑的 osd.12–17。


做成这样才稳

operator 保持 0,直到 6 块都 prepare 完。Job:

  • hostIPC: true,特权,镜像 harbor.cyxc.club/quay/ceph/ceph:v19.2.3
  • 不要挂宿主机 /etc/lvm(宿主机默认 udev_sync=1,容器里 lvcreate 会卡在 do_semtimedop 十几分钟)
  • 不要挂整个 /run(会连上宿主机 lvmpolld,IPC 对不上)
  • 挂:/dev/run/udev/run/lock/var/lib/rook
  • 需要 client.bootstrap-osd keyring:ceph auth get client.bootstrap-osd

每块盘:

  1. 槽 10 现有 VG 上:

    Terminal window
    lvcreate --noudevsync -y -Wn -Zn -L 440320M -n osd-db-<uuid> <slot10-vg>

    不要 -W y,否则 Failed to wipe start of new LV(udev 还没创节点)。

  2. 16T 上自己做 data LV(这样 prepare 不再自己 lvcreate,也就不会再卡 udev):

    Terminal window
    pvcreate --yes /dev/disk/by-id/wwn-0x… # 没有 --noudevsync
    vgcreate --yes ceph-<uuid> /dev/disk/by-id/wwn-0x…
    lvcreate --noudevsync -y -Wn -Zn -l 100%FREE -n osd-block-<uuid> <data-vg>
    dmsetup mknodes
    # 等到 /dev/<vg>/<lv> 出现
  3. prepare:

    Terminal window
    ceph-volume lvm prepare --bluestore --no-systemd \
    --crush-device-class hdd \
    --data <data-vg>/<data-lv> \
    --block.db <slot10-vg>/osd-db-<uuid>
  4. 宿主机事后 pvscan --cache,否则 host pvs 暂时看不见新 PV。

开 operator 前清掉已 purge OSD 的:

/var/lib/rook/rook-ceph/<cluster-fsid>_<osd-fsid>

否则 ceph-volume raw list 会误起幽灵 deploy。


16.21 验证

先做 k8s-10-1-16-21。槽 10 VG ceph-9cd37193-a269-4cd4-9a98-8473cc0d34c7,缓存 SN S455NY0MB34106 / WWN 5002538e09b8d73f

序列号 WWN 结果
1 2CKHK8HN 5000cca2a1f158ec osd.3,DB 430 GiB 在 PM883
3 2PG180HT 5000cca2c1c09276 osd.5,同上

osd.15 / osd.17 未动。槽 10 变成 4 条 430 GiB osd-db,VFree 约 68.49g。

中间失败过一次:给槽 10 切第二条 DB LV 时用了 -W y,udev 节点没出来。改成 -Wn -Zn 后第二条做成。数据盘那次 14.55T lvcreate 在没加 hostIPC、还挂着宿主机 lvm.conf 时卡了大约 12 分钟。

开过一次 operator:raw list 扫到已 purge 的 osd.11 残留目录,差点在 2PG180HT 上再起一个幽灵 rook-ceph-osd-11,并对这块盘跑 raw activate。删掉那个 deploy,清旧 fsid 目录,operator 缩回 0。后面 22/23 开 operator 之前同样先清。


16.22 / 16.23

同一套 Job,换节点、换 WWN、换槽 10 VG,KEEP_DBS 写成该机已有的 2 条 osd-db(osd.13/16、osd.12/14),避免误用。

16.23 一次成功。16.22 第一块成功;第二块 osd newentity osd.11 exists but key does not match——purge 留下了 auth。ceph auth del osd.11 后复用已经切好的 LV,做成 osd.11。

序列号 WWN 新 OSD 槽 10
16.22 1 2PGBPU7V 5000cca2c1c551f8 osd.7 S455NY0R712793 / 5002538e0174c2e8
16.22 2 2PG13TMT 5000cca2c1c0829d osd.11 同上
16.23 1 2PGBRYGV 5000cca2c1c5563c osd.6 S455NY0KA00972 / 5002538e00024339
16.23 3 2PG15T0T 5000cca2c1c08a0c osd.8 同上

清旧 rook 目录后 operator replicas=1。Rook lvm list 收养,没有再走失败的 lvm batch


验证

2026-09-14 14:55 起:

osd: 18 osds: 18 up, 18 in

ceph osd metadata:12 个 HDD 都是 bluefs_dedicated_db=1bluefs_dedicated_wal=0bluefs_db_size=430 GiBbluefs_db_rotational=0device_ids 里同时有对应 16T 序列号和该机槽 10 PM883。SCSI 路径 pci-0000:02:00.0-scsi-0:0:<槽>:0 与前舱槽位一致。

每台槽 10:4 条 430 GiB osd-db active,VFree 68.49g。没有独立 osd-wal

槽 10 VG 挂着的 OSD
16.21 ceph-9cd37193-a269-4cd4-9a98-8473cc0d34c7 osd.3 / 5 / 15 / 17
16.22 ceph-b7b70fd7-59bf-4c38-b3db-2690da9da354 osd.7 / 11 / 13 / 16
16.23 ceph-11c51d35-ffd9-4fa8-b4ce-0701e99528bc osd.6 / 8 / 12 / 14

硬认命令:

Terminal window
ceph osd tree
ceph osd metadata osd.7 | grep -E 'hostname|device_ids|bluefs_dedicated|bluefs_db_size'
ssh root@10.1.16.22 'pvs; lvs -o vg_name,lv_name,lv_size,lv_attr'

OSD 号已换盘

purge 之后 Ceph 复用了 3/5/6/7/8/11,但盘和号不再是原来那一对。认序列号。

序列号 机 / 槽 重建前 重建后
2CKHK8HN 21 槽1 osd.5 osd.3
2PG180HT 21 槽3 osd.11 osd.5
2PGBPU7V 22 槽1 osd.6 osd.7
2PG13TMT 22 槽2 osd.8 osd.11
2PGBRYGV 23 槽1 osd.3 osd.6
2PG15T0T 23 槽3 osd.7 osd.8

未重建:2PGAK6VT=osd.15,2PGBNGKV=osd.17,2DG026YS=osd.13,2PG0KHYT=osd.16,2PG1XWJT=osd.12,2PG22LLT=osd.14。SSD 未变:21 osd.0/1,22 osd.2/4,23 osd.9/10。


以后换盘还是这个问题

这不是 09-14 擦盘留下的一次性故障。槽 10 只要还有 LVM,Rook 的 metadataDevice 就找不到这块盘。换槽 1–4 里一块 16T,会再报同一个 metadata device is not found 槽 10 这块 PM883 坏了则是另一条:这台 4 个 HDD OSD 的 DB 一起掉,3 台上等不到 remap。

换盘不要写在这篇重建记录里跟做。完整两条流程:机械盘和缓存盘故障时怎么换

以后怎么动盘 会不会再踩 metadata device is not found
换槽 1–4 里一块 16T 会。 预切 LV + prepare --block.db,不要擦槽 10
槽 1–4 四块一起 purge,并且擦掉槽 10 再一次 lvm batch 不会,但是 3 台上没有第四台接数据;只有槽 10 已经坏了、这 4 个 OSD 已经起不来时才走缓存盘那条
槽 11 还是空盘,槽 5–8 一次加齐 多半不会
槽 11 上已经挂过 1 个 OSD,再加下一块
槽 10 PM883 自己坏了 不是这条报错;见 换槽 10 缓存盘

下次若用槽 11 带槽 5–8:尽量 4 块一起加--block-db-slots 4 只对还没切过的缓存盘有用,槽 10 已经切满,补不上。


踩过的坑

现象 原因 处理
metadata device … is not found 槽 10 已有 LVM,Rook / lvm batch 不再认这块盘 预切 LV + prepare --block.db
fast devices … none are available 同上,batch 不吃现有 VG 的 VFree 不要再试 batch
lvcreate 卡十几分钟 do_semtimedop 挂了宿主机 /etc/lvmudev_sync=1 用镜像自带 lvm.conf;Job hostIPC: true
Failed to wipe start of new LV lvcreate -W y,udev 节点还没有 -Wn -Zn,然后 dmsetup mknodes
挂整个 /run 连上宿主机 lvmpolld 只挂 /run/udev/run/lock
幽灵 rook-ceph-osd-11 /var/lib/rook/…_<旧osdfsid> 还在,raw list 误激活 开 operator 前删这些目录
entity osd.N exists but key does not match purge 留下 auth ceph auth del osd.N,复用已切 LV 再 prepare
host pvs 看不见新 PV 容器里做的 PV,udev 缓存没刷新 宿主机 pvscan --cache
pvcreate --noudevsync 不稳 数据盘这条路径需要 udev pvcreate --yes,不要 --noudevsync

不要做

  • safe-to-destroy 还是 EBUSY 就 purge / 加 --force
  • 擦槽 10 / dmsetup remove_all / 动缓存 VG(osd.12–17 的 DB 在上面;重建期间它们曾是每台仅剩的 2 块)
  • /dev/sdX 擦盘
  • 为了重建去 helm upgrade / 改 CR(配置已经对了,改了也不会搬家)
  • 换一块槽 1–4 的 16T 之后指望开 operator 自动挂槽 10(还是 metadata device is not found,见 换盘
  • 把槽 10 上已有 6 个 HDD OSD 全删再 batch(当时数据全在它们身上)
  • 重建期间整机维护或动交换机
  • remap 没干净就改回 mclock / 开 scrub

还没做

写这篇的时候(2026-09-14 约 15:00)第二趟 remap 还在跑:158/393 active+clean,235 remapped,约 55.6% objects misplaced,回填约 450–560 MiB/s。新 6 个 OSD 刚 in,PGS 还是 0,数据会摊回去。

等 393 个 PG 全 active+clean、无 remapped 之后:

Terminal window
ceph config set osd osd_mclock_profile balanced
ceph config set osd osd_max_backfills 16
ceph osd unset noscrub
ceph osd unset nodeep-scrub

HEALTH_WARN 里「59 pgs not deep-scrubbed in time」是 noscrub 期间积下来的,unset 之后会自己补。


附录:Job 骨架

namespace: rook-cephnodeSelector、槽 10 VG、WWN、KEEP_DBS 按机替换。KEEP_DBS 必须是该机已经在跑osd-db 名字,prepare 前用 lvs 核对。

apiVersion: batch/v1
kind: Job
metadata:
name: cv-prepare-<node>
namespace: rook-ceph
spec:
backoffLimit: 0
activeDeadlineSeconds: 1800
template:
spec:
restartPolicy: Never
hostIPC: true
nodeSelector:
kubernetes.io/hostname: k8s-10-1-16-22
containers:
- name: cv
image: harbor.cyxc.club/quay/ceph/ceph:v19.2.3
securityContext:
privileged: true
runAsUser: 0
env:
- name: LVM_SUPPRESS_FD_WARNINGS
value: "1"
- name: PYTHONUNBUFFERED
value: "1"
command: ["bash", "-lc"]
args:
- |
set -euo pipefail
mkdir -p /etc/ceph /var/lib/ceph/bootstrap-osd
cp /var/lib/rook/rook-ceph/rook-ceph.config /etc/ceph/ceph.conf
cp /var/lib/rook/rook-ceph/client.admin.keyring \
/etc/ceph/ceph.client.admin.keyring
ceph --name client.admin \
--keyring /etc/ceph/ceph.client.admin.keyring \
auth get client.bootstrap-osd \
-o /var/lib/ceph/bootstrap-osd/ceph.keyring
# assert WWN + SERIAL;槽 10 VG 对得上;KEEP_DBS 仍在
# lvcreate --noudevsync -y -Wn -Zn -L 440320M -n osd-db-… <DB_VG>
# pvcreate --yes /dev/disk/by-id/wwn-0x…
# vgcreate --yes ceph-… /dev/disk/by-id/wwn-0x…
# lvcreate --noudevsync -y -Wn -Zn -l 100%FREE -n osd-block-… <DATA_VG>
# dmsetup mknodes;等到 /dev/vg/lv 出现
# ceph-volume lvm prepare --bluestore --no-systemd \
# --crush-device-class hdd \
# --data <DATA_VG>/<DATA_LV> \
# --block.db <DB_VG>/<DB_LV>
volumeMounts:
- {name: devices, mountPath: /dev}
- {name: udev, mountPath: /run/udev}
- {name: lvm-lock, mountPath: /run/lock}
- {name: rook, mountPath: /var/lib/rook}
volumes:
- {name: devices, hostPath: {path: /dev}}
- {name: udev, hostPath: {path: /run/udev}}
- {name: lvm-lock, hostPath: {path: /run/lock}}
- {name: rook, hostPath: {path: /var/lib/rook}}

现场用过的完整 Job 在节点操作机 /tmp/cv-prepare-21.yamlcv-prepare-21-slot3.yamlcv-prepare-22.yamlcv-prepare-22-slot2.yamlcv-prepare-23.yaml。22 第二块是 cv-prepare-22-slot2:auth 删掉之后只 prepare 已切 LV,不再 lvcreate