Chapter 2. OpenShift Data Foundation deployed using local storage devices

2.1. Replacing storage nodes on bare metal infrastructure

2.1.1. Replacing an operational node on bare metal user-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Identify the node, and get the labels on the node that you need to replace:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  2. Identify the monitor pod (if any), and OSDs that are running in the node that you need to replace:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  4. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  5. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  6. Delete the node:

    $ oc delete node <node_name>
  7. Get a new bare-metal machine with the required infrastructure. See Installing on bare metal.

    Important

    For information about how to replace a master node when you have installed OpenShift Data Foundation on a three-node OpenShift compact bare-metal cluster, see the Backup and Restore guide in the OpenShift Container Platform documentation.

  8. Create a new OpenShift Container Platform node using the new bare-metal machine.
  9. Check for the Certificate Signing Requests (CSRs) related to OpenShift Container Platform that are in Pending state:

    $ oc get csr
  10. Approve all the required OpenShift Container Platform CSRs for the new node:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    Specify the name of the CSR.
  11. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  12. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  13. Identify the namespace where OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  14. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

    2. Determine the localVolumeSet to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the this example, server3.example.com is removed and newnode.example.com is the new node.

  15. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  16. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  17. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  18. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  19. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails, and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  20. Identify the Persistent Volume (PV) associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  21. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  22. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created, and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.1.2. Replacing a failed node on bare metal user-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Identify the node, and get the labels on the node that you need to replace:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  2. Identify the monitor pod (if any), and OSDs that are running in the node that you need to replace:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  4. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  5. Remove the pods which are in Terminating state:

    $ oc get pods -A -o wide | grep -i <node_name> |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  6. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  7. Delete the node:

    $ oc delete node <node_name>
  8. Get a new bare-metal machine with the required infrastructure. See Installing on bare metal.

    Important

    For information about how to replace a master node when you have installed OpenShift Data Foundation on a three-node OpenShift compact bare-metal cluster, see the Backup and Restore guide in the OpenShift Container Platform documentation.

  9. Create a new OpenShift Container Platform node using the new bare-metal machine.
  10. Check for the Certificate Signing Requests (CSRs) related to OpenShift Container Platform that are in Pending state:

    $ oc get csr
  11. Approve all the required OpenShift Container Platform CSRs for the new node:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    Specify the name of the CSR.
  12. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  13. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  14. Identify the namespace where OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  15. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

    2. Determine the localVolumeSet to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the this example, server3.example.com is removed and newnode.example.com is the new node.

  16. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  17. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  18. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  19. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  20. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails, and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  21. Identify the Persistent Volume (PV) associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  22. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  23. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created, and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.2. Replacing storage nodes on IBM Z or LinuxONE infrastructure

You can choose one of the following procedures to replace storage nodes:

2.2.1. Replacing operational nodes on IBM Z or LinuxONE infrastructure

Use this procedure to replace an operational node on IBM zSystems or LinuxONE infrastructure.

