2.3. 替换 IBM Power 基础架构上的存储节点

对于 OpenShift Data Foundation,可以主动执行节点替换节点,并为 IBM Power 相关部署主动执行节点。

2.3.1. 替换 IBM Power 上的操作或失败的存储节点

先决条件

  • 红帽建议为替换节点配置类似的基础架构和资源,以用于被替换的节点。
  • 您必须登录 OpenShift Container Platform (RHOCP) 集群。

流程

  1. 识别节点,并在要替换的节点上获取标签。

    $ oc get nodes --show-labels | grep <node_name>
  2. 识别要替换的节点中运行的 mon (如果有)和对象存储设备(OSD)pod。

    $ oc get pods -n openshift-storage -o wide | grep -i <node_name>
  3. 缩减上一步中确定的容器集部署。

    例如:

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

    $ 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. 获取具有所需基础架构的新 IBM Power 机器。请参阅在 IBM Power 上安装集群
  9. 使用新的 IBM Power 机器创建新的 OpenShift Container Platform 节点。
  10. 检查与处于 Pending 状态的 OpenShift Container Platform 相关的证书签名请求(CSR):

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

    $ oc adm certificate approve <Certificate_Name>
  12. 在 OpenShift Web 控制台中点 ComputeNodes,确认新节点是否处于 Ready 状态。
  13. 使用以下任一方法之一将 OpenShift Data Foundation 标签应用到新节点:

    从用户界面
    1. 对于新节点,点击 Action Menu(⋮)Edit Labels
    2. 添加 cluster.ocs.openshift.io/openshift-storage 并点 Save
    使用命令行界面
    1. 执行以下命令,将 OpenShift Data Foundation 标签应用到新节点:
    $ oc label node <new_node_name> cluster.ocs.openshift.io/openshift-storage=''
  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 节点添加到 localVolume。

    1. 决定要编辑哪些本地卷

      # oc get -n $local_storage_project localvolume
      NAME           AGE
      localblock    25h
    2. 更新 localVolume 定义,使其包含新节点并删除失败的节点。

      # oc edit -n $local_storage_project localvolume localblock
      [...]
          nodeSelector:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  #- worker-0
                  - worker-1
                  - worker-2
                  - worker-3
      [...]

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

      在上例中,worker-0 已被删除,worker-3 是新节点。

  16. 验证新的 localblock PV 是否可用。

    $ oc get pv | grep localblock
    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. 更改到 openshift-storage 项目。

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

    1. 根据需要识别 PVC,我们需要删除与该特定 PVC 关联的 PV。

      $ 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

      其中,osd_id_to_remove 是 pod 名称中紧接在 rook-ceph-osd-prefix 后面的整数。在本例中,部署名称为 rook-ceph-osd-1

      输出示例:

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

      在本例中,PVC 名称为 ocs-deviceset-localblock-0-data-0-g2mmc

    2. 从集群移除出现故障的 OSD。如果需要,您可以指定多个失败的 OSD:

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

      rook-ceph-osd 前缀后立即的 pod 名称中的整数。您可以在 命令中添加以逗号分隔的 OSD ID,以删除多个 OSD,如 FAILED_OSD_IDS=0,1,2

      警告

      此步骤的结果是从集群中完全移除 OSD。确保提供了 osd_id_to_remove 的正确值。

  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. 删除与故障节点关联的 PV。

    1. 标识与 PVC 关联的 PV。

      PVC 名称必须与从集群中删除故障 OSD 时获取的名称相同。

      # 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. 如果有一个 PV 处于 Released 状态,请将其删除。

      # oc delete pv <persistent-volume>

      例如:

      # oc delete pv local-pv-5c9b8982
      persistentvolume "local-pv-5c9b8982" 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. WorkloadsPods,确认新节点上的以下 pod 处于 Running 状态

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

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

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

    输出示例:

    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

    OSD 和 Mon 可能需要几分钟才能进入 Running 状态。

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

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

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

    1. 创建调试 pod,并为所选主机打开 chroot 环境。

      $ oc debug node/<node name>
      $ chroot /host
    2. 运行 "lsblk" 并检查 ocs-deviceset 名旁边的 "crypt" 关键字。

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