2.4. 替换 VMware 基础架构上的存储节点


2.4.1. 在 VMware 用户置备的基础架构上替换操作节点

先决条件

  • 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
  • 您必须登录到 OpenShift Container Platform 集群。

流程

  1. 找出该节点,并获取您要替换的节点上的标签:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    指定替换的节点的名称。
  2. 识别要替换的节点中运行的监控器 pod(若有)和 OSD:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. 缩减上一步中标识的 pod 的部署:

    例如:

    $ 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. 将节点标记为不可调度:

    $ oc adm cordon <node_name>
  5. 排空节点:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  6. 删除节点:

    $ oc delete node <node_name>
  7. 登录到 VMware vSphere 并终止您已识别的虚拟机(VM)。
  8. 在带有所需基础架构的 VMware vSphere 上创建新虚拟机。请参阅基础架构要求
  9. 使用新虚拟机创建新的 OpenShift Container Platform worker 节点。
  10. 检查与处于 Pending 状态的 OpenShift Container Platform 相关的证书签名请求(CSR):

    $ oc get csr
  11. 批准新节点所需的所有 OpenShift Container Platform CSR:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    指定 CSR 的名称。
  12. 在 OpenShift Web 控制台中,点 Compute Nodes。确认新节点处于 Ready 状态。
  13. 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:

    从用户界面
    1. 对于新节点,点击 Action Menu(⋮)→ Edit Labels
    2. 添加 cluster.ocs.openshift.io/openshift-storage,然后点 Save
    使用命令行界面
    • 将 OpenShift Data Foundation 标签应用到新节点:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    指定新节点的名称。
  14. 识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给 local_storage_project 变量:

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

    例如:

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

    输出示例:

    openshift-local-storage
  15. 将新的 worker 节点添加到 localVolumeDiscoverylocalVolumeSet

    1. 更新 localVolumeDiscovery 定义,使其包含新节点,并删除故障节点:

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,删除了 server3.example.comnewnode.example.com 是新节点。

    2. 确定要编辑的 localVolumeSet

      # oc get -n $local_storage_project localvolumeset

      输出示例:

      NAME          AGE
      localblock   25h
    3. 更新 localVolumeSet 定义,使其包含新节点,并删除故障节点:

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,server3.example.com 已被删除,newnode.example.com 是新节点。

  16. 验证新的 localblock 持久性卷 (PV)是否可用:

    $oc get pv | grep localblock | grep Available

    输出示例:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  17. 进入 openshift-storage 项目:

    $ oc project openshift-storage
  18. 从集群移除出现故障的 OSD。如果需要,您可以指定多个失败的 OSD:

    $ 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>

    是 pod 名称中紧接在 rook-ceph-osd 前缀后面的整数。

    您可以通过在命令中添加逗号分隔的 OSD ID,以移除多个 OSD,例如 FAILED_OSD_IDS=0,1,2

    FORCE_OSD_REMOVAL 值必须在有三个 OSD 的集群中更改为 true,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。

  19. 通过检查 ocs-osd-removal-job pod 的状态,验证 OSD 是否已成功移除。

    状态为 Completed,确认 OSD 移除作业已成功。

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  20. 确保 OSD 移除已完成。

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

    输出示例:

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

    如果 ocs-osd-removal-job 失败,且 pod 处于预期的 Completed 状态,请检查 pod 日志以进一步调试:

    例如:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  21. 识别与持久性卷声明 (PVC) 关联的持久性卷 (PV):

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

    输出示例:

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

    如果有一个 PV 处于 Released 状态,请删除它:

    # oc delete pv <persistent_volume>

    例如:

    # oc delete pv local-pv-d6bf175b

    输出示例:

    persistentvolume "local-pv-d9c5cbd6" deleted
  22. 确定 crashcollector pod 部署:

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

    如果有现有的 crashcollector pod 部署,请删除它:

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

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

    输出示例:

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