Procedure

  1. Identify the node and get labels on the node to be replaced. Make a note of the rack label.

    $ oc get nodes --show-labels | grep <node_name>
  2. Identify the mon (if any) and object storage device (OSD) pods that are running in the node to be replaced.

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step.

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  4. Mark the nodes as unschedulable.

    $ oc adm cordon <node_name>
  5. Remove the pods which are in Terminating state.

    $ oc get pods -A -o wide | grep -i <node_name> |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  6. Drain the node.

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  7. Delete the node.

    $ oc delete node <node_name>
  8. Get a new IBM zSystem storage node as a replacement.
  9. Check for certificate signing requests (CSRs) related to OpenShift Data Foundation that are in Pending state:

    $ oc get csr
  10. Approve all required OpenShift Data Foundation CSRs for the new node:

    $ oc adm certificate approve <Certificate_Name>
  11. Click ComputeNodes in OpenShift Web Console, confirm if the new node is in Ready state.
  12. Apply the openshift-storage label to the new node using any one of the following:

    From User interface
    1. For the new node, click Action Menu (⋮)Edit Labels
    2. Add cluster.ocs.openshift.io/openshift-storage and click Save.
    From Command line interface
    • Execute the following command to apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
  13. Add a new worker node to localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node and remove the failed node.

      # oc edit -n local-storage-project localvolumediscovery auto-discover-devices
      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the above example, server3.example.com was removed and newnode.example.com is the new node.

    2. Determine which localVolumeSet to edit.

      Replace local-storage-project in the following commands with the name of your local storage project. The default project name is openshift-local-storage in OpenShift Data Foundation 4.6 and later. Previous versions use local-storage by default.

      # oc get -n local-storage-project localvolumeset
      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node and remove the failed node.

      # oc edit -n local-storage-project localvolumeset localblock
      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the above example, server3.example.com was removed and newnode.example.com is the new node.

  14. Verify that the new localblock PV is available.

    $ oc get pv | grep localblock
              CAPA- ACCESS RECLAIM                                STORAGE
    NAME      CITY  MODES  POLICY  STATUS     CLAIM               CLASS       AGE
    local-pv- 931Gi  RWO   Delete  Bound      openshift-storage/  localblock  25h
    3e8964d3                                  ocs-deviceset-2-0
                                              -79j94
    local-pv- 931Gi  RWO   Delete  Bound      openshift-storage/  localblock  25h
    414755e0                                  ocs-deviceset-1-0
                                              -959rp
    local-pv- 931Gi RWO Delete Available localblock 3m24s b481410
    local-pv- 931Gi  RWO   Delete  Bound      openshift-storage/  localblock  25h
    d9c5cbd6                                  ocs-deviceset-0-0
                                              -nvs68
  15. Change to the openshift-storage project.

    $ oc project openshift-storage
  16. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required.

    1. Identify the PVC as afterwards we need to delete PV associated with that specific PVC.

      $ osd_id_to_remove=1
      $ oc get -n openshift-storage -o yaml deployment rook-ceph-osd-${osd_id_to_remove} | grep ceph.rook.io/pvc

      where, osd_id_to_remove is the integer in the pod name immediately after the rook-ceph-osd prefix. In this example, the deployment name is rook-ceph-osd-1.

      Example output:

      ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc
          ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc

      In this example, the PVC name is ocs-deviceset-localblock-0-data-0-g2mmc.

    2. Remove the failed OSD from the cluster.

      $ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} |oc create -f -

      You can remove more than one OSD by adding comma separated OSD IDs in the command. (For example: FAILED_OSD_IDS=0,1,2)

      Warning

      This step results in OSD being completely removed from the cluster. Ensure that the correct value of osd_id_to_remove is provided.

  17. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-osd_id_to_remove -n openshift-storage
    Note

    If ocs-osd-removal fails and the pod is not in the expected Completed state, check the pod logs for further debugging. For example:

    # oc logs -l job-name=ocs-osd-removal-osd_id_to_remove -n openshift-storage --tail=-1

    It may be necessary to manually cleanup the removed OSD as follows:

    ceph osd crush remove osd.osd_id_to_remove
    ceph osd rm osd_id_to_remove
    ceph auth del osd.osd_id_to_remove
    ceph osd crush rm osd_id_to_remove
  18. Delete the PV associated with the failed node.

    1. Identify the PV associated with the PVC.

      The PVC name must be identical to the name that is obtained while removing the failed OSD from the cluster.

      # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released
      local-pv-5c9b8982  500Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-localblock-0-data-0-g2mmc  localblock  24h  worker-0
    2. If there is a PV in Released state, delete it.

      # oc delete pv <persistent-volume>

      For example:

      # oc delete pv local-pv-5c9b8982
      persistentvolume "local-pv-5c9b8982" deleted
  19. Identify the crashcollector pod deployment.

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it.

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  20. Delete the ocs-osd-removal job.

    # oc delete job ocs-osd-removal-${osd_id_to_remove}

    Example output:

    job.batch "ocs-osd-removal-0" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click WorkloadsPods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all the other required OpenShift Data Foundation pods are in Running state.
  4. Verify that new Object Storage Device (OSD) pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If data encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.2.2. Replacing failed nodes on IBM Z or LinuxONE infrastructure

