替换或移除存储节点

本文档介绍如何从由 Container Platform 管理的 Rook-Ceph 集群中移除一个存储节点。根据剩余 OSD 是否有足够容量吸收正在移除节点上的数据,您可能需要先添加一个替换节点。

WARNING

此操作步骤适用于永久移除存储节点及其 OSD 数据。不适用于 Immutable Infrastructure 节点替换。对于由提供商管理持久磁盘、并通过池槽重新挂载的 Immutable Infrastructure worker,请不要将 OSD 标记为 out、删除 CephCluster 节点条目、清理 OSD,或将持久磁盘视为替换磁盘。请改为遵循 Immutable Infrastructure 上部署 Rook-Ceph 的前提条件 以及提供商的节点替换操作步骤。

前提条件

  • 除故障节点(如果适用)外,集群所有组件均正常运行。

  • 开始之前,请记录旧节点上的磁盘数量以及每个磁盘所属的 device class。

约束与限制

  • 在三节点 Ceph 集群中,丢失一个节点已经会降低冗余性。请尽快完成此操作步骤,以尽量缩小风险窗口。

  • 在数据重新均衡期间,集群 I/O 性能可能会暂时下降。

  • 如果集群处于 HEALTH_ERR,且原因不是即将移除的节点,则不要继续。在这种状态下继续操作可能会进一步降低数据韧性。

操作步骤

检查集群状态和容量

  1. 标识要移除节点上运行的所有 OSD ID 及其磁盘使用情况。

    kubectl -n rook-ceph get pod -l app=rook-ceph-osd -o wide | grep <old-node-name>
  2. 验证整体集群健康状态。

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s
  3. 检查所有 OSD 的容量。

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

    计算要移除节点上所有 OSD 的 USE 值总和。然后确认其他所有剩余节点上的所有 OSD 的 AVAIL 总和大于该总和。这样可以确保在节点移除后,剩余 OSD 有足够的可用空间吸收数据。

    如果剩余容量不足,请先执行下一步添加替换节点。否则,跳到 调整组件部署配置。

添加替换节点(如需要)

如果剩余 OSD 没有足够的可用容量,请先添加替换节点,然后再移除旧节点。

  1. 进入 Container Platform。

  2. 使用平台的节点管理功能将替换机器添加为新的集群节点。

  3. 节点加入集群后,将其添加为存储节点。导航到 Storage Management > Distributed Storage > Device Classes。

  4. 单击 Add Device,选择新节点,并选择合适的磁盘。如果旧节点在不同的 device class 中有多个磁盘,请针对每个磁盘/device-class 组合重复此步骤,直到所有磁盘都已添加。

  5. 等待新的 OSD 变为活动状态,并等待数据重新均衡完成。监控进度:

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

    请等待集群恢复为 HEALTH_OK,并且没有 misplaced 或 recovering 的 PG 后再继续。

调整组件部署配置

Rook 管理的 Ceph 守护进程(MON、MGR、MDS)可能会调度到旧节点上。请将旧节点从组件调度中排除,以便 operator 将这些组件重新调度到其他节点。

  1. 在 Container Platform 中,导航到 Storage Management > Distributed Storage > Storage Components > Component Deployment Configuration。

  2. 启用节点绑定,并仅选择应保留在集群中的节点(排除要移除的节点)。

  3. 在继续之前,等待所有 MON、MGR 和 MDS pod 运行在剩余节点上。

    kubectl -n rook-ceph get pod -o wide

将所有 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>

    对该节点上的每个 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 对应的 OSD deployment。

    kubectl -n rook-ceph delete deploy rook-ceph-osd-<osd-id>

    对该节点上的每个 OSD ID 重复此操作。

  3. 进入 tools pod,并从集群中永久移除每个 OSD。

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

    在 tools pod 中,对每个 OSD 执行以下命令:

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

验证集群健康状态

  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 状态。

参考资料