验证步骤

  1. 验证输出中是否存在新节点:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Workloads Pods。确认新节点上至少以下 pod 处于 Running 状态:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. 验证所有其他必需的 OpenShift 数据基础容器集是否都处于 Running 状态。

    确保创建了新的 incremental mon,且处于 Running 状态:

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

    输出示例:

    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 和监控 pod 可能需要几分钟才能进入 Running 状态。

  4. 验证新 OSD pod 是否在替换节点上运行:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. 可选:如果在集群中启用了集群范围的加密,请验证新 OSD 设备是否已加密。

    对于上一步中标识的每个新节点,请执行以下操作:

    1. 创建 debug pod 并为一个或多个所选主机打开 chroot 环境:

      $ oc debug node/<node_name>
      $ chroot /host
    2. 显示可用块设备列表:

      $ lsblk

      检查一个或多个 ocs-deviceset 名称旁的 crypt 关键字。

  6. 如果验证步骤失败,请联系红帽支持团队

2.4.2. 在 VMware 安装程序置备的基础架构中替换操作节点

先决条件

  • 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
  • 您必须登录到 OpenShift Container Platform 集群。

流程

  1. 登录 OpenShift Web 控制台,再点 Compute Nodes
  2. 确定需要替换的节点。记录其 Machine Name
  3. 获取节点上的标签:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    指定替换的节点的名称。
  4. 识别在节点上运行的 mon(若有)和对象存储设备 (OSD) pod:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  5. 缩减您在上一步中确定的 pod 的部署:

    例如:

    $ 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. 将节点标记为不可调度:

    $ oc adm cordon <node_name>
  7. 排空节点:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  8. Compute Machines。搜索所需的机器。
  9. 除了所需机器外,点击 Action 菜单(⋮)→ Delete Machine
  10. 单击 Delete 以确认删除机器。会自动创建新机器。
  11. 等待新计算机启动并过渡到 Running 状态。

    重要

    此活动可能至少需要 5 到 10 分钟或更多。

  12. 在 OpenShift Web 控制台中,点 Compute Nodes。确认新节点处于 Ready 状态。
  13. 向节点物理地添加新设备。
  14. 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:

    从用户界面
    1. 对于新节点,点击 Action Menu(⋮)→ Edit Labels
    2. 添加 cluster.ocs.openshift.io/openshift-storage,然后点 Save
    使用命令行界面
    • 将 OpenShift Data Foundation 标签应用到新节点:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    指定新节点的名称。
  15. 识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给 local_storage_project 变量:

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

    例如:

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

    输出示例:

    openshift-local-storage
  16. 将新的 worker 节点添加到 localVolumeDiscoverylocalVolumeSet

    1. 更新 localVolumeDiscovery 定义,使其包含新节点并删除失败的节点。

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,删除了 server3.example.comnewnode.example.com 是新节点。

    2. 确定您需要编辑的 localVolumeSet

      # oc get -n $local_storage_project localvolumeset

      输出示例:

      NAME          AGE
      localblock   25h
    3. 更新 localVolumeSet 定义,使其包含新节点并删除失败的节点:

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,删除了 server3.example.comnewnode.example.com 是新节点。

  17. 验证新的 localblock 持久性卷 (PV)是否可用:

    $ oc get pv | grep localblock | grep Available

    输出示例:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  18. 进入 openshift-storage 项目:

    $ oc project openshift-storage
  19. 从集群移除出现故障的 OSD。如果需要,您可以指定多个失败的 OSD:

    $ 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>

    是 pod 名称中紧接在 rook-ceph-osd 前缀后面的整数。

    您可以通过在命令中添加逗号分隔的 OSD ID,以移除多个 OSD,例如 FAILED_OSD_IDS=0,1,2

    FORCE_OSD_REMOVAL 值必须在有三个 OSD 的集群中更改为 true,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。

  20. 通过检查 ocs-osd-removal-job pod 的状态,验证 OSD 是否已成功移除。

    状态为 Completed,确认 OSD 移除作业已成功。

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  21. 确保 OSD 移除已完成。

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

    输出示例:

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

    如果 ocs-osd-removal-job 失败并且 pod 不在预期的 Completed 状态,请检查 pod 日志来进一步调试。

    例如:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  22. 识别与持久性卷声明(PVC)关联的 PV:

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

    输出示例:

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

    如果有一个 PV 处于 Released 状态,请删除它:

    # oc delete pv <persistent_volume>

    例如:

    # oc delete pv local-pv-d6bf175b

    输出示例:

    persistentvolume "local-pv-d9c5cbd6" deleted
  23. 确定 crashcollector pod 部署:

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

    如果有现有的 crashcollector pod 部署,请删除它:

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

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

    输出示例:

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

