问题描述
该笔记将记录:在 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