替换或移除设备

本文档介绍如何从基于主机的 Rook-Ceph 集群(CephCluster.spec.storage.nodes)中移除存储设备(磁盘)。根据剩余 OSD 是否有足够容量来容纳待移除磁盘中的数据,您可能需要先添加替换磁盘。

如果 OSD 由 Local Storage Block PV(CephCluster.spec.storage.storageClassDeviceSets)提供支持,请改用替换或移除由 PVC 支持的 OSD 设备。不要编辑 spec.storage.nodes。不要擦除仍绑定到 PV 的设备;PV 变为 Available 后,按照该页面中的说明清除遗留的 BlueStore 标签,然后再重复使用。

WARNING

这些步骤适用于在以内部模式部署中从主机设备创建的 OSD。不要将其用于从 Local Storage Block PersistentVolumes 创建的 OSD。请参阅使用 Local Storage 以内部模式部署。

前提条件

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

  • 存储集群不是通过“添加所有空磁盘”选项创建的。运行以下命令进行验证;输出必须显示 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)大于目标 OSD 的 USE 值。这可确保剩余 OSD 有足够的可用空间来容纳移除磁盘后的数据。

    如果剩余容量不足,请继续下一步以先添加替换磁盘。否则,请跳转到缩容 Rook operator。

添加替换磁盘(如需要)

如果剩余 OSD 没有足够的可用容量,请在移除旧磁盘前添加替换磁盘。在此步骤期间,Rook operator 必须处于运行状态。

  1. 进入容器平台。

  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 替换为实际的设备路径。

# Remove any device-mapper entries left by Ceph
dmsetup remove /dev/mapper/ceph--<vg-name>   # Replace with the actual mapper name if present

# Wipe the partition table
sgdisk --zap-all /dev/vdb

# Zero the first 100 MB to clear residual Ceph metadata
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 状态。

参考