Procedure

  1. Log in to the OpenShift Web Console, and click ComputeNodes.
  2. Identify the faulty node, and click on its Machine Name.
  3. Click ActionsEdit Annotations, and click Add More.
  4. Add machine.openshift.io/exclude-node-draining, and click Save.
  5. Click ActionsDelete Machine, and click Delete.
  6. A new machine is automatically created. Wait for new machine to start.

    Important

    This activity might take at least 5 - 10 minutes or more. Ceph errors generated during this period are temporary and are automatically resolved when when you label the new node, and it is functional.

  7. Click ComputeNodes. Confirm that the new node is in Ready state.
  8. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮)Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= | cut -d' ' -f1
  2. Click WorkloadsPods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all the other required OpenShift Data Foundation pods are in Running state.
  4. Verify that new Object Storage Device (OSD) pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If data encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.3. Replacing storage nodes on IBM Power infrastructure

For OpenShift Data Foundation, you can perform node replacement proactively for an operational node, and reactively for a failed node, for the deployments related to IBM Power.

2.3.1. Replacing an operational or failed storage node on IBM Power

Prerequisites

  • Ensure that the replacement nodes are configured with the similar infrastructure and resources to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Identify the node, and get the labels on the node that you need to replace:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  2. Identify the mon (if any), and Object Storage Device (OSD) pods that are running in the node that you need to replace:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-a --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-1 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name> --replicas=0 -n openshift-storage
  4. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  5. Remove the pods which are in Terminating state:

    $ oc get pods -A -o wide | grep -i <node_name> |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  6. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  7. Delete the node:

    $ oc delete node <node_name>
  8. Get a new IBM Power machine with the required infrastructure. See Installing a cluster on IBM Power.
  9. Create a new OpenShift Container Platform node using the new IBM Power machine.
  10. Check for the Certificate Signing Requests (CSRs) related to OpenShift Container Platform that are in Pending state:

    $ oc get csr
  11. Approve all the required OpenShift Container Platform CSRs for the new node:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    Specify the name of the CSR.
  12. Click ComputeNodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  13. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮)Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    1. Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=''
    <new_node_name>
    Specify the name of the new node.
  14. Identify the namespace where OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  15. Add a newly added worker node to the localVolume.

    1. Determine the localVolume you need to edit:

      # oc get -n $local_storage_project localvolume

      Example output:

      NAME           AGE
      localblock    25h
    2. Update the localVolume definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolume localblock

      Example output:

      [...]
          nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  #- worker-0
                  - worker-1
                  - worker-2
                  - worker-3
      [...]

      Remember to save before exiting the editor.

      In the this example, worker-0 is removed and worker-3 is the new node.

  16. Verify that the new localblock Persistent Volume (PV) is available:

    $ oc get pv | grep localblock

    Example output:

    NAME              CAPACITY   ACCESSMODES RECLAIMPOLICY STATUS     CLAIM             STORAGECLASS                 AGE
    local-pv-3e8964d3    500Gi    RWO         Delete       Bound      ocs-deviceset-localblock-2-data-0-mdbg9  localblock     25h
    local-pv-414755e0    500Gi    RWO         Delete       Bound      ocs-deviceset-localblock-1-data-0-4cslf  localblock     25h
    local-pv-b481410    500Gi     RWO        Delete       Available                                            localblock     3m24s
    local-pv-5c9b8982    500Gi    RWO         Delete       Bound      ocs-deviceset-localblock-0-data-0-g2mmc  localblock     25h
  17. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  18. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required.

    1. Identify the Persistent Volume Claim (PVC):

      $ osd_id_to_remove=1
      $ oc get -n openshift-storage -o yaml deployment rook-ceph-osd-${<osd_id_to_remove>} | grep ceph.rook.io/pvc

      where, <osd_id_to_remove> is the integer in the pod name immediately after the rook-ceph-osd prefix.

      In this example, the deployment name is rook-ceph-osd-1.

      Example output:

      ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc
          ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-g2mmc
    2. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

      $ oc process -n openshift-storage ocs-osd-removal \
      -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true| oc create -f -
      <failed_osd_id>

      Is the integer in the pod name immediately after the rook-ceph-osd prefix. You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

      The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

      Warning

      This step results in the OSD being completely removed from the cluster. Ensure that the correct value of osd_id_to_remove is provided.

  19. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job has succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  20. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails, and the pod is not in the expected Completed state, check the pod logs for further debugging.

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  21. Delete the PV associated with the failed node.

    1. Identify the PV associated with the PVC:

      # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

      Example output:

      local-pv-5c9b8982  500Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-localblock-0-data-0-g2mmc  localblock  24h  worker-0

      The PVC name must be identical to the name that is obtained while removing the failed OSD from the cluster.

    2. If there is a PV in Released state, delete it:

      # oc delete pv <persistent_volume>

      For example:

      # oc delete pv local-pv-5c9b8982

      Example output:

      persistentvolume "local-pv-5c9b8982" deleted
  22. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  23. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click WorkloadsPods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-b-74f6dc9dd6-4llzq                                   1/1     Running     0          6h14m
    rook-ceph-mon-c-74948755c-h7wtx                                    1/1     Running     0          4h24m
    rook-ceph-mon-d-598f69869b-4bv49                                   1/1     Running     0          162m

    The OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that the new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.4. Replacing storage nodes on VMware infrastructure

