2.2. 带有单一副本的存储类
您可以使用单个副本创建存储类,供您的应用程序使用。这可避免冗余数据副本,并允许在应用程序级别上进行弹性管理。
启用这个功能会创建一个没有数据复制的副本池,如果应用程序本身没有复制,这会增加数据丢失、数据崩溃和潜在的系统不稳定的风险。如果有任何 OSD 丢失,此功能需要非常破坏性的步骤来恢复。所有应用可能会丢失其数据,在故障 OSD 时必须重新创建。
流程
使用以下命令启用单个副本功能:
$ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'验证
storagecluster是否处于Ready状态:$ oc get storagecluster输出示例:
NAME AGE PHASE EXTERNAL CREATED AT VERSION ocs-storagecluster 10m Ready 2024-02-05T13:56:15Z 4.17.0为每个故障域创建新的
cephblockpools。验证cephblockpools是否处于Ready状态:$ oc get cephblockpools输出示例:
NAME PHASE ocs-storagecluster-cephblockpool Ready ocs-storagecluster-cephblockpool-us-east-1a Ready ocs-storagecluster-cephblockpool-us-east-1b Ready ocs-storagecluster-cephblockpool-us-east-1c Ready验证新存储类是否已创建:
$ oc get storageclass输出示例:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer true 104m gp2-csi ebs.csi.aws.com Delete WaitForFirstConsumer true 104m gp3-csi ebs.csi.aws.com Delete WaitForFirstConsumer true 104m ocs-storagecluster-ceph-non-resilient-rbd openshift-storage.rbd.csi.ceph.com Delete WaitForFirstConsumer true 46m ocs-storagecluster-ceph-rbd openshift-storage.rbd.csi.ceph.com Delete Immediate true 52m ocs-storagecluster-cephfs openshift-storage.cephfs.csi.ceph.com Delete Immediate true 52m openshift-storage.noobaa.io openshift-storage.noobaa.io/obc Delete Immediate false 50m创建新 OSD pod;3 osd-prepare pod 和 3 个额外的 pod。验证新 OSD pod 是否处于
Running状态:$ oc get pods | grep osd输出示例:
rook-ceph-osd-0-6dc76777bc-snhnm 2/2 Running 0 9m50s rook-ceph-osd-1-768bdfdc4-h5n7k 2/2 Running 0 9m48s rook-ceph-osd-2-69878645c4-bkdlq 2/2 Running 0 9m37s rook-ceph-osd-3-64c44d7d76-zfxq9 2/2 Running 0 5m23s rook-ceph-osd-4-654445b78f-nsgjb 2/2 Running 0 5m23s rook-ceph-osd-5-5775949f57-vz6jp 2/2 Running 0 5m22s rook-ceph-osd-prepare-ocs-deviceset-gp2-0-data-0x6t87-59swf 0/1 Completed 0 10m rook-ceph-osd-prepare-ocs-deviceset-gp2-1-data-0klwr7-bk45t 0/1 Completed 0 10m rook-ceph-osd-prepare-ocs-deviceset-gp2-2-data-0mk2cz-jx7zv 0/1 Completed 0 10m
禁用单个副本
禁用 replica-1 不是经过测试和支持的场景。但是,如果需要禁用和清理 replica-1,请执行以下步骤:
使用非弹性(replica-1) storageClass 删除 Workloads。
$ oc delete deployment replica-1-workload deployment.apps "replica-1-workload" deleted使用非弹性 storageClass 删除所有 PVC。
$ oc get pvc --all-namespaces -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,STORAGECLASS:.spec.storageClassName" | grep "ocs-storagecluster-ceph-non-resilient-rbd"$ oc delete pvc replica-1-pvc persistentvolumeclaim "replica-1-pvc" deleted在 storageCluster CR 上将非弹性池
Enable标志标记为 false。$ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": false }]'从 storageconsumer CR spec.storageClasses 中删除 non-resilient-rbd storageClasses。
$ oc get storageconsumer internal -n openshift-storage -o json | \ jq 'del(.spec.storageClasses[] | select(.name == "ocs-storagecluster-ceph-non-resilient-rbd"))' | \ oc replace -f -删除 non-resilient-rbd storageClass。
$ oc delete sc ocs-storagecluster-ceph-non-resilient-rbd删除 replica-1 cephBlockPools。
$ oc get cephblockpool NAME PHASE TYPE FAILUREDOMAIN AGE builtin-mgr Ready Replicated zone 136m ocs-storagecluster-cephblockpool Ready Replicated zone 136m ocs-storagecluster-cephblockpool-us-east-1 Ready Replicated zone 50m ocs-storagecluster-cephblockpool-us-east-2 Ready Replicated zone 50m ocs-storagecluster-cephblockpool-us-east-3 Ready Replicated zone 50m $ oc delete cephblockpool ocs-storagecluster-cephblockpool-us-east-1 ocs-storagecluster-cephblockpool-us-east-2 ocs-storagecluster-cephblockpool-us-east-3 cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-1" deleted cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-2" deleted cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-3" deleted删除 replica-1 OSD。
使用故障域的类名称来识别 replica-1 OSD,
sh-5.1$ ceph osd df tree ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS TYPE NAME -1 1.50000 - 1.5 TiB 4.8 GiB 4.4 GiB 32 KiB 395 MiB 1.5 TiB 0.31 1.00 - root default -5 1.50000 - 1.5 TiB 4.8 GiB 4.4 GiB 32 KiB 395 MiB 1.5 TiB 0.31 1.00 - region us-east -14 0.50000 - 512 GiB 1.7 GiB 1.5 GiB 12 KiB 176 MiB 510 GiB 0.32 1.03 - zone us-east-1 -13 0.25000 - 256 GiB 1.6 GiB 1.5 GiB 11 KiB 75 MiB 254 GiB 0.61 1.93 - host ocs-deviceset-2-data-0kp6fl 2 ssd 0.25000 1.00000 256 GiB 1.6 GiB 1.5 GiB 11 KiB 75 MiB 254 GiB 0.61 1.93 353 up osd.2 -46 0.25000 - 256 GiB 104 MiB 2.7 MiB 1 KiB 101 MiB 256 GiB 0.04 0.13 - host us-east-1-data-0c2xxv 3 us-east-1 0.25000 1.00000 256 GiB 104 MiB 2.7 MiB 1 KiB 101 MiB 256 GiB 0.04 0.13 0 up osd.3 -4 0.50000 - 512 GiB 1.6 GiB 1.5 GiB 8 KiB 101 MiB 510 GiB 0.31 0.98 - zone us-east-2 -3 0.25000 - 256 GiB 1.6 GiB 1.5 GiB 7 KiB 74 MiB 254 GiB 0.61 1.93 - host ocs-deviceset-1-data-0tllsb 0 ssd 0.25000 1.00000 256 GiB 1.6 GiB 1.5 GiB 7 KiB 74 MiB 254 GiB 0.61 1.93 353 up osd.0 -51 0.25000 - 256 GiB 29 MiB 2.7 MiB 1 KiB 26 MiB 256 GiB 0.01 0.04 - host us-east-2-data-068z76 5 us-east-2 0.25000 1.00000 256 GiB 29 MiB 2.7 MiB 1 KiB 26 MiB 256 GiB 0.01 0.04 0 up osd.5 -10 0.50000 - 512 GiB 1.6 GiB 1.5 GiB 12 KiB 118 MiB 510 GiB 0.31 0.99 - zone us-east-3 -9 0.25000 - 256 GiB 1.6 GiB 1.5 GiB 11 KiB 92 MiB 254 GiB 0.61 1.95 - host ocs-deviceset-0-data-06fhxp 1 ssd 0.25000 1.00000 256 GiB 1.6 GiB 1.5 GiB 11 KiB 92 MiB 254 GiB 0.61 1.95 353 up osd.1 -41 0.25000 - 256 GiB 29 MiB 2.7 MiB 1 KiB 26 MiB 256 GiB 0.01 0.04 - host us-east-3-data-04wvc8 4 us-east-3 0.25000 1.00000 256 GiB 29 MiB 2.7 MiB 1 KiB 26 MiB 256 GiB 0.01 0.04 0 up osd.4 TOTAL 1.5 TiB 4.8 GiB 4.4 GiB 36 KiB 395 MiB 1.5 TiB 0.31 MIN/MAX VAR: 0.04/1.95 STDDEV: 0.29在本例中,OSD ID 3,5,4 是需要移除的 replica-1 OSD。
强制删除标识的 replica-1 OSD。
按照适用于您的环境的适当流程,执行移除 OSD。
对您要删除的所有 OSD Ids 重复上述步骤。
$ osd_id_to_remove=3 $ oc scale -n openshift-storage deployment rook-ceph-osd-${osd_id_to_remove} --replicas=0 deployment.apps/rook-ceph-osd-3 scaled $ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} FORCE_OSD_REMOVAL=true |oc create -n openshift-storage -f - job.batch/ocs-osd-removal-job created $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal' 2025-06-20 10:33:13.153093 I | cephosd: completed removal of OSD 3 $ oc delete -n openshift-storage job ocs-osd-removal-job job.batch "ocs-osd-removal-job" deleted检查 OSD 树。
sh-5.1$ ceph osd df tree ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS TYPE NAME -1 0.75000 - 768 GiB 5.0 GiB 4.8 GiB 29 KiB 227 MiB 763 GiB 0.65 1.00 - root default -5 0.75000 - 768 GiB 5.0 GiB 4.8 GiB 29 KiB 227 MiB 763 GiB 0.65 1.00 - region us-east -14 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 11 KiB 63 MiB 254 GiB 0.65 0.99 - zone us-east-1 -13 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 11 KiB 63 MiB 254 GiB 0.65 0.99 - host ocs-deviceset-2-data-0kp6fl 2 ssd 0.25000 1.00000 256 GiB 1.7 GiB 1.6 GiB 11 KiB 63 MiB 254 GiB 0.65 0.99 353 up osd.2 -4 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 7 KiB 80 MiB 254 GiB 0.65 1.00 - zone us-east-2 -3 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 7 KiB 80 MiB 254 GiB 0.65 1.00 - host ocs-deviceset-1-data-0tllsb 0 ssd 0.25000 1.00000 256 GiB 1.7 GiB 1.6 GiB 7 KiB 80 MiB 254 GiB 0.65 1.00 353 up osd.0 -10 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 11 KiB 84 MiB 254 GiB 0.65 1.00 - zone us-east-3 -9 0.25000 - 256 GiB 1.7 GiB 1.6 GiB 11 KiB 84 MiB 254 GiB 0.65 1.00 - host ocs-deviceset-0-data-06fhxp 1 ssd 0.25000 1.00000 256 GiB 1.7 GiB 1.6 GiB 11 KiB 84 MiB 254 GiB 0.65 1.00 353 up osd.1 TOTAL 768 GiB 5.0 GiB 4.8 GiB 31 KiB 227 MiB 763 GiB 0.65 MIN/MAX VAR: 0.99/1.00 STDDEV: 0.00
2.2.1. 在 OSD 丢失了单个副本后恢复 复制链接链接已复制到粘贴板!
使用副本 1 时,当 OSD 丢失时,会保证数据丢失的存储类。丢失的 OSD 会进入故障状态。使用以下步骤在 OSD 丢失后恢复。
流程
按照以下步骤,在数据丢失副本 1 后让应用程序再次运行。您首先需要识别故障 OSD 所在的域。
如果您知道失败的 OSD 所在的故障域,请运行以下命令获取后续步骤所需的
replica1-pool-name。如果您不知道失败的 OSD 所处的位置,请跳至第 2 步。$ oc get cephblockpools输出示例:
NAME PHASE ocs-storagecluster-cephblockpool Ready ocs-storagecluster-cephblockpool-us-south-1 Ready ocs-storagecluster-cephblockpool-us-south-2 Ready ocs-storagecluster-cephblockpool-us-south-3 Ready复制对应的故障域名称,以便在后续步骤中使用,然后跳至第 4 步。
查找处于
Error状态或CrashLoopBackoff状态的 OSD pod 以查找失败的 OSD:$ oc get pods -n openshift-storage -l app=rook-ceph-osd | grep 'CrashLoopBackOff\|Error'识别具有故障 OSD 的 replica-1 池。
识别运行故障 OSD 的节点:
failed_osd_id=0 #replace with the ID of the failed OSD识别运行故障 OSD 的 failureDomainLabel:
failure_domain_label=$(oc get storageclass ocs-storagecluster-ceph-non-resilient-rbd -o yaml | grep domainLabel |head -1 |awk -F':' '{print $2}')failure_domain_value=$”(oc get pods $failed_osd_id -oyaml |grep topology-location-zone |awk ‘{print $2}’)”输出显示了其 OSD 失败的 replica-1 池名称,例如:
replica1-pool-name= "ocs-storagecluster-cephblockpool-$failure_domain_value”其中
$failure_domain_value是 failureDomainName。
删除 replica-1 池。
连接到 toolbox pod:
toolbox=$(oc get pod -l app=rook-ceph-tools -n openshift-storage -o jsonpath='{.items[*].metadata.name}') oc rsh $toolbox -n openshift-storage删除 replica-1 池。请注意,您必须在命令中输入 replica-1 池名称两次,例如:
ceph osd pool rm <replica1-pool-name> <replica1-pool-name> --yes-i-really-really-mean-it使用之前标识的故障域名称替换
replica1-pool-name。
- 按照您的平台 替换 设备指南中的"替换操作或失败存储设备"一节中的步骤清除失败的 OSD。
重启 rook-ceph operator:
$ oc delete pod -l rook-ceph-operator -n openshift-storage- 在 avaialbity 区域中重新创建任何受影响的应用程序,以使用名称的新池开始。