「ROOK-CEPH」- 管理 OSD 实例

添加 OSD 实例(增)

磁盘清理

DISK="/dev/sdX"

# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)
sgdisk --zap-all $DISK

# Wipe a large portion of the beginning of the disk to remove more LVM metadata that may be present
dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

# SSDs may be better cleaned with blkdiscard instead of dd
blkdiscard $DISK

# Inform the OS of partition table changes
partprobe $DISK

删除 OSD 实例(删)

Rook Docs/Ceph OSD Management/Remove an OSD
Ceph OSD Management – Rook Ceph Documentation

需要部署 Rook Toolbox 容器,然后进入容器对 Rook-Ceph Cluster 进行管理操作;
当通过 Helm 部署 Ceph 时,能够在 values.yaml 中指定是否安装 toolbox 服务;

在 Rook Ceph 中,需要手动执行 OSD 删除,而无法自动删除;

第一步、删除前确认工作

在删除前,需要进行如下确认:
1)当删除 OSD 实例后,磁盘具有足够空间来容纳数据;
2)确定剩余 OSD 及 PG 的健康状况,以用于数据重平衡;
3)不要一次删除太多 OSD 实例,并且等待重平衡结束;
4)如果 PG 全部为 active+clean 状态,并且未提示空间不足,则可以安全进行操作;

第二步、进行 OSD 删除

通过手动进行 OSD 清理操作:

# ----------------------------------------------------------------------------- # 停止 Operator 运行

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

# ----------------------------------------------------------------------------- # 进入工具箱进行操作

CEPH_TOOLBOX=$(kubectl get pods -l app=rook-ceph-tools -o=jsonpath='{.items[0].metadata.name}')

# 移除 OSD 实例
kubectl exec $CEPH_TOOLBOX -- ceph osd out osd.<ID>

# 等待所有 PG 进入 active+clean 状态(即数据开始同步)
kubectl exec $CEPH_TOOLBOX -- ceph status

# 更新 CephCluster CR 以避免再次使用该磁盘
# 如果 useAllDevices: true 则不需要调整
...

# 停止 OSD 实例
# 执行 ceph osd down osd.<ID> 无效果,需要删除 Deployment 才能 Down OSD 实例;
kubectl -n rook-ceph scale deployment rook-ceph-osd-<ID> --replicas=0
kubectl exec $CEPH_TOOLBOX -- ceph osd down osd.<ID>
kubectl delete deployment -n rook-ceph rook-ceph-osd-<ID>

# 清除 OSD 磁盘
kubectl exec $CEPH_TOOLBOX -- ceph osd purge <ID> --yes-i-really-mean-it

# 从物理主机中删除磁盘
...

# ----------------------------------------------------------------------------- # 恢复 Operator 运行

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

通过 rook-ceph 插件(Krew),完成清理工作:

# https://rook.io/docs/rook/v1.10/Storage-Configuration/Advanced/ceph-osd-mgmt/#purge-the-osd-with-krew
# https://github.com/rook/kubectl-rook-ceph#install
kubectl rook-ceph rook purge-osd 0 --force

# 实测,该命令不能直接用于 OSD 删除,其提示 cephosd: osd.0 is healthy. It cannot be removed unless it is 'down' 信息;