替换或移除存储节点

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

前提条件

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

  • 开始操作前,记录旧节点拥有的磁盘数量及每个磁盘所属的设备类别。

约束与限制

  • 在三节点 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 的部署。

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

References