验证步骤

  1. 验证输出中是否存在新节点:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Workloads Pods。确认新节点上至少以下 pod 处于 Running 状态:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. 验证所有其他必需的 OpenShift 数据基础容器集是否都处于 Running 状态。

    确保创建了新的增量 mon,并处于 Running 状态。

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

    输出示例:

    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 和监控 pod 可能需要几分钟才能进入 Running 状态。

  4. 验证新 OSD pod 是否在替换节点上运行:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. 可选:如果在集群中启用了集群范围的加密,请验证新 OSD 设备是否已加密。

    对于上一步中标识的每个新节点,请执行以下操作:

    1. 创建 debug pod 并为一个或多个所选主机打开 chroot 环境:

      $ oc debug node/<node_name>
      $ chroot /host
    2. 显示可用块设备列表:

      $ lsblk

      检查一个或多个 ocs-deviceset 名称旁的 crypt 关键字。

  6. 如果验证步骤失败,请联系红帽支持团队

2.4.3. 在 VMware 用户置备的基础架构中替换失败的节点

先决条件

  • 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
  • 您必须登录到 OpenShift Container Platform 集群。

流程

  1. 找出该节点,并获取您要替换的节点上的标签:

    $ oc get nodes --show-labels | grep <node_name>
    <node_name>
    指定替换的节点的名称。
  2. 识别要替换的节点中运行的监控器 pod(若有)和 OSD:

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. 缩减上一步中标识的 pod 的部署:

    例如:

    $ 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. 将节点标记为不可调度:

    $ oc adm cordon <node_name>
  5. 删除处于 Terminating 状态的 pod:

    $ 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. 排空节点:

    $ oc adm drain <node_name> --force --delete-emptydir-data=true --ignore-daemonsets
  7. 删除节点:

    $ oc delete node <node_name>
  8. 登录到 VMware vSphere 并终止您已识别的虚拟机(VM)。
  9. 在带有所需基础架构的 VMware vSphere 上创建新虚拟机。请参阅基础架构要求
  10. 使用新虚拟机创建新的 OpenShift Container Platform worker 节点。
  11. 检查与处于 Pending 状态的 OpenShift Container Platform 相关的证书签名请求(CSR):

    $ oc get csr
  12. 批准新节点所需的所有 OpenShift Container Platform CSR:

    $ oc adm certificate approve <certificate_name>
    <certificate_name>
    指定 CSR 的名称。
  13. 在 OpenShift Web 控制台中,点 Compute Nodes。确认新节点处于 Ready 状态。
  14. 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:

    从用户界面
    1. 对于新节点,点击 Action Menu(⋮)→ Edit Labels
    2. 添加 cluster.ocs.openshift.io/openshift-storage,然后点 Save
    使用命令行界面
    • 将 OpenShift Data Foundation 标签应用到新节点:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    指定新节点的名称。
  15. 识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给 local_storage_project 变量:

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

    例如:

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

    输出示例:

    openshift-local-storage
  16. 将新的 worker 节点添加到 localVolumeDiscoverylocalVolumeSet

    1. 更新 localVolumeDiscovery 定义,使其包含新节点,并删除故障节点:

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,删除了 server3.example.comnewnode.example.com 是新节点。

    2. 确定要编辑的 localVolumeSet

      # oc get -n $local_storage_project localvolumeset

      输出示例:

      NAME          AGE
      localblock   25h
    3. 更新 localVolumeSet 定义,使其包含新节点,并删除故障节点:

      # 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
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,server3.example.com 已被删除,newnode.example.com 是新节点。

  17. 验证新的 localblock 持久性卷 (PV)是否可用:

    $oc get pv | grep localblock | grep Available

    输出示例:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  18. 进入 openshift-storage 项目:

    $ oc project openshift-storage
  19. 从集群移除出现故障的 OSD。如果需要,您可以指定多个失败的 OSD:

    $ 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>

    是 pod 名称中紧接在 rook-ceph-osd 前缀后面的整数。

    您可以通过在命令中添加逗号分隔的 OSD ID,以移除多个 OSD,例如 FAILED_OSD_IDS=0,1,2

    FORCE_OSD_REMOVAL 值必须在有三个 OSD 的集群中更改为 true,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。

  20. 通过检查 ocs-osd-removal-job pod 的状态,验证 OSD 是否已成功移除。

    状态为 Completed,确认 OSD 移除作业已成功。

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  21. 确保 OSD 移除已完成。

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

    输出示例:

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

    如果 ocs-osd-removal-job 失败,且 pod 处于预期的 Completed 状态,请检查 pod 日志以进一步调试:

    例如:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  22. 识别与持久性卷声明 (PVC) 关联的持久性卷 (PV):

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

    输出示例:

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

    如果有一个 PV 处于 Released 状态,请删除它:

    # oc delete pv <persistent_volume>

    例如:

    # oc delete pv local-pv-d6bf175b

    输出示例:

    persistentvolume "local-pv-d9c5cbd6" deleted
  23. 确定 crashcollector pod 部署:

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

    如果有现有的 crashcollector pod 部署,请删除它:

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

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

    输出示例:

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