2.4.1. Replacing an operational node on VMware user-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Identify the node, and get the labels on the node that you need to replace:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  2. Identify the monitor pod (if any), and OSDs that are running in the node that you need to replace:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  4. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  5. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  6. Delete the node:

    $ oc delete node <node_name>
  7. Log in to VMware vSphere and terminate the Virtual Machine (VM) that you have identified.
  8. Create a new VM on VMware vSphere with the required infrastructure. See Infrastructure requirements.
  9. Create a new OpenShift Container Platform worker node using the new VM.
  10. Check for the Certificate Signing Requests (CSRs) related to OpenShift Container Platform that are in Pending state:

    $ oc get csr
  11. Approve all the required OpenShift Container Platform CSRs for the new node:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    Specify the name of the CSR.
  12. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  13. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  14. Identify the namespace where OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  15. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

    2. Determine the localVolumeSet to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the this example, server3.example.com is removed and newnode.example.com is the new node.

  16. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  17. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  18. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  19. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  20. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails, and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  21. Identify the Persistent Volume (PV) associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  22. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  23. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created, and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.4.2. Replacing an operational node on VMware installer-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with the similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Log in to the OpenShift Web Console, and click Compute → Nodes.
  2. Identify the node that you need to replace. Take a note of its Machine Name.
  3. Get labels on the node:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  4. Identify the mon (if any), and Object Storage Devices (OSDs) that are running in the node:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  5. Scale down the deployments of the pods that you identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  6. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  7. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  8. Click Compute → Machines. Search for the required machine.
  9. Besides the required machine, click Action menu (⋮) → Delete Machine.
  10. Click Delete to confirm the machine deletion. A new machine is automatically created.
  11. Wait for the new machine to start and transition into Running state.

    Important

    This activity might take at least 5 - 10 minutes or more.

  12. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  13. Physically add a new device to the node.
  14. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  15. Identify the namespace where the OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  16. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node and remove the failed node.

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

    2. Determine the localVolumeSet you need to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

  17. Verify that the new localblock Persistent Volume (PV) is available:

    $ oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  18. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  19. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  20. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  21. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails and the pod is not in the expected Completed state, check the pod logs for further debugging.

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  22. Identify the PV associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  23. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  24. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created and is in the Running state.

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.4.3. Replacing a failed node on VMware user-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Identify the node, and get the labels on the node that you need to replace:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  2. Identify the monitor pod (if any), and OSDs that are running in the node that you need to replace:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  4. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  5. Remove the pods which are in Terminating state:

    $ oc get pods -A -o wide | grep -i <node_name> |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  6. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  7. Delete the node:

    $ oc delete node <node_name>
  8. Log in to VMware vSphere and terminate the Virtual Machine (VM) that you have identified.
  9. Create a new VM on VMware vSphere with the required infrastructure. See Infrastructure requirements.
  10. Create a new OpenShift Container Platform worker node using the new VM.
  11. Check for the Certificate Signing Requests (CSRs) related to OpenShift Container Platform that are in Pending state:

    $ oc get csr
  12. Approve all the required OpenShift Container Platform CSRs for the new node:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    Specify the name of the CSR.
  13. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  14. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  15. Identify the namespace where OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  16. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed, and newnode.example.com is the new node.

    2. Determine the localVolumeSet to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node, and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In the this example, server3.example.com is removed and newnode.example.com is the new node.

  17. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  18. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  19. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  20. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  21. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails, and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  22. Identify the Persistent Volume (PV) associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  23. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage
  24. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created, and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.4.4. Replacing a failed node on VMware installer-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with the similar infrastructure, resources, and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Log in to the OpenShift Web Console, and click Compute → Nodes.
  2. Identify the node that you need to replace. Take a note of its Machine Name.
  3. Get the labels on the node:

    $ oc get nodes --show-labels | grep _<node_name>_
    <node_name>
    Specify the name of node that you need to replace.
  4. Identify the mon (if any) and Object Storage Devices (OSDs) that are running in the node:

    $ oc get pods -n openshift-storage -o wide | grep -i _<node_name>_
  5. Scale down the deployments of the pods identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  6. Mark the node as unschedulable:

    $ oc adm cordon _<node_name>_
  7. Remove the pods which are in Terminating state:

    $ oc get pods -A -o wide | grep -i _<node_name>_ |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  8. Drain the node:

    $ oc adm drain _<node_name>_ --force --delete-emptydir-data=true --ignore-daemonsets
  9. Click Compute → Machines. Search for the required machine.
  10. Besides the required machine, click Action menu (⋮) → Delete Machine.
  11. Click Delete to confirm the machine is deleted. A new machine is automatically created.
  12. Wait for the new machine to start and transition into Running state.

    Important

    This activity might take at least 5 - 10 minutes or more.

  13. Click Compute → Nodes in the OpenShift Web Console. Confirm that the new node is in Ready state.
  14. Physically add a new device to the node.
  15. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node _<new_node_name>_ cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  16. Identify the namespace where the OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  17. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - **newnode.example.com**
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

    2. Determine the localVolumeSet you need to edit.

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - **newnode.example.com**
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

  18. Verify that the new localblock PV is available:

    $ oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  19. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  20. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  21. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  22. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  23. Identify the PV associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  1490Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  compute-1

    If there is a PV in Released state, delete it:

    # oc delete pv _<persistent_volume>_

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d9c5cbd6" deleted
  24. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=_<failed_node_name>_ -n openshift-storage

    If there is an existing crashcollector pod deployment, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=_<failed_node_name>_ -n openshift-storage
  25. Delete the ocs-osd-removal-job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created, and is in the Running state:

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running
    0          38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running
    0          38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running
    0          4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.5. Replacing storage nodes on Red Hat Virtualization infrastructure

2.5.1. Replacing an operational node on Red Hat Virtualization installer-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with the similar infrastructure, resources and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Log in to the OpenShift Web Console, and click Compute → Nodes.
  2. Identify the node that you need to replace. Take a note of its Machine Name.
  3. Get the labels on the node:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  4. Identify the mon (if any), and Object Storage Devices (OSDs) that are running in the node:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  5. Scale down the deployments of the pods that you identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  6. Mark the nodes as unschedulable:

    $ oc adm cordon <node_name>
  7. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  8. Click Compute → Machines. Search for the required machine.
  9. Besides the required machine, click Action menu (⋮) → Delete Machine.
  10. Click Delete to confirm the machine is deleted. A new machine is automatically created. Wait for the new machine to start and transition into Running state.

    Important

    This activity might take at least 5 - 10 minutes or more.

  11. Click ComputeNodes in the OpenShift web console. Confirm that the new node is in Ready state.
  12. Physically add the one or more new devices to the node.
  13. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮) → Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    Specify the name of the new node.
  14. Identify the namespace where the OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  15. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

    2. Determine the localVolumeSet that you need to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

  16. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  17. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  18. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true | oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  19. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job has succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  20. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage -tail=-1
  21. Identify the PV associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  512Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  server3.example.com

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d6bf175b" deleted
  22. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name>_ -n openshift-storage
  23. Delete the ocs-osd-removal job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created and is in the Running state.

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running  0  38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running  0  38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running  0  4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.

2.5.2. Replacing a failed node on Red Hat Virtualization installer-provisioned infrastructure

Prerequisites

  • Ensure that the replacement nodes are configured with the similar infrastructure, resources and disks to the node that you replace.
  • You must be logged into the OpenShift Container Platform cluster.

Procedure

  1. Log in to the OpenShift Web Console, and click Compute → Nodes.
  2. Identify the node that you need to replace. Take a note of its Machine Name.
  3. Get the labels on the node:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    Specify the name of node that you need to replace.
  4. Identify the mon (if any) and Object Storage Devices (OSDs) that are running in the node:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  5. Scale down the deployments of the pods that you identified in the previous step:

    For example:

    $ oc scale deployment rook-ceph-mon-c --replicas=0 -n openshift-storage
    $ oc scale deployment rook-ceph-osd-0 --replicas=0 -n openshift-storage
    $ oc scale deployment --selector=app=rook-ceph-crashcollector,node_name=<node_name>  --replicas=0 -n openshift-storage
  6. Mark the node as unschedulable:

    $ oc adm cordon <node_name>
  7. Remove the pods which are in the Terminating state:

    $ oc get pods -A -o wide | grep -i <node_name> |  awk '{if ($4 == "Terminating") system ("oc -n " $1 " delete pods " $2  " --grace-period=0 " " --force ")}'
  8. Drain the node:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  9. Click Compute → Machines. Search for the required machine.
  10. Besides the required machine, click the Action menu (⋮)Delete Machine.
  11. Click Delete to confirm the machine is deleted. A new machine is automatically created. Wait for the new machine to start and transition into Running state.

    Important

    This activity might take at least 5 - 10 minutes or more.

  12. Click Compute → Nodes in the OpenShift web console. Confirm that the new node is in Ready state.
  13. Physically add the one or more new devices to the node.
  14. Apply the OpenShift Data Foundation label to the new node using any one of the following:

    From the user interface
    1. For the new node, click Action Menu (⋮)Edit Labels.
    2. Add cluster.ocs.openshift.io/openshift-storage, and click Save.
    From the command-line interface
    • Apply the OpenShift Data Foundation label to the new node:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
  15. Identify the namespace where the OpenShift local storage operator is installed, and assign it to the local_storage_project variable:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)

    For example:

    $ local_storage_project=$(oc get csv --all-namespaces | awk '{print $1}' | grep local)
    echo $local_storage_project

    Example output:

    openshift-local-storage
  16. Add a new worker node to the localVolumeDiscovery and localVolumeSet.

    1. Update the localVolumeDiscovery definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumediscovery auto-discover-devices

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

    2. Determine the localVolumeSet you need to edit:

      # oc get -n $local_storage_project localvolumeset

      Example output:

      NAME          AGE
      localblock   25h
    3. Update the localVolumeSet definition to include the new node and remove the failed node:

      # oc edit -n $local_storage_project localvolumeset localblock

      Example output:

      [...]
         nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - server1.example.com
                  - server2.example.com
                  #- server3.example.com
                  - newnode.example.com
      [...]

      Remember to save before exiting the editor.

      In this example, server3.example.com is removed and newnode.example.com is the new node.

  17. Verify that the new localblock Persistent Volume (PV) is available:

    $oc get pv | grep localblock | grep Available

    Example output:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  18. Navigate to the openshift-storage project:

    $ oc project openshift-storage
  19. Remove the failed OSD from the cluster. You can specify multiple failed OSDs if required:

    $ oc process -n openshift-storage ocs-osd-removal \
    -p FAILED_OSD_IDS=<failed_osd_id> -p FORCE_OSD_REMOVAL=true| oc create -f -
    <failed_osd_id>

    Is the integer in the pod name immediately after the rook-ceph-osd prefix.

    You can add comma separated OSD IDs in the command to remove more than one OSD, for example, FAILED_OSD_IDS=0,1,2.

    The FORCE_OSD_REMOVAL value must be changed to true in clusters that only have three OSDs, or clusters with insufficient space to restore all three replicas of the data after the OSD is removed.

  20. Verify that the OSD was removed successfully by checking the status of the ocs-osd-removal-job pod.

    A status of Completed confirms that the OSD removal job has succeeded.

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  21. Ensure that the OSD removal is completed.

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    Example output:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    Important

    If the ocs-osd-removal-job fails and the pod is not in the expected Completed state, check the pod logs for further debugging:

    For example:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  22. Identify the PV associated with the Persistent Volume Claim (PVC):

    # oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    Example output:

    local-pv-d6bf175b  512Gi  RWO  Delete  Released  openshift-storage/ocs-deviceset-0-data-0-6c5pw  localblock  2d22h  server3.example.com

    If there is a PV in Released state, delete it:

    # oc delete pv <persistent_volume>

    For example:

    # oc delete pv local-pv-d6bf175b

    Example output:

    persistentvolume "local-pv-d6bf175b" deleted
  23. Identify the crashcollector pod deployment:

    $ oc get deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name> -n openshift-storage

    If there is an existing crashcollector pod, delete it:

    $ oc delete deployment --selector=app=rook-ceph-crashcollector,node_name=<failed_node_name>_ -n openshift-storage
  24. Delete the ocs-osd-removal job:

    # oc delete -n openshift-storage job ocs-osd-removal-job

    Example output:

    job.batch "ocs-osd-removal-job" deleted

Verification steps

  1. Verify that the new node is present in the output:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Click Workloads → Pods. Confirm that at least the following pods on the new node are in Running state:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. Verify that all other required OpenShift Data Foundation pods are in Running state.

    Ensure that the new incremental mon is created and is in the Running state.

    $ oc get pod -n openshift-storage | grep mon

    Example output:

    rook-ceph-mon-a-cd575c89b-b6k66         2/2     Running  0  38m
    rook-ceph-mon-b-6776bc469b-tzzt8        2/2     Running  0  38m
    rook-ceph-mon-d-5ff5d488b5-7v8xh        2/2     Running  0  4m8s

    OSD and monitor pod might take several minutes to get to the Running state.

  4. Verify that new OSD pods are running on the replacement node:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. Optional: If cluster-wide encryption is enabled on the cluster, verify that the new OSD devices are encrypted.

    For each of the new nodes identified in the previous step, do the following:

    1. Create a debug pod and open a chroot environment for the one or more selected hosts:

      $ oc debug node/<node_name>
      $ chroot /host
    2. Display the list of available block devices:

      $ lsblk

      Check for the crypt keyword beside the one or more ocs-deviceset names.

  6. If the verification steps fail, contact Red Hat Support.