5.8. 恢复 OpenShift Data Foundation 扩展集群


鉴于具有扩展集群灾难恢复解决方案是为环境出现完全或部分故障时为环境提供抗压性,因此了解应用程序及其存储的不同恢复方法非常重要。

应用程序的机构决定了它在一个活动区域中再次可用的速度。

当区域出现问题时,有不同的方法来恢复应用及其存储。恢复时间取决于应用程序的架构。不同的恢复方法如下:

5.8.1. 了解区失败

在本小节中,区失败代表区中的所有 OpenShift Container Platform、master 和 worker 节点不再与第二个数据区中的资源进行通信(例如关闭节点)。如果数据区域之间的通信仍处于可以部分工作的状态(不时出现启动或关闭的情况),集群、存储和网络管理员需要断开数据区之间的通信路径,才能成功恢复。

重要

安装示例应用程序时,请关闭 OpenShift Container Platform 节点(至少使用 OpenShift Data Foundation 设备的节点),以测试数据区的故障,以验证您的 file-uploader 应用程序是否可用,您可以上传新文件。

注意

要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃

5.8.2. 使用 RWX 存储恢复区感知 HA 应用程序

使用 topologyKey: topology.kubernetes.io/zone 部署的应用程序,在每个数据区中调度一个或多个副本,并使用共享存储,即 ReadWriteMany (RWX) CephFS 卷,在几分钟后,在几分钟后,新 pod 会被推出部署并处于待处理状态,直到区域恢复为止。

此类型的应用示例在 Install Zone Aware Sample Application 部分中进行了详细说明。

重要

在区域恢复期间,如果应用容器集在挂载 CephFS 卷时进入 CrashLoopBackOff (CLBO) 状态,然后重启调度 Pod 的节点。等待一段时间,然后检查 pod 是否再次运行。

注意

要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃

5.8.3. 使用 RWX 存储恢复 HA 应用程序

使用 topologyKey: kubernetes.io/hostname 或没有拓扑配置的应用程序无法防止同一区域中的所有应用副本。

注意

即使 Pod spec 中有 podAntiAffinitytopologyKey: kubernetes.io/hostname 也会发生,因为此反关联性规则基于主机且不是基于区域的规则。

如果发生这种情况,且所有副本都位于失败的区域中,则使用 ReadWriteMany(RWX)存储的应用程序需要 6-8 分钟才可以在活跃区域中恢复。此暂停时间用于故障区中的 OpenShift Container Platform 节点变为 NotReady (60 秒),然后让默认 pod 驱除超时过期(300 秒)。

重要

为了防止在非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点 中的步骤操作,以防止在非正常节点关闭过程中卷崩溃

5.8.4. 使用 RWO 存储恢复应用程序

使用 ReadWriteOnce(RWO)存储的应用程序具有在此 Kubernetes 问题中描述的已知行为。因此,如果数据区失败,该区中的任何应用程序 pod 都挂载 RWO 卷(例如,基于 cephrbd 的卷)都会在 6-8 分钟后处于 Terminating 状态,且不会在没有手动干预的情况下在活跃区中重新创建。

要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃

5.8.5. 恢复 StatefulSet pod

作为 StatefulSet 一部分的 Pod 的问题与 pod 挂载 ReadWriteOnce(RWO)卷相似。Kubernetes 资源 StatefulSet 注意事项中会引用更多信息。

要防止非正常节点关闭过程中卷内容损坏,请按照 隔离和污点节点中的步骤来防止非正常节点关闭过程中卷崩溃

以下流程需要在非正常节点关闭过程中执行,以防止卷内容损坏。

先决条件

流程

  1. 创建 NetworkFence CR 以隔离停机的存储节点的 IP。

    1. 获取需要隔离的 NodeName :

      $ oc get node
    2. 获取与上一步中找到的节点对应的 csiaddonsnode 对象:

      $ oc get csiaddonsnode -n openshift-storage |grep -i <nodename> |grep -i daemonset
    3. 从上一步中找到的 csiaddonsnode 对象获取 IP 地址,并创建 NetworkFence CR,并确保它处于 Fenced 状态:

      $ oc get csiaddonsnode <csi-addons-name> -o jsonpath='{.status.networkFenceClientStatus}'
      [{"ClientDetails":[{"cidrs":["10.244.0.1/32"],"id":"a815fe8e-eabd-4e87-a6e8-78cebfb67d08"}],"networkFenceClassName":"networkfenceclass-sample"}]

      <csi-addons-name > 替换为上一步中找到的 csiaddonsnode 对象。

    4. 使用 OpenShift 节点名称为上述 CIDR 创建 NetworkFence CR 以便轻松识别:

      apiVersion: csiaddons.openshift.io/v1alpha1
      kind: NetworkFence
      metadata:
        name: <openshift-node-name>
      spec:
        cidrs:
        - 10.244.0.1/32
        driver: openshift-storage.rbd.csi.ceph.com
        fenceState: Fenced
        parameters:
          clusterID: openshift-storage
        secret:
          name: rook-csi-rbd-provisioner
          namespace: openshift-storage
      • parameters.clusterID : 指定集群 ID,可以从 ocs-storagecluster-ceph-rbd storageclass 中的 parameter.clusterID 获取。
      • secret.name: 指定网络隔离操作所需的 secret 名称。这可以从 ocs-storagecluster-ceph-rbd storageclass 中的 parameters.csi.storage.k8s.io/provisioner-secret-name 获取。
      • secret.namespace: 指定 secret 所在的命名空间。这可以从 parameters.csi.storage.k8s.io/provisioner-secret-namespace'in 'ocs-storagecluster-ceph-rbd storageclass 获取。
    5. 验证网络隔离是否已成功完成:

      $ oc get networkfence

      输出示例:

      NAME      DRIVER                       CIDRS               FENCESTATE   AGE   RESULT
      <openshift-node-name>   openshift-storage.rbd.csi.ceph.com   ["10.244.0.1/32"]   Fenced     42h   Succeeded
  2. 为停机的节点添加污点:

    $ oc adm taint nodes <node-name> node.kubernetes.io/out-of-service=nodeshutdown:NoExecute
  3. 监控应用程序重新定位到存活节点。

    对所有节点执行上述步骤。

节点返回后恢复

节点恢复在线后,您需要取消保护节点并删除节点上的污点,以将 pod 调度到这些节点上。

  1. 在 CR 中将 NetworkFence 状态更改为 UnFenced,并等待它变为 unfenced

    1. NetworkFence 设置为 UnFenced

      $ oc patch networkfence <network-fence-object-name> -p '{"spec":{"fenceState":"Unfenced"}}' --type=merge
    2. 验证 Network UnFencing 是否已成功完成:

      $ oc get networkfence

      输出示例:

      NAME      DRIVER                       CIDRS               FENCESTATE   AGE   RESULT
      <openshift-node-name>   openshift-storage.rbd.csi.ceph.com   ["10.244.0.1/32"]   unfenced     42h   Succeeded
  2. 重新引导节点。
  3. 取消污点的节点:

    $ oc adm taint nodes <node-name> node.kubernetes.io/out-of-service=nodeshutdown:NoExecute-

    对所有节点重复这些步骤。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部