验证步骤

  1. 验证输出中是否存在新节点:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Workloads Pods。确认新节点上至少以下 pod 处于 Running 状态:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. 验证所有其他必需的 OpenShift 数据基础容器集是否都处于 Running 状态。

    确保创建了新的 incremental mon,且处于 Running 状态:

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

    输出示例:

    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 和监控 pod 可能需要几分钟才能进入 Running 状态。

  4. 验证新 OSD pod 是否在替换节点上运行:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. 可选:如果在集群中启用了集群范围的加密,请验证新 OSD 设备是否已加密。

    对于上一步中标识的每个新节点,请执行以下操作:

    1. 创建 debug pod 并为一个或多个所选主机打开 chroot 环境:

      $ oc debug node/<node_name>
      $ chroot /host
    2. 显示可用块设备列表:

      $ lsblk

      检查一个或多个 ocs-deviceset 名称旁的 crypt 关键字。

  6. 如果验证步骤失败,请联系红帽支持团队

2.4.4. 在 VMware 安装程序置备的基础架构中替换失败的节点

先决条件

  • 确保将替换节点配置为与您替换的节点类似基础架构、资源和磁盘。
  • 您必须登录到 OpenShift Container Platform 集群。

流程

  1. 登录 OpenShift Web 控制台,再点 Compute Nodes
  2. 确定需要替换的节点。记录其 Machine Name
  3. 获取节点上的标签:

    $ oc get nodes --show-labels | grep _<node_name>_
    <node_name>
    指定替换的节点的名称。
  4. 识别在节点上运行的 mon(若有)和对象存储设备 (OSD) pod:

    $ oc get pods -n openshift-storage -o wide | grep -i _<node_name>_
  5. 缩减上一步中标识的 pod 的部署:

    例如:

    $ 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. 将节点标记为不可调度:

    $ oc adm cordon _<node_name>_
  7. 删除处于 Terminating 状态的 pod:

    $ 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. 排空节点:

    $ oc adm drain _<node_name>_ --force --delete-emptydir-data=true --ignore-daemonsets
  9. Compute Machines。搜索所需的机器。
  10. 除了所需机器外,点击 Action 菜单(⋮)→ Delete Machine
  11. Delete 以确认机器已被删除。会自动创建新机器。
  12. 等待新计算机启动并过渡到 Running 状态。

    重要

    此活动可能至少需要 5 到 10 分钟或更多。

  13. 在 OpenShift Web 控制台中,点 Compute Nodes。确认新节点处于 Ready 状态。
  14. 向节点物理地添加新设备。
  15. 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:

    从用户界面
    1. 对于新节点,点击 Action Menu(⋮)→ Edit Labels
    2. 添加 cluster.ocs.openshift.io/openshift-storage,然后点 Save
    使用命令行界面
    • 将 OpenShift Data Foundation 标签应用到新节点:
    $ oc label node _<new_node_name>_ cluster.ocs.openshift.io/openshift-storage=""
    <new_node_name>
    指定新节点的名称。
  16. 识别安装 OpenShift 本地存储 Operator 的命名空间,并将其分配给 local_storage_project 变量:

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

    例如:

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

    输出示例:

    openshift-local-storage
  17. 将新的 worker 节点添加到 localVolumeDiscoverylocalVolumeSet

    1. 更新 localVolumeDiscovery 定义,使其包含新节点,并删除故障节点:

      # 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**
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,server3.example.com 已被删除,newnode.example.com 是新节点。

    2. 确定您需要编辑的 localVolumeSet

      # oc get -n $local_storage_project localvolumeset

      输出示例:

      NAME          AGE
      localblock   25h
    3. 更新 localVolumeSet 定义,使其包含新节点并删除失败的节点:

      # 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**
      [...]

      记住在退出编辑器之前进行保存。

      在本例中,server3.example.com 已被删除,newnode.example.com 是新节点。

  18. 验证新的 localblock PV 是否可用:

    $ oc get pv | grep localblock | grep Available

    输出示例:

    local-pv-551d950     512Gi    RWO    Delete  Available
    localblock     26s
  19. 进入 openshift-storage 项目:

    $ oc project openshift-storage
  20. 从集群移除出现故障的 OSD。如果需要,您可以指定多个失败的 OSD:

    $ 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>

    是 pod 名称中紧接在 rook-ceph-osd 前缀后面的整数。

    您可以通过在命令中添加逗号分隔的 OSD ID,以移除多个 OSD,例如 FAILED_OSD_IDS=0,1,2

    FORCE_OSD_REMOVAL 值必须在有三个 OSD 的集群中更改为 true,或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。

  21. 通过检查 ocs-osd-removal-job pod 的状态,验证 OSD 是否已成功移除。

    状态为 Completed,确认 OSD 移除作业已成功。

    # oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  22. 确保 OSD 移除已完成。

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

    输出示例:

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

    如果 ocs-osd-removal-job 失败并且 pod 不在预期的 Completed 状态,请检查 pod 日志来进一步调试:

    例如:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  23. 识别与持久性卷声明(PVC)关联的 PV:

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

    输出示例:

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

    如果有一个 PV 处于 Released 状态,请删除它:

    # oc delete pv _<persistent_volume>_

    例如:

    # oc delete pv local-pv-d6bf175b

    输出示例:

    persistentvolume "local-pv-d9c5cbd6" deleted
  24. 确定 crashcollector pod 部署:

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

    如果有现有的 crashcollector pod 部署,请删除它:

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

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

    输出示例:

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

验证步骤

  1. 验证输出中是否存在新节点:

    $ oc get nodes --show-labels | grep cluster.ocs.openshift.io/openshift-storage= |cut -d' ' -f1
  2. Workloads Pods。确认新节点上至少以下 pod 处于 Running 状态:

    • csi-cephfsplugin-*
    • csi-rbdplugin-*
  3. 验证所有其他必需的 OpenShift 数据基础容器集是否都处于 Running 状态。

    确保创建了新的 incremental mon,且处于 Running 状态:

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

    输出示例:

    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 和监控 pod 可能需要几分钟才能进入 Running 状态。

  4. 验证新 OSD pod 是否在替换节点上运行:

    $ oc get pods -o wide -n openshift-storage| egrep -i <new_node_name> | egrep osd
  5. 可选:如果在集群中启用了集群范围的加密,请验证新 OSD 设备是否已加密。

    对于上一步中标识的每个新节点,请执行以下操作:

    1. 创建 debug pod 并为一个或多个所选主机打开 chroot 环境:

      $ oc debug node/<node_name>
      $ chroot /host
    2. 显示可用块设备列表:

      $ lsblk

      检查一个或多个 ocs-deviceset 名称旁的 crypt 关键字。

  6. 如果验证步骤失败,请联系红帽支持团队
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.