「Ceph」- 常见 OSD 管理

  CREATED BY JENKINSBOT

问题描述

该笔记将记录:在 Ceph Cluster 中,如何对 OSD 进行管理,以及相关问题的解决方案;

解决方案

OSD 维护是 Ceph Cluster 维护的常见任务;

[Cephadm] 添加 OSD 实例

Ceph Documentation/OSD Service/CREATING NEW OSDS

# Tell Ceph to consume any available and unused storage device:
ceph orch apply osd --all-available-devices

# Create an OSD from a specific device on a specific host:
ceph orch daemon add osd *<host>*:*<device-path>*

# ceph osd tree

通过标志位,控制 OSD 行为

noout:该标志位将使 Ceph 集群不会将任何 OSD 标记为 out,无论其实际状态如何。这将会把所有的 OSD 保留在 Ceph 集群中;
nodown:该标志位将使得 Ceph 集群不会将任何 OSD 标记为 down,无论其实际状态如何。这将会使集群中的所有 OSD 保持 UP 状态,而不会是 DOWN 状态;
noup:该标志位将使得 Ceph 集群不会将任何 DOWN OSD 标记为 UP 状态。这样,任何被标记为 DOWN 的 OSD 都将只有在该标志位被清除以后,才会被标记为 UP。该标志位也会被用于新加入集群中的 OSD;
noin:该标志位将使得 Ceph 集群不允许任何新的 OSD 加入集群。这在需要一次性加入多个 OSD 到集群中而不想它们自动地被加入集群时非常有用;
norecover:该标志位将使得 Ceph 集群不做集群恢复(cluster recovery);
nobackfil1:该标志位将使得 Ceph 集群不做数据回填 (backfilling)。这在一次性加入多个 OSD 但是不想 Ceph 自动将数据分布到它们上时会非常有用;
norebalance:该标志位将使得 Ceph 集群不做任何集群再平衡(cluster rebalancing );
noscrub:该标志位将使得 Ceph 集群不做 OSD 清理 (scrubbing);
nodeep-scrub:该标志位将使得 Ceph 不做 OSD 深度清理(deep scrubbing );
notieragent:该标志位将禁用缓存分层代理 (cache pool tiering agent);

# ceph osd set noout
# ceph osd set nodown

# ceph osd unset noout

[Cephadm] 删除 OSD 实例

// ---------------------------------------------------------------------------- // 数据迁移

# ceph osd out osd.9
# ceph osd out osd.8
# ceph osd out osd.7

# ceph -s
... 需要等待集群 HEALTH_OK 状态;

// ---------------------------------------------------------------------------- // 停止服务

# systemctl status ceph-<cluster-id>@osd.3.service

# ceph osd tree

// ---------------------------------------------------------------------------- // 删除配置

# ceph osd crush remove osd.9
# ceph osd crush remove osd.8
# ceph osd crush remove osd.7

# ceph auth del osd.9
# ceph auth del osd.8
# ceph auth del osd.7

# ceph osd rm osd.9
# ceph osd rm osd.8
# ceph osd rm osd.7

// ---------------------------------------------------------------------------- // 节点清理

# ceph osd crush remove cepe-node-09

[Cephadm] 替换 OSD 实例

针对 OSD 替换(物理磁盘替换),

1)首先要针对 OSD 删除,参考前面步骤,这里不再赘述;

2)然后,进行物理磁盘的替换操作;

3)重新进行磁盘的添加操作:

# ceph device ls                                                                // 查看

# ceph-volume lvm zap /dev/sdc1                                                 // 清理

# ...                                                                           // 添加(略)

# ceph -s
# ceph osd stat

[Cephadm] 修复 OSD 实例

ceph osd repair

[Rook-Ceph] 删除 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 删除

通过 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 清理操作:

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

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

kubectl exec -it rook-ceph-tools-665656bf9-xr2nm -- sh

# 移除 OSD 实例,此时数据开始同步
ceph osd out osd.<ID>

# 等待所有 PG 进入 active+clean 状态;
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
ceph osd down osd.<ID>
kubectl delete deployment -n rook-ceph rook-ceph-osd-<ID>

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

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

# 恢复 Operator 运行
kubectl -n rook-ceph scale deployment rook-ceph-operator --replicas=1