替换或移除设备

本文档介绍如何从由 Container Platform 管理的 Rook-Ceph 集群中移除存储设备(磁盘)。根据剩余 OSD 是否有足够容量承载被移除磁盘上的数据,您可能需要先添加替换磁盘。

前提条件

  • 所有集群组件均正常运行。

  • 存储集群使用“添加所有空磁盘”选项创建。通过运行以下命令验证,输出必须显示 useAllDevices: false

    kubectl get cephcluster -n rook-ceph ceph-cluster -o yaml | grep useAllDevices
  • 适用于平台版本 3.8 及以上。

约束与限制

  • 在数据重新平衡期间,集群性能可能会暂时下降。除非必要,避免同时操作多个磁盘。

  • 如果集群处于 HEALTH_ERR 状态,且原因被移除磁盘导致,请勿继续操作。此时继续操作可能进一步影响数据可靠性。

  • 如果被移除的磁盘是某个设备类的最后一块磁盘,则该设备类将不复存在。任何依赖该设备类的存储池或策略将受到影响。操作前请确保没有存储池仅绑定该设备类。

操作步骤

检查集群状态和容量

  1. 验证集群整体健康状态。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s
  2. 确认待移除磁盘对应的 OSD ID 及使用情况。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd df

    记录目标 OSD 的 USE 值。然后确认剩余所有 OSD(不含目标)AVAIL 总和大于目标 OSD 的 USE 值,确保剩余 OSD 有足够空闲空间承载移除后的数据。

    若剩余容量不足,请继续下一步先添加替换磁盘;否则跳至缩减 Rook Operator

添加替换磁盘(如有需要)

若剩余 OSD 空间不足,需先添加替换磁盘再移除旧磁盘。此步骤需确保 Rook operator 正在运行。

  1. 进入 Container Platform

  2. 在左侧导航栏点击 存储管理 > 分布式存储 > 设备类

  3. 点击 添加设备,选择替换磁盘所在节点,选择新磁盘,并分配到与被移除磁盘相同的设备类。

  4. 等待新 OSD 创建完成并完成数据重新平衡。可通过以下命令监控进度:

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s

    等待输出显示 HEALTH_OK,且无 misplaced 或 recovering 的 PG。

缩减 Rook Operator

缩减 Rook operator,防止其在移除过程中干扰(例如中途重新创建已删除的 OSD 部署)。

kubectl -n rook-ceph scale deploy rook-ceph-operator --replicas=0

标记 OSD 为 Out 并等待数据迁移

  1. 若 rook-ceph-tools pod 未运行,启用它。

    kubectl -n rook-ceph scale deploy rook-ceph-tools --replicas=1
  2. 进入 tools pod。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
  3. 将 OSD 标记为 out,指示 Ceph 将该 OSD 上所有数据迁移到剩余 OSD。

    ceph osd out osd.<id>
  4. 监控重新平衡进度,直到集群恢复 HEALTH_OK,且无 misplaced 或 recovering 的 PG。

    ceph -s

    数据迁移未完成前请勿继续操作。 过早移除 OSD 会导致数据丢失。

移除 OSD

  1. 编辑 CephCluster 资源,删除对应磁盘条目。

    kubectl edit cephcluster -n rook-ceph ceph-cluster

    找到 spec.storage.nodes 下的磁盘条目并删除,保存退出。

  2. 删除 OSD 部署。

    kubectl -n rook-ceph delete deploy rook-ceph-osd-<osd-id>
  3. 进入 tools pod,永久从集群中移除该 OSD。将 <id> 替换为 OSD ID。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

    在 tools pod 内执行:

    ceph osd purge osd.<id> --yes-i-really-mean-it

清理磁盘

若磁盘仍物理连接在节点上,需清除其元数据,防止 Rook 误识别。请在磁盘所在节点上执行以下命令,将 /dev/vdb 替换为实际设备路径。

# 移除 Ceph 留下的任何 device-mapper 条目
dmsetup remove /dev/mapper/ceph--<vg-name>   # 如存在,替换为实际映射名称

# 清除分区表
sgdisk --zap-all /dev/vdb

# 清零前 100 MB,清除残留 Ceph 元数据
dd if=/dev/zero of=/dev/vdb bs=1M count=100 oflag=direct,dsync

恢复 Rook Operator

集群健康后,恢复 Rook operator。

kubectl -n rook-ceph scale deploy rook-ceph-operator --replicas=1

验证集群健康

  1. 确认已移除的 OSD 不再出现在集群中。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd tree
  2. 验证集群已恢复健康状态。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s

    输出应显示 HEALTH_OK,且所有 PG 处于 active+clean 状态。

参考资料