替换或移除存储节点

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

如果 OSD 由 Local Storage Block PV(CephCluster.spec.storage.storageClassDeviceSets)提供支持,请先按照替换或移除由 PVC 支持的 OSD 设备中的说明移除或替换该节点上的每个 OSD,然后再排空并移除节点。请勿删除由 PVC 支持的 OSD 的 spec.storage.nodes 条目。

WARNING

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

此操作步骤用于永久移除存储节点及其 OSD 数据。不适用于 Alauda OS 节点替换。对于其 provider 管理的持久磁盘正通过池槽重新挂载的 Alauda OS worker,请勿将 OSD 标记为 out,删除 CephCluster 节点条目,清除 OSD,或将持久磁盘视为替换磁盘。请改为遵循Alauda OS 部署先决条件和 provider 的节点替换操作步骤。

先决条件

  • 所有集群组件(如适用,不包括故障节点)均运行正常。

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

约束和限制

  • 在三节点 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,选择新节点并选择适当的磁盘。如果旧节点在不同设备类中包含多个磁盘,请针对每个磁盘/设备类组合重复此步骤,直到所有磁盘均已添加。

  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 部署。

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

参考资料