为 OpenShift Workloads 配置 OpenShift Data Foundation 灾难恢复


Red Hat OpenShift Data Foundation 4.16

Metropolitan 和 Regional 区域的 OpenShift Data Foundation 灾难恢复功能现已正式发布,它还包括使用扩展集群的灾难恢复。

Red Hat Storage Documentation Team

摘要

本指南旨在详细介绍使用 Advanced Cluster Management 部署 OpenShift Data Foundation 进行灾难恢复所需的步骤,并扩展集群来实现高度可用的存储基础架构。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请告诉我们如何让它更好。

要提供反馈,请创建一个 Bugzilla ticket:

  1. 进入 Bugzilla 网站。
  2. Component 部分中,选择 文档
  3. Description 中输入您要提供的信息。包括文档相关部分的链接。
  4. Submit Bug

第 1 章 OpenShift Data Foundation 灾难恢复简介

灾难恢复(DR)是从自然或人为的灾难中恢复并继续业务关键应用程序的能力。它是任何主要组织的整体业务整合战略的一个组件,其设计旨在在重要事件期间保持业务操作的连续性。

OpenShift Data Foundation DR 功能可在多个 Red Hat OpenShift Container Platform 集群间启用 DR,并分类如下:

  • Metro-DR

    Metro-DR 可确保在数据中心出现问题时保持业务的连续性,并不会造成数据丢失。在公有云中,它们类似于防止可用性区域失败。

  • Regional-DR

    区域 DR 可以在一个地理区域出现问题时确保业务的连续性(在可以接受一些可预测数量的数据丢失的情况下)。在公有云中,它们类似于防止区域故障。

  • 使用扩展集群进行灾难恢复

    扩展集群解决方案可确保在单一 OpenShift 集群中通过基于 OpenShift Data Foundation 的同步复制,在具有低延迟和一个仲裁节点的两个数据中心间扩展,且无数据丢失灾难恢复保护。

Metro-DR 中的区故障以及 Regional-DR 中的区域故障通常使用术语 Recovery Point Objective (RPO)Recovery Time Objective (RTO)

  • RPO 是一种衡量持久性数据备份或快照的频率。实际上,RPO 表示在中断后将丢失或需要重新输入的数据量。
  • RTO 是企业可以容忍的停机时间。RTO 回答了这个问题,"在收到业务中断通知后,我们的系统需要多久才能恢复?"

本指南旨在详细介绍灾难恢复步骤和命令,将应用程序从一个 OpenShift Container Platform (OCP) 集群切换到另一个集群,然后将同一应用程序恢复到原始集群。

第 2 章 灾难恢复订阅要求

Red Hat OpenShift Data Foundation 支持的灾难恢复功能需要满足以下所有先决条件,才能成功实施灾难恢复解决方案:

  • 有效的 Red Hat OpenShift Data Foundation 高级授权
  • 有效的 Red Hat Advanced Cluster Management for Kubernetes 订阅

任何包含 PV(包括作为源或目标)的 PV 的 Red Hat OpenShift Data Foundation 集群都需要 OpenShift Data Foundation 高级授权。此订阅应该在源和目标集群上处于活跃状态。

要了解 OpenShift Data Foundation 订阅如何工作,请参阅与 OpenShift Data Foundation 订阅相关的知识库文章

重要

使用 Multus 网络部署的 OpenShift Data Foundation 不支持在区域灾难恢复(Regional-DR)设置中。

本指南详细介绍了区域灾难恢复(Metro-DR)步骤和命令,将应用程序从一个 OpenShift Container Platform 集群切换到另一个集群,然后将同一应用程序恢复到原始集群。在这种情况下,会使用 Red Hat Advanced Cluster Management (RHACM) 创建或导入 OCP 集群,且各个 OCP 集群间的距离小于 10ms RTT 延迟。

应用程序的持久存储将由外部 Red Hat Ceph Storage (RHCS) 集群提供,在连接此存储集群的 OpenShift Container Platform 实例的两个位置之间扩展。在站点出现问题时,在第三个位置中(与部署 OpenShift Container Platform 实例不同的位置)需要一个带有存储监控器服务的仲裁节点用于为 RHCS 集群创建仲裁。第三个位置可以位于连接到 OpenShift Container Platform 实例的存储集群中的 ~100ms RTT 范围。

这是在由距离分开的两个不同 OpenShift Container Platform 集群中使用 OpenShift Data Foundation 和 RHACM 配置和执行 OpenShift 灾难恢复 (ODR) 功能所需的 Metro DR 步骤的一般概述。除了这两个被称为受管集群的集群外,还需要第三个 OpenShift Container Platform 集群,它将是 Red Hat Advanced Cluster Management (RHACM) hub 集群。

重要

现在,您可以使用 OpenShift Data Foundation 为基于 OpenShift virtualization 技术的工作负载轻松设置 Metropolitan 灾难恢复解决方案。如需更多信息,请参阅知识库文章

3.1. Metro-DR 解决方案的组件

Metro-DR 由 Red Hat Advanced Cluster Management for Kubernetes、Red Hat Ceph Storage 和 OpenShift Data Foundation 组件组成,以便在 OpenShift Container Platform 集群中提供应用程序和数据移动性。

Red Hat Advanced Cluster Management for Kubernetes

Red Hat Advanced Cluster Management (RHACM)提供了管理多个集群和应用程序生命周期的功能。因此,它充当多集群环境中的控制平面。

RHACM 分为两个部分:

  • RHACM Hub:在多集群 control plane 上运行的组件。
  • 受管集群:在受管理的集群中运行的组件。

有关此产品的更多信息,请参阅 RHACM 文档RHACM"管理应用程序"文档

Red Hat Ceph Storage

Red Hat Ceph Storage 是一个可大规模扩展、开放、软件定义的存储平台,它将最稳定版本的 Ceph 存储系统与 Ceph 管理平台、部署实用程序和支持服务相结合。它显著降低了存储企业数据的成本,帮助组织管理指数级数据增长。此软件是一款强大、现代化的 PB 级存储平台,适用于公有云或私有云部署。

如需更多信息,请参阅 Red Hat Ceph Storage

OpenShift Data Foundation

OpenShift Data Foundation 为 OpenShift Container Platform 集群中有状态应用程序提供部署和管理存储的功能。它由 Ceph 作为存储提供商提供支持,其生命周期由 OpenShift Data Foundation 组件堆栈和 Ceph-CSI 管理,它们的生命周期为有状态应用提供持久卷的调配和管理。

OpenShift DR

OpenShift DR 是跨一组使用 RHACM 部署和管理的有状态应用程序的灾难恢复编排器,并提供云原生接口来编排应用程序状态在持久性卷上的生命周期。它们是:

  • 保护跨 OpenShift 集群的应用程序及其状态关系
  • 将一个应用程序及其状态转移到一个对等集群
  • 将一个应用程序及其状态重新定位到之前部署的集群

OpenShift DR 被分成三个组件:

  • ODF Multicluster Orchestrator: 安装在多集群控制平面 (RHACM Hub) 中,它会编配配置并针对 Metro 和 Regional D 关系对等 OpenShift Data Foundation 集群。
  • OpenShift DR Hub Operator:在 hub 集群上作为 ODF 多集群安装的一部分自动安装,以编配启用 DR 应用程序的故障转移或重新定位。
  • OpenShift DR Cluster Operator:在属于 Metro 和 Regional DR relationship的每个受管集群中自动安装,用于管理应用程序的所有 PVC 的生命周期。

3.2. Metro-DR 部署工作流

本节概述了在两个不同的 OpenShift Container Platform 集群中使用最新版本的 Red Hat OpenShift Data Foundation、Red Hat Ceph Storage (RHCS)和 Red Hat Advanced Cluster Management for Kubernetes (RHACM)版本 2.10 或更高版本配置和部署 Metro-DR 功能所需的步骤。除了两个受管集群外,还需要第三个 OpenShift Container Platform 集群来部署 Advanced Cluster Management。

要配置基础架构,请按照给定的顺序执行以下步骤:

  1. 确保满足作为 DR 解决方案的三个集群(Hub、Primary 和 Secondary Openshift Container Platform)集群的要求。请参阅启用 Metro-DR 的要求
  2. 确保您具有仲裁者部署 Red Hat Ceph Storage 扩展集群的要求。请参阅 部署 Red Hat Ceph Storage 的要求
  3. 部署和配置 Red Hat Ceph Storage 扩展模式。有关使用扩展模式功能在两个不同的数据中心上启用 Ceph 集群的说明,请参阅部署 Red Hat Ceph Storage
  4. 安装 OpenShift Data Foundation operator,并在 Primary 和 Secondary 受管集群上创建存储系统。请参阅在受管集群中安装 OpenShift Data Foundation
  5. 在 Hub 集群上安装 ODF Multicluster Orchestrator。请参阅在 Hub 集群上安装 ODF 多集群编排器
  6. 配置 Hub、Primary 和 Secondary 集群之间的 SSL 访问。请参阅配置跨集群的 SSL 访问
  7. 创建 DRPolicy 资源,以用于在跨 Primary 和 Secondary 应用程序所需的 DR 保护的应用程序。请参阅在 Hub 集群上创建灾难恢复策略

    注意

    Metro-DR 解决方案只能有一个 DRpolicy。

  8. 测试您的灾难恢复解决方案:

    1. 基于订阅的应用程序

    2. 基于 ApplicationSet 的应用程序:

    3. 发现的应用程序

3.3. 启用 Metro-DR 的要求

安装 Red Hat OpenShift Data Foundation 支持的灾难恢复解决方案的先决条件如下:

  • 您必须有以下在它们之间具有网络可访问性的 OpenShift 集群:

    • 安装了 Red Hat Advanced Cluster Management (RHACM) for Kubernetes operator 的 hub 集群
    • 运行 OpenShift Data Foundation 的主受管集群
    • 运行 OpenShift Data Foundation 的从受管集群
    注意

    要配置 hub 恢复设置,您需要一个 4 个集群,它充当被动 hub。主受管集群(Site-1)可以与活跃的 RHACM hub 集群共存,而被动 hub 集群与二级受管集群(Site-2)在一起。或者,活跃的 RHACM hub 集群可以放在中立站点(Site-3)中,不受 Site-1 主受管集群或 Site-2 次要集群的故障的影响。在这种情况下,如果使用被动 hub 集群,它可以放在 Site-2 的次要集群。如需更多信息,请参阅为 hub 恢复配置被动 hub 集群

    hub 恢复是一个技术预览功能,并受技术预览支持限制。

  • 确保在 Hub 集群中安装 RHACM 操作符和 MultiClusterHub。具体步骤请查看 RHACM 安装指南

    成功安装 Operator 后,用户界面中会显示一个带有 Web 控制台更新可用消息的弹出窗口。点此弹出窗口中的 Refresh Web 控制台来反映控制台更改。

重要

确保正确配置了应用程序流量路由和重定向。

警告

Openshift Container Platform 受管集群和 Red Hat Ceph Storage (RHCS) 节点有距离的限制。站点之间的网络延迟必须低于 10 毫秒往返时间 (RTT)。

3.4. 使用仲裁器部署 Red Hat Ceph Storage 的要求

Red Hat Ceph Storage 是一个开源企业平台,可为标准、经济的服务器和磁盘提供统一软件定义型存储。通过将块、对象和文件存储整合为一个平台,Red Hat Ceph Storage 可以高效并自动管理所有数据,因此您可以专注于使用它的应用程序和工作负载。

本节提供了 Red Hat Ceph Storage 部署的基本概述。如需更复杂的部署,请参阅 Red Hat Ceph Storage 7 的官方文档指南

注意

仅支持 Flash 介质,因为它在降级时使用 min_size=1。仅对 all-flash OSD 使用扩展模式。使用 all-flash OSD 会最大程度减少在恢复连接后恢复所需的时间,从而尽量减少数据丢失的可能性。

重要

纠删代码池无法用于扩展模式。

3.4.1. 硬件要求

有关部署 Red Hat Ceph Storage 的最低硬件要求的信息,请参阅 容器化 Ceph 的最低硬件建议

Expand
表 3.1. Red Hat Ceph Storage 集群部署的物理服务器位置和 Ceph 组件布局:
节点名数据中心Ceph 组件

ceph1

DC1

OSD+MON+MGR

ceph2

DC1

OSD+MON

ceph3

DC1

OSD+MDS+RGW

ceph4

DC2

OSD+MON+MGR

ceph5

DC2

OSD+MON

ceph6

DC2

OSD+MDS+RGW

ceph7

DC3

MON

3.4.2. 软件要求

使用 Red Hat Ceph Storage 7 的最新软件版本。

有关 Red Hat Ceph Storage 支持的操作系统版本的更多信息,请参阅 Red Hat Ceph Storage: 支持的配置

3.4.3. 网络配置要求

推荐的 Red Hat Ceph Storage 配置如下:

  • 您必须有两个独立的网络,一个公共网络和一个专用网络。
  • 您必须有三个不同的数据中心,支持所有数据中心的 Ceph 私有和公共网络的 VLAN 和子网。

    注意

    您可以为每个数据中心使用不同的子网。

  • 运行 Red Hat Ceph Storage Object Storage Devices (OSD) 的两个数据中心之间的延迟不能超过 10 ms RTT。对于 arbiter 数据中心,这已进行了测试,其值为 100 ms RTT 到其他两个 OSD 数据中心。

以下是我们在本指南中使用的基本网络配置示例:

  • DC1: Ceph public/private network: 10.0.40.0/24
  • DC2: Ceph public/private network: 10.0.40.0/24
  • DC3: Ceph public/private network: 10.0.40.0/24

有关所需网络环境的更多信息,请参阅 Ceph 网络配置

3.5. 部署 Red Hat Ceph Storage

3.5.1. 节点预部署步骤

在安装 Red Hat Ceph Storage Ceph 集群前,请执行以下步骤来满足所有必要的要求。

  1. 将所有节点注册到 Red Hat Network 或 Red Hat Satellite 中,并订阅到有效的池:

    subscription-manager register
    subscription-manager subscribe --pool=8a8XXXXXX9e0
    Copy to Clipboard Toggle word wrap
  2. 为以下软件仓库启用 Ceph 集群中的所有节点的访问权限:

    • rhel9-for-x86_64-baseos-rpms
    • rhel9-for-x86_64-appstream-rpms

      subscription-manager repos --disable="*" --enable="rhel9-for-x86_64-baseos-rpms" --enable="rhel9-for-x86_64-appstream-rpms"
      Copy to Clipboard Toggle word wrap
  3. 如果需要,将操作系统 RPM 更新至最新版本并重新引导:

    dnf update -y
    reboot
    Copy to Clipboard Toggle word wrap
  4. 从集群中选择节点作为 bootstrap 节点。ceph1 是本例中的 bootstrap 节点。

    仅在 bootstrap 节点 ceph1 上,启用 ansible-2.9-for-rhel-9-x86_64-rpmsrhceph-6-tools-for-rhel-9-x86_64-rpms 仓库:

    subscription-manager repos --enable="ansible-2.9-for-rhel-9-x86_64-rpms" --enable="rhceph-6-tools-for-rhel-9-x86_64-rpms"
    Copy to Clipboard Toggle word wrap
  5. 在所有主机中使用裸机/短主机名配置主机名

    hostnamectl set-hostname <short_name>
    Copy to Clipboard Toggle word wrap
  6. 使用 cephadm 验证用于部署 Red Hat Ceph Storage 的主机名配置。

    $ hostname
    Copy to Clipboard Toggle word wrap

    输出示例:

    ceph1
    Copy to Clipboard Toggle word wrap
  7. 使用 DNS 域名设置 DOMAIN 变量,修改 /etc/hosts 文件并将 fqdn 条目添加到 127.0.0.1 IP。

    DOMAIN="example.domain.com"
    
    cat <<EOF >/etc/hosts
    127.0.0.1 $(hostname).${DOMAIN} $(hostname) localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1       $(hostname).${DOMAIN} $(hostname) localhost6 localhost6.localdomain6
    EOF
    Copy to Clipboard Toggle word wrap
  8. 使用 hostname -f 选项通过 fqdn 检查长主机名。

    $ hostname -f
    Copy to Clipboard Toggle word wrap

    输出示例:

    ceph1.example.domain.com
    Copy to Clipboard Toggle word wrap
    注意

    要了解更多有关需要这些更改的信息,请参阅完全限定域名和裸机主机名

  9. 在 bootstrap 节点上执行以下步骤。在我们的示例中,bootstrap 节点为 ceph1

    1. 安装 cephadm-ansible RPM 软件包:

      $ sudo dnf install -y cephadm-ansible
      Copy to Clipboard Toggle word wrap
      重要

      要运行 ansible playbook,您必须有 ssh 免密码访问配置 Red Hat Ceph Storage 集群的所有节点。确保配置的用户(如 deployment-user)具有可调用 sudo 命令的 root 特权,而无需输入密码。

    2. 要使用自定义密钥,请配置所选用户(如 deployment-user)ssh 配置文件以指定将用于通过 ssh 连接到节点的 id/key:

      cat <<EOF > ~/.ssh/config
      Host ceph*
         User deployment-user
         IdentityFile ~/.ssh/ceph.pem
      EOF
      Copy to Clipboard Toggle word wrap
    3. 构建 ansible 清单

      cat <<EOF > /usr/share/cephadm-ansible/inventory
      ceph1
      ceph2
      ceph3
      ceph4
      ceph5
      ceph6
      ceph7
      [admin]
      ceph1
      ceph4
      EOF
      Copy to Clipboard Toggle word wrap
      注意

      此处,属于两个不同的数据中心的主机 (Ceph1 and Ceph4) 配置为清单文件中的 [admin] 组的一部分,并使用 cephadm 标记为 _admin。每个管理节点都会在 bootstrap 过程中收到 admin ceph 密钥环,以便在一个数据中心停机时,我们都可以使用其他可用的管理节点进行检查。

    4. 在运行 pre-flight playbook 前,验证 ansible 是否可以使用 ping 模块访问所有节点。

      $ ansible -i /usr/share/cephadm-ansible/inventory -m ping all -b
      Copy to Clipboard Toggle word wrap

      输出示例:

      ceph6 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph4 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph3 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph2 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph5 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph1 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      ceph7 | SUCCESS => {
          "ansible_facts": {
              "discovered_interpreter_python": "/usr/libexec/platform-python"
          },
          "changed": false,
          "ping": "pong"
      }
      Copy to Clipboard Toggle word wrap
    5. 进入 /usr/share/cephadm-ansible 目录。
    6. 使用相对文件路径运行 ansible-playbook。

      $ ansible-playbook -i /usr/share/cephadm-ansible/inventory /usr/share/cephadm-ansible/cephadm-preflight.yml --extra-vars "ceph_origin=rhcs"
      Copy to Clipboard Toggle word wrap

      preflight playbook Ansible playbook 配置 RHCS dnf 存储库,并为引导准备存储集群。它还安装 podman、lvm2、chronyd 和 cephadm。cephadm-ansiblecephadm-preflight.yml 的默认位置为 /usr/share/cephadm-ansible。如需更多信息,请参阅 运行 preflight playbook

cephadm 实用程序将安装并启动一个单独的 Ceph Monitor 守护进程,以及运行 cephadm bootstrap 命令本地节点上的新 Red Hat Ceph Storage 集群的 Ceph 管理器守护进程。

在本指南中,我们将使用集群规格 yaml 文件,在一个步骤中使用集群规格 yaml 来部署所有需要的 Red Hat Ceph Storage 服务。

如果您在部署过程中发现问题,通过将部署分成两个步骤来更加轻松地对错误进行故障排除:

  1. bootstrap
  2. 服务部署
注意

有关 bootstrap 过程的更多信息 ,请参阅引导新存储集群

步骤

  1. 使用 json 文件创建 json 文件以针对容器 registry 进行身份验证,如下所示:

    $ cat <<EOF > /root/registry.json
    {
     "url":"registry.redhat.io",
     "username":"User",
     "password":"Pass"
    }
    EOF
    Copy to Clipboard Toggle word wrap
  2. 创建一个 cluster-spec.yaml,将节点添加到 Red Hat Ceph Storage 集群,并为服务设置应当运行下表 3.1 的特定标签。

    cat <<EOF > /root/cluster-spec.yaml
    service_type: host
    addr: 10.0.40.78  ## <XXX.XXX.XXX.XXX>
    hostname: ceph1   ##  <ceph-hostname-1>
    location:
      root: default
      datacenter: DC1
    labels:
      - osd
      - mon
      - mgr
    ---
    service_type: host
    addr: 10.0.40.35
    hostname: ceph2
    location:
      datacenter: DC1
    labels:
      - osd
      - mon
    ---
    service_type: host
    addr: 10.0.40.24
    hostname: ceph3
    location:
      datacenter: DC1
    labels:
      - osd
      - mds
      - rgw
    ---
    service_type: host
    addr: 10.0.40.185
    hostname: ceph4
    location:
      root: default
      datacenter: DC2
    labels:
      - osd
      - mon
      - mgr
    ---
    service_type: host
    addr: 10.0.40.88
    hostname: ceph5
    location:
      datacenter: DC2
    labels:
      - osd
      - mon
    ---
    service_type: host
    addr: 10.0.40.66
    hostname: ceph6
    location:
      datacenter: DC2
    labels:
      - osd
      - mds
      - rgw
    ---
    service_type: host
    addr: 10.0.40.221
    hostname: ceph7
    labels:
      - mon
    ---
    service_type: mon
    placement:
      label: "mon"
    ---
    service_type: mds
    service_id: cephfs
    placement:
      label: "mds"
    ---
    service_type: mgr
    service_name: mgr
    placement:
      label: "mgr"
    ---
    service_type: osd
    service_id: all-available-devices
    service_name: osd.all-available-devices
    placement:
      label: "osd"
    spec:
      data_devices:
        all: true
    ---
    service_type: rgw
    service_id: objectgw
    service_name: rgw.objectgw
    placement:
      count: 2
      label: "rgw"
    spec:
      rgw_frontend_port: 8080
    EOF
    Copy to Clipboard Toggle word wrap
  3. 使用从 bootstrap 节点配置的 Red Hat Ceph Storage 公共网络,检索 NIC 的 IP。将 10.0.40.0 替换为您在 ceph 公共网络中定义的子网后,执行以下命令。

    $ ip a | grep 10.0.40
    Copy to Clipboard Toggle word wrap

    输出示例:

    10.0.40.78
    Copy to Clipboard Toggle word wrap
  4. root 用户身份在将作为集群中初始 monitor 节点的节点运行 Cephadm bootstrap 命令。IP_ADDRESS 选项是您用于运行 cephadm bootstrap 命令的节点 IP 地址。

    注意

    如果您配置了不同的用户而不是 root 进行免密码 SSH 访问,则使用带有 cepadm bootstrap 命令的 --ssh-user= 标志。

    如果您使用非 default/id_rsa ssh 密钥名称,请使用 --ssh-private-key--ssh-public-key 选项及 cephadm 命令。

    $ cephadm  bootstrap --ssh-user=deployment-user --mon-ip 10.0.40.78 --apply-spec /root/cluster-spec.yaml --registry-json /root/registry.json
    Copy to Clipboard Toggle word wrap
    重要

    如果本地节点使用完全限定域名 (FQDN),则将 --allow-fqdn-hostname 选项添加到命令行上的 cephadm bootstrap

    bootstrap 完成后,您将看到来自之前 cephadm bootstrap 命令的以下输出:

    You can access the Ceph CLI with:
    
    	sudo /usr/sbin/cephadm shell --fsid dd77f050-9afe-11ec-a56c-029f8148ea14 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
    
    Consider enabling telemetry to help improve Ceph:
    
    	ceph telemetry on
    
    For more information see:
    
    	https://docs.ceph.com/docs/pacific/mgr/telemetry/
    Copy to Clipboard Toggle word wrap
  5. 使用 ceph1 中的 ceph cli 客户端,验证 Red Hat Ceph Storage 集群部署的状态:

    $ ceph -s
    Copy to Clipboard Toggle word wrap

    输出示例:

    cluster:
      id:     3a801754-e01f-11ec-b7ab-005056838602
      health: HEALTH_OK
    
    services:
      mon: 5 daemons, quorum ceph1,ceph2,ceph4,ceph5,ceph7 (age 4m)
      mgr: ceph1.khuuot(active, since 5m), standbys: ceph4.zotfsp
      osd: 12 osds: 12 up (since 3m), 12 in (since 4m)
      rgw: 2 daemons active (2 hosts, 1 zones)
    
    data:
      pools:   5 pools, 107 pgs
      objects: 191 objects, 5.3 KiB
      usage:   105 MiB used, 600 GiB / 600 GiB avail
               105 active+clean
    Copy to Clipboard Toggle word wrap
    注意

    启动所有服务可能需要几分钟时间。

    在您未配置任何 OSD 时,获取全局恢复事件是正常的。

    您可以使用 ceph orch psceph orch ls 来进一步检查服务的状态。

  6. 验证所有节点是否是 cephadm 集群的一部分。

    $ ceph orch host ls
    Copy to Clipboard Toggle word wrap

    输出示例:

    HOST   ADDR          LABELS  STATUS
    ceph1  10.0.40.78    _admin osd mon mgr
    ceph2  10.0.40.35    osd mon
    ceph3  10.0.40.24    osd mds rgw
    ceph4  10.0.40.185   osd mon mgr
    ceph5  10.0.40.88    osd mon
    ceph6  10.0.40.66    osd mds rgw
    ceph7  10.0.40.221   mon
    Copy to Clipboard Toggle word wrap
    注意

    您可以直接从主机运行 Ceph 命令,因为 ceph1cephadm-ansible 清单中配置,作为 [admin] 组的一部分。Ceph 管理密钥在 cephadm bootstrap 过程中复制到主机。

  7. 检查数据中心的 Ceph 监控服务的当前位置。

    $ ceph orch ps | grep mon | awk '{print $1 " " $2}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    mon.ceph1 ceph1
    mon.ceph2 ceph2
    mon.ceph4 ceph4
    mon.ceph5 ceph5
    mon.ceph7 ceph7
    Copy to Clipboard Toggle word wrap
  8. 检查数据中心的 Ceph 管理器服务的当前位置。

    $ ceph orch ps | grep mgr | awk '{print $1 " " $2}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    mgr.ceph2.ycgwyz ceph2
    mgr.ceph5.kremtt ceph5
    Copy to Clipboard Toggle word wrap
  9. 检查 ceph osd crush map 布局,以确保每个主机都配置了 OSD,其状态为 UP。此外,再次检查每个节点在表 3.1 中指定的右侧数据中心 bucket 下。

    $ ceph osd tree
    Copy to Clipboard Toggle word wrap

    输出示例:

    ID   CLASS  WEIGHT   TYPE NAME           STATUS  REWEIGHT  PRI-AFF
    -1          0.87900  root default
    -16         0.43950      datacenter DC1
    -11         0.14650          host ceph1
      2    ssd  0.14650              osd.2       up   1.00000  1.00000
     -3         0.14650          host ceph2
      3    ssd  0.14650              osd.3       up   1.00000  1.00000
    -13         0.14650          host ceph3
      4    ssd  0.14650              osd.4       up   1.00000  1.00000
    -17         0.43950      datacenter DC2
     -5         0.14650          host ceph4
      0    ssd  0.14650              osd.0       up   1.00000  1.00000
     -9         0.14650          host ceph5
      1    ssd  0.14650              osd.1       up   1.00000  1.00000
     -7         0.14650          host ceph6
      5    ssd  0.14650              osd.5       up   1.00000  1.00000
    Copy to Clipboard Toggle word wrap
  10. 创建并启用新的 RDB 块池。

    $ ceph osd pool create 32 32
    $ ceph osd pool application enable rbdpool rbd
    Copy to Clipboard Toggle word wrap
    注意

    命令末尾的数字 32 是分配给这个池的 PG 数量。PG 数量可能会因集群中的 OSD 数量、使用池的预期%的不同而有所不同。您可以使用以下计算器来确定所需的 PG 数量:Ceph Placement Groups(PG)per Pool Calculator

  11. 验证 RBD 池已创建好。

    $ ceph osd lspools | grep rbdpool
    Copy to Clipboard Toggle word wrap

    输出示例:

     3 rbdpool
    Copy to Clipboard Toggle word wrap
  12. 验证 MDS 服务是否处于活动状态,并且每个数据中心上有一个服务。

    $ ceph orch ps | grep mds
    Copy to Clipboard Toggle word wrap

    输出示例:

    mds.cephfs.ceph3.cjpbqo    ceph3               running (17m)   117s ago  17m    16.1M        -  16.2.9
    mds.cephfs.ceph6.lqmgqt    ceph6               running (17m)   117s ago  17m    16.1M        -  16.2.9
    Copy to Clipboard Toggle word wrap
  13. 创建 CephFS 卷。

    $ ceph fs volume create cephfs
    Copy to Clipboard Toggle word wrap
    注意

    ceph fs volume create 命令还会创建所需的数据和 meta CephFS 池。有关更多信息,请参阅配置和挂载 Ceph 文件系统

  14. 检查 Ceph 状态,以验证 MDS 守护进程的部署方式。确保状态为 active,其中 ceph6 是这个文件系统的主 MDS,ceph3 是次 MDS。

    $ ceph fs status
    Copy to Clipboard Toggle word wrap

    输出示例:

    cephfs - 0 clients
    ======
    RANK  STATE           MDS             ACTIVITY     DNS    INOS   DIRS   CAPS
     0    active  cephfs.ceph6.ggjywj  Reqs:    0 /s    10     13     12      0
           POOL           TYPE     USED  AVAIL
    cephfs.cephfs.meta  metadata  96.0k   284G
    cephfs.cephfs.data    data       0    284G
        STANDBY MDS
    cephfs.ceph3.ogcqkl
    Copy to Clipboard Toggle word wrap
  15. 验证 RGW 服务是否处于活动状态。

    $ ceph orch ps | grep rgw
    Copy to Clipboard Toggle word wrap

    输出示例:

    rgw.objectgw.ceph3.kkmxgb  ceph3  *:8080       running (7m)      3m ago   7m    52.7M        -  16.2.9
    rgw.objectgw.ceph6.xmnpah  ceph6  *:8080       running (7m)      3m ago   7m    53.3M        -  16.2.9
    Copy to Clipboard Toggle word wrap

3.5.3. 配置 Red Hat Ceph Storage 扩展模式

使用 cephadm 完全部署了红帽 Ceph 存储集群后,请使用以下步骤来配置扩展集群模式。新的扩展模式旨在处理 2 个站点的情况。

步骤

  1. 使用 ceph mon dump 命令检查监视器所使用的当前选择策略。默认情况下,在 ceph 集群中,连接设置为经典。

    ceph mon dump | grep election_strategy
    Copy to Clipboard Toggle word wrap

    输出示例:

    dumped monmap epoch 9
    election_strategy: 1
    Copy to Clipboard Toggle word wrap
  2. 将 monitor 选举更改为连接性。

    ceph mon set election_strategy connectivity
    Copy to Clipboard Toggle word wrap
  3. 再次运行前面的 ceph mon dump 命令,以验证 election_strategy 值。

    $ ceph mon dump | grep election_strategy
    Copy to Clipboard Toggle word wrap

    输出示例:

    dumped monmap epoch 10
    election_strategy: 3
    Copy to Clipboard Toggle word wrap

    要了解有关不同选择策略的更多信息,请参阅配置监控选择策略

  4. 设置所有 Ceph 监视器的位置:

    ceph mon set_location ceph1 datacenter=DC1
    ceph mon set_location ceph2 datacenter=DC1
    ceph mon set_location ceph4 datacenter=DC2
    ceph mon set_location ceph5 datacenter=DC2
    ceph mon set_location ceph7 datacenter=DC3
    Copy to Clipboard Toggle word wrap
  5. 验证每个监控器是否具有正确的位置。

    $ ceph mon dump
    Copy to Clipboard Toggle word wrap

    输出示例:

    epoch 17
    fsid dd77f050-9afe-11ec-a56c-029f8148ea14
    last_changed 2022-03-04T07:17:26.913330+0000
    created 2022-03-03T14:33:22.957190+0000
    min_mon_release 16 (pacific)
    election_strategy: 3
    0: [v2:10.0.143.78:3300/0,v1:10.0.143.78:6789/0] mon.ceph1; crush_location {datacenter=DC1}
    1: [v2:10.0.155.185:3300/0,v1:10.0.155.185:6789/0] mon.ceph4; crush_location {datacenter=DC2}
    2: [v2:10.0.139.88:3300/0,v1:10.0.139.88:6789/0] mon.ceph5; crush_location {datacenter=DC2}
    3: [v2:10.0.150.221:3300/0,v1:10.0.150.221:6789/0] mon.ceph7; crush_location {datacenter=DC3}
    4: [v2:10.0.155.35:3300/0,v1:10.0.155.35:6789/0] mon.ceph2; crush_location {datacenter=DC1}
    Copy to Clipboard Toggle word wrap
  6. 通过安装 ceph-base RPM 软件包来创建使用此 OSD 拓扑的 CRUSH 规则,以便使用 crushtool 命令:

    $ dnf -y install ceph-base
    Copy to Clipboard Toggle word wrap

    要了解有关 CRUSH 规则集的更多信息,请参阅 Ceph CRUSH 规则集

  7. 从集群获取编译的 CRUSH map:

    $ ceph osd getcrushmap > /etc/ceph/crushmap.bin
    Copy to Clipboard Toggle word wrap
  8. 解译 CRUSH map,并将其转换为文本文件,以便能编辑它:

    $ crushtool -d /etc/ceph/crushmap.bin -o /etc/ceph/crushmap.txt
    Copy to Clipboard Toggle word wrap
  9. 编辑文件 /etc/ceph/crushmap.txt,将以下规则添加到 CRUSH map。

    $ vim /etc/ceph/crushmap.txt
    Copy to Clipboard Toggle word wrap
    rule stretch_rule {
            id 1
            type replicated
            min_size 1
            max_size 10
            step take default
            step choose firstn 0 type datacenter
            step chooseleaf firstn 2 type host
            step emit
    }
    # end crush map
    Copy to Clipboard Toggle word wrap

    本例适用于所有 OpenShift Container Platform 集群中的活动应用程序。

    注意

    规则 ID 必须是唯一的。在示例中,我们只有一个带有 id 0 的 crush 规则,因此我们正在使用 id 1。如果您的部署创建了更多规则,则使用下一个可用 ID。

    声明的 CRUSH 规则包含以下信息:

    • 运行名称

      • Description: 用于标识规则的唯一名称。
      • Value: stretch_rule
    • id

      • Description:用于标识规则的唯一整数。
      • Value: 1
    • type

      • Description:描述存储驱动器复制或纠删代码的规则。
      • Value: replicated
    • min_size

      • Description: 如果池制作的副本数少于这个数字,CRUSH 不会选择这一规则。
      • 值 :1
    • max_size

      • Description: 如果池制作的副本数多于这个数字,CRUSH 不会选择这一规则。
      • 值 :10
    • 步骤需要默认

      • 描述:获取名为 default 的根存储桶,并开始迭代树。
    • 步骤选择第 0 类型数据中心

      • Description:选择数据中心存储桶,并放入它的子树中。
    • step chooseleaf firstn 2 type host

      • Description:选择给定类型的存储桶数量。在本例中,两个不同的主机位于其在上一级别输入的数据中心。
    • step emit

      • Description: 输出当前的值并清除堆栈。通常在规则末尾使用,但也可用于从同一规则的不同树中选取。
  10. 从文件 /etc/ceph/crushmap.txt 中编译新的 CRUSH map,并将其转换为名为 /etc/ceph/crushmap2.bin 的二进制文件:

    $ crushtool -c /etc/ceph/crushmap.txt -o /etc/ceph/crushmap2.bin
    Copy to Clipboard Toggle word wrap
  11. 注入我们创建回集群的新 crushmap:

    $ ceph osd setcrushmap -i /etc/ceph/crushmap2.bin
    Copy to Clipboard Toggle word wrap

    输出示例:

    17
    Copy to Clipboard Toggle word wrap
    注意

    数字 17 是一个计数器,它将根据您对 crush 映射所做的更改来增加(18,19 等)。

  12. 验证创建的扩展规则现已可供使用。

    ceph osd crush rule ls
    Copy to Clipboard Toggle word wrap

    输出示例:

    replicated_rule
    stretch_rule
    Copy to Clipboard Toggle word wrap
  13. 启用扩展群集模式。

    $ ceph mon enable_stretch_mode ceph7 stretch_rule datacenter
    Copy to Clipboard Toggle word wrap

    在本例中,ceph7 是仲裁节点,stretch_rule 是在上一步中创建的 crush 规则,datacenter 是分开的存储桶。

  14. 验证我们的所有池正在使用我们在 Ceph 集群中创建的 stretch_rule CRUSH 规则:

    $ for pool in $(rados lspools);do echo -n "Pool: ${pool}; ";ceph osd pool get ${pool} crush_rule;done
    Copy to Clipboard Toggle word wrap

    输出示例:

    Pool: device_health_metrics; crush_rule: stretch_rule
    Pool: cephfs.cephfs.meta; crush_rule: stretch_rule
    Pool: cephfs.cephfs.data; crush_rule: stretch_rule
    Pool: .rgw.root; crush_rule: stretch_rule
    Pool: default.rgw.log; crush_rule: stretch_rule
    Pool: default.rgw.control; crush_rule: stretch_rule
    Pool: default.rgw.meta; crush_rule: stretch_rule
    Pool: rbdpool; crush_rule: stretch_rule
    Copy to Clipboard Toggle word wrap

    这表明正在运行的红帽 Ceph 存储扩展群集,现在具有仲裁模式。

3.6. 在受管集群中安装 OpenShift Data Foundation

要在两个 OpenShift Container Platform 集群之间配置存储复制,OpenShift Data Foundation Operator 必须首先安装在每个受管集群上,如下所示:

先决条件

  • 确保您已满足 OpenShift Data Foundation 外部部署的硬件要求。有关硬件要求的详情,请参阅 外部模式要求

流程

  1. 在每个受管集群中,安装和配置最新的 OpenShift Data Foundation 集群。
  2. 在安装 operator 后,创建一个 StorageSystem,使用选择 Full deployment 类型和 Connect with external storage platform,其中您的后端存储类型Red Hat Ceph Storage

    具体步骤请参考 以外部模式部署 OpenShift Data Foundation

    将以下标记与 ceph-external-cluster-details-exporter.py 脚本一起使用。

    1. 您在 ceph-external-cluster-details-exporter.py script 中需要最少使用以下三个标记:

      --rbd-data-pool-name
      使用在为 OpenShift Container Platform 部署 RHCS 时创建的 RBD 池的名称。例如,池的名称可能为 rbdpool
      --rgw-endpoint
      <ip_address>:<port> 格式提供端点。它是与您要配置的 OpenShift Container Platform 集群相同的站点中运行的 RGW 守护进程的 RGW IP。
      --run-as-user
      每个站点使用不同的客户端名称。
    2. 如果在 RHCS 部署过程中使用了默认值,则以下标记是可选的

      --cephfs-filesystem-name
      使用在为 OpenShift Container Platform 在 RHCS 部署期间创建的 CephFS 文件系统的名称,默认的文件系统名称是 cephfs
      --cephfs-data-pool-name
      在用于 OpenShift Container Platform 的 RHCS 部署期间创建的 CephFS 数据池名称后,默认的池称为 cephfs.data
      --cephfs-metadata-pool-name
      在用于 OpenShift Container Platform 的 RHCS 部署期间创建的 CephFS 元数据池的名称后,默认的池名为 cephfs.meta
    3. 在 bootstrap 节点(ceph1)上运行以下命令,为 datacenter1 和 datacenter2 中的 RGW 端点获取 IP:

      ceph orch ps | grep rgw.objectgw
      Copy to Clipboard Toggle word wrap

      输出示例:

      rgw.objectgw.ceph3.mecpzm  ceph3  *:8080       running (5d)     31s ago   7w     204M        -  16.2.7-112.el8cp
      rgw.objectgw.ceph6.mecpzm  ceph6  *:8080       running (5d)     31s ago   7w     204M        -  16.2.7-112.el8cp
      Copy to Clipboard Toggle word wrap
      host ceph3.example.com
      host ceph6.example.com
      Copy to Clipboard Toggle word wrap

      输出示例:

      ceph3.example.com has address 10.0.40.24
      ceph6.example.com has address 10.0.40.66
      Copy to Clipboard Toggle word wrap
    4. 使用在 bootstrapped 节点 ceph1 上为第一个 OpenShift Container Platform 受管集群 cluster1 配置的参数,运行 ceph-external-cluster-details-exporter.py

      python3 ceph-external-cluster-details-exporter.py --rbd-data-pool-name rbdpool --cephfs-filesystem-name cephfs --cephfs-data-pool-name cephfs.cephfs.data  --cephfs-metadata-pool-name cephfs.cephfs.meta --<rgw-endpoint> XXX.XXX.XXX.XXX:8080 --run-as-user client.odf.cluster1 > ocp-cluster1.json
      Copy to Clipboard Toggle word wrap
      注意

      根据您的环境修改 <rgw-endpoint> XXX.XXX.XXX.XXX。

    5. 使用在 bootstrapped 节点 ceph1 上为第一个 OpenShift Container Platform 受管集群 cluster2 配置的参数,运行 ceph-external-cluster-details-exporter.py

      python3 ceph-external-cluster-details-exporter.py --rbd-data-pool-name rbdpool --cephfs-filesystem-name cephfs --cephfs-data-pool-name cephfs.cephfs.data  --cephfs-metadata-pool-name cephfs.cephfs.meta --rgw-endpoint XXX.XXX.XXX.XXX:8080 --run-as-user client.odf.cluster2 > ocp-cluster2.json
      Copy to Clipboard Toggle word wrap
      注意

      根据您的环境修改 <rgw-endpoint> XXX.XXX.XXX.XXX。

      • 将 bootstrap 集群 (ceph1) ocp-cluster1.jsonocp-cluster2.json 这两个文件保存到本地机器中。
      • 在部署外部 OpenShift Data Foundation 的 cluster1 上,使用 OpenShift Container Platform 控制台上的文件 ocp-cluster1.json 的内容。
      • 在部署外部 OpenShift Data Foundation 的 cluster2 上,使用 OpenShift Container Platform 控制台上的文件 ocp-cluster2.json 的内容。
  3. 检查设置,然后选择 Create StorageSystem
  4. 使用以下命令验证每个受管集群中 OpenShift Data Foundation 部署是否成功:

    $ oc get storagecluster -n openshift-storage ocs-external-storagecluster -o jsonpath='{.status.phase}{"\n"}'
    Copy to Clipboard Toggle word wrap

    对于 Multicloud 网关(MCG):

    $ oc get noobaa -n openshift-storage noobaa -o jsonpath='{.status.phase}{"\n"}'
    Copy to Clipboard Toggle word wrap

    等待在主受管集群从受管集群上的查询的状态结果变为 Ready。

  5. 在 OpenShift Web 控制台中,导航到 Installed Operators → OpenShift Data Foundation → Storage System → ocs-external-storagecluster-storagesystem → Resources。验证 StorageClusterStatus 是否为 Ready,其旁边有一个绿色勾号标记。
  6. 为 RBD 和 CephFS 卷启用读取关联性,以便从最接近的数据中心提供。

    1. 在 Primary 受管集群上,标记所有节点。

      $ oc label nodes --all metro-dr.openshift-storage.topology.io/datacenter=DC1
      Copy to Clipboard Toggle word wrap

      执行以下命令启用读取关联性:

      $ oc patch storageclusters.ocs.openshift.io -n openshift-storage ocs-external-storagecluster -p '{"spec":{"csi":{"readAffinity":{"enabled":true,"crushLocationLabels":["metro-dr.openshift-storage.topology.io/datacenter"]}}}}' --type=merge
      Copy to Clipboard Toggle word wrap
      $ oc delete po -n openshift-storage -l 'app in (csi-cephfsplugin,csi-rbdplugin)'
      Copy to Clipboard Toggle word wrap
    2. 在二级受管集群中,标记所有节点:

      $ oc label nodes --all metro-dr.openshift-storage.topology.io/datacenter=DC2
      Copy to Clipboard Toggle word wrap

      执行以下命令启用读取关联性:

      $ oc patch storageclusters.ocs.openshift.io -n openshift-storage ocs-external-storagecluster -p '{"spec":{"csi":{"readAffinity":{"enabled":true,"crushLocationLabels":["metro-dr.openshift-storage.topology.io/datacenter"]}}}}' --type=merge
      Copy to Clipboard Toggle word wrap
      $ oc delete po -n openshift-storage -l 'app in (csi-cephfsplugin,csi-rbdplugin)'
      Copy to Clipboard Toggle word wrap

OpenShift Data Foundation Multicluster Orchestrator 是一个控制器,从 Hub 集群上的 OpenShift Container Platform OperatorHub 安装。

流程

  1. Hub 集群中,进入到 OperatorHub 并使用关键字过滤器搜索 ODF Multicluster Orchestrator
  2. ODF Multicluster Orchestrator 标题。
  3. 保留所有默认设置,然后点安装

    确保 operator 资源安装在 openshift-operators 中,并可用于所有命名空间。

    注意

    ODF Multicluster Orchestrator 还会在 RHACM hub 集群上作为依赖项安装 Openshift DR Hub Operator

  4. 验证 Operator Pod 处于 Running 状态。OpenShift DR Hub operator 也安装在 openshift-operators 命名空间中。

    $ oc get pods -n openshift-operators
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                                        READY   STATUS       RESTARTS    AGE
    odf-multicluster-console-6845b795b9-blxrn   1/1     Running      0           4d20h
    odfmo-controller-manager-f9d9dfb59-jbrsd    1/1     Running      0           4d20h
    ramen-hub-operator-6fb887f885-fss4w         2/2     Running      0           4d20h
    Copy to Clipboard Toggle word wrap

3.8. 在集群间配置 SSL 访问

primary 和 secondary 集群间配置网络 SSL 访问,因此元数据可以以一个安全的方式保持在不同的集群中的 Multicloud Gateway (MCG) 对象存储桶,以及保持在 Hub 集群中验证对对象存储桶的访问。

注意

如果所有 OpenShift 集群都为您的环境使用签名的有效证书集进行部署,则可以跳过本节。

步骤

  1. 提取主受管集群的入口证书,并将输出保存到 primary.crt

    $ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > primary.crt
    Copy to Clipboard Toggle word wrap
  2. 提取二级受管集群的入口证书,并将输出保存到 secondary.crt

    $ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > secondary.crt
    Copy to Clipboard Toggle word wrap
  3. 创建新的 ConfigMap 文件,以使用文件名 cm-clusters-crt.yaml 来保存远程集群的证书捆绑包。

    注意

    如本示例文件所示,每个集群可能有超过三个证书。另外,请确保在从之前创建的 primary.crtsecondary.crt 文件中复制并粘贴后,证书内容会被正确缩进。

    apiVersion: v1
    data:
      ca-bundle.crt: |
        -----BEGIN CERTIFICATE-----
        <copy contents of cert1 from primary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert2 from primary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert3 primary.crt here>
        -----END CERTIFICATE----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert1 from secondary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert2 from secondary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert3 from secondary.crt here>
        -----END CERTIFICATE-----
    kind: ConfigMap
    metadata:
      name: user-ca-bundle
      namespace: openshift-config
    Copy to Clipboard Toggle word wrap
  4. Primary 受管集群, Secondary 受管集群, 和 Hub 集群 中创建 ConfigMap

    $ oc create -f cm-clusters-crt.yaml
    Copy to Clipboard Toggle word wrap

    输出示例:

    configmap/user-ca-bundle created
    Copy to Clipboard Toggle word wrap
  5. 主受管集群二级受管集群Hub 集群上的默认代理资源进行补丁。

    $ oc patch proxy cluster --type=merge  --patch='{"spec":{"trustedCA":{"name":"user-ca-bundle"}}}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    proxy.config.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

3.9. 在 Hub 集群上创建灾难恢复策略

OpenShift 灾难恢复策略(DRPolicy)资源指定参与灾难恢复解决方案和所需的复制间隔的 OpenShift Container Platform 集群。DRPolicy 是一个集群范围的资源,用户可以应用到需要灾难恢复解决方案的应用程序。

ODF MultiCluster Orchestrator Operator 通过 Multicluster Web console 促进每个 DRPolicy 和相应的 DRClusters 的创建。

先决条件

  • 确保至少一组两个受管集群。

流程

  1. OpenShift 控制台中,导航到 All ClustersData Servicesdisaster recovery
  2. 在 Overview 选项卡中,点 Create a disaster recovery policy 或 navigate to Policies 标签页,点 Create DRPolicy
  3. 输入 Policy name。确保每个 DRPolicy 都有一个唯一名称(例如: ocp4perf1-ocp4perf2)。
  4. 从与此新策略关联的受管集群列表中选择两个集群。
  5. 复制策略根据所选的 OpenShift 集群自动设置为 sync
  6. Create
  7. 验证 DRPolicy 是否已成功创建。在 Hub 集群中,为创建的每个 DRPolicy 资源运行这个命令,使用您的唯一名称替换 <drpolicy_name>

    $ oc get drpolicy <drpolicy_name> -o jsonpath='{.status.conditions[].reason}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    Succeeded
    Copy to Clipboard Toggle word wrap

    创建 DRPolicy 时,也会创建两个 DRCluster 资源。验证所有三个资源并且状态显示为 Succeeded 最多需要 10 分钟。

    注意

    DRPolicy 不支持编辑 SchedulingIntervalReplicationClassSelectorVolumeSnapshotClassSelectorDRClusters 字段值。

  8. 验证对象存储桶可以从 Hub 集群Primary 受管集群Secondary 受管集群访问。

    1. 获取 Hub 集群上的 DRClusters 的名称。

      $ oc get drclusters
      Copy to Clipboard Toggle word wrap

      输出示例:

      NAME        AGE
      ocp4perf1   4m42s
      ocp4perf2   4m42s
      Copy to Clipboard Toggle word wrap
    2. 检查 S3 访问每个受管集群上创建的每个存储桶。使用 DRCluster 验证命令,使用您的唯一名称替换 <drcluster_name>

      注意

      DRClusters 不支持编辑 RegionS3ProfileName 字段值。

      $ oc get drcluster <drcluster_name> -o jsonpath='{.status.conditions[2].reason}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Succeeded
      Copy to Clipboard Toggle word wrap
      注意

      确保为在 Hub 集群中的两个 DRClusters 运行命令。

  9. 验证 OpenShift DR Cluster operator 已成功在 Primary 受管集群Secondary 受管集群上成功安装。

    $ oc get csv,pod -n openshift-dr-system
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                                                                            DISPLAY                         VERSION        REPLACES   PHASE
    clusterserviceversion.operators.coreos.com/odr-cluster-operator.v4.15.0         Openshift DR Cluster Operator   4.15.0                    Succeeded
    clusterserviceversion.operators.coreos.com/volsync-product.v0.8.0               VolSync                         0.8.0                     Succeeded
    
    NAME                                             READY   STATUS    RESTARTS   AGE
    pod/ramen-dr-cluster-operator-6467cf5d4c-cc8kz   2/2     Running   0          3d12h
    Copy to Clipboard Toggle word wrap

    您还可以验证 OpenShift DR Cluster Operator 是否在每个受管集群的 OperatorHub 上成功安装。

  10. 验证 secret 是否在主受管集群和次受管集群上正确传播。

    oc get secrets -n openshift-dr-system | grep Opaque
    Copy to Clipboard Toggle word wrap

    将输出与 Hub 集群中的 s3SecretRef 匹配:

    oc get cm -n openshift-operators ramen-hub-operator-config -oyaml
    Copy to Clipboard Toggle word wrap

3.10. 为隔离自动化配置 DRClusters

在应用程序故障切换前启用隔离需要此配置。为了防止在集群中写入持久性卷(由灾难达到的,OpenShift DR 指示 Red Hat Ceph Storage (RHCS)指示 Red Hat Ceph Storage (RHCS)从 RHCS 外部存储隔离节点。本节介绍了如何为 DRCluster 节点添加 IP 或 IP 地址范围。

3.10.1. 将节点 IP 地址添加到 DRClusters

  1. 通过在 Primary 受管集群secondary 受管集群中运行此命令,在受管集群中查找所有 OpenShift 节点的 IP 地址

    $ oc get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type=="ExternalIP")].address}{"\n"}{end}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    10.70.56.118
    10.70.56.193
    10.70.56.154
    10.70.56.242
    10.70.56.136
    10.70.56.99
    Copy to Clipboard Toggle word wrap

    获得 IP 地址后,可以为每个受管集群修改 DRCluster 资源。

  2. 在 Hub 集群上查找 DRCluster 名称。

    $ oc get drcluster
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME        AGE
    ocp4perf1   5m35s
    ocp4perf2   5m35s
    Copy to Clipboard Toggle word wrap
  3. 编辑每个 DRCluster,在使用您的唯一名称替换 <drcluster_name> 后添加您的唯一的 IP地址。

    $ oc edit drcluster <drcluster_name>
    Copy to Clipboard Toggle word wrap
    apiVersion: ramendr.openshift.io/v1alpha1
    kind: DRCluster
    metadata:
    [...]
    spec:
      s3ProfileName: s3profile-<drcluster_name>-ocs-external-storagecluster
      ## Add this section
      cidrs:
        -  <IP_Address1>/32
        -  <IP_Address2>/32
        -  <IP_Address3>/32
        -  <IP_Address4>/32
        -  <IP_Address5>/32
        -  <IP_Address6>/32
    [...]
    Copy to Clipboard Toggle word wrap

    输出示例:

    drcluster.ramendr.openshift.io/ocp4perf1 edited
    Copy to Clipboard Toggle word wrap
注意

有超过 6 个 IP 地址。

在对等 DRCluster 资源(如 ocp4perf2)中,为 Secondary 受管集群上的 IP 地址 修改此 DRCluster 配置。

3.10.2. 在 DRClusters 中添加隔离注解

在所有 DRCluster 资源中添加以下注解。这些注解包括以下说明(测试应用程序故障切换)创建的 NetworkFence 资源所需的详细信息。

注意

<drcluster_name> 替换为您的唯一名称。

$ oc edit drcluster <drcluster_name>
Copy to Clipboard Toggle word wrap
apiVersion: ramendr.openshift.io/v1alpha1
kind: DRCluster
metadata:
  ## Add this section
  annotations:
    drcluster.ramendr.openshift.io/storage-clusterid: openshift-storage
    drcluster.ramendr.openshift.io/storage-driver: openshift-storage.rbd.csi.ceph.com
    drcluster.ramendr.openshift.io/storage-secret-name: rook-csi-rbd-provisioner
    drcluster.ramendr.openshift.io/storage-secret-namespace: openshift-storage
[...]
Copy to Clipboard Toggle word wrap

输出示例:

drcluster.ramendr.openshift.io/ocp4perf1 edited
Copy to Clipboard Toggle word wrap

确保为 DRCluster 资源添加这些注解(例如:ocp4perf1ocp4perf2)。

OpenShift Data Foundation 灾难恢复 (DR) 解决方案支持针对由 RHACM 管理的基于 Subscription 和 ApplicationSet 的应用程序的灾难恢复。如需了解更多详细信息,请参阅 订阅和 ApplicationSet 文档。

以下小节详细介绍了如何创建应用程序并将 DRPolicy 应用到应用程序。

3.11.1. 基于订阅的应用程序

3.11.1.1. 创建基于订阅的应用程序示例

为了测试从 Primary 受管集群Secondary 受管集群failoverrelocate,我们需要一个简单的应用程序。

先决条件

  • 在创建用于常规消耗的应用程序时,请确保应用程序仅部署到一个集群。
  • 使用名为 busybox 的示例应用作为示例。
  • 当应用程序通过或重新定位失败时,确保使用全局流量管理器(GTM)或 Global Server Load Balancing (GLSB)服务配置应用程序的所有外部路由。
  • 作为最佳实践,将属于 Red Hat Advanced Cluster Management (RHACM) 订阅的 Red Hat Advanced Cluster Management (RHACM) 订阅分组在一起,以指代单个 Placement Rule 到 DR 保护它们作为组。进一步将它们创建为一个应用程序,用于订阅的逻辑分组,以备将来 DR 操作,如故障转移和重新定位。

    注意

    如果不相关的订阅引用与放置操作相同的放置规则,它们也会受到 DR 保护,因为 DR 工作流控制引用放置规则的所有订阅。

流程

  1. 在 Hub 集群中,进入到 Applications,再点 Create application
  2. 选择类型 Subscription
  3. 输入应用程序 Name (如 busybox)和 Namespace (如 busybox-sample)。
  4. 在 Repository location for resources 部分中,选择 Repository type Git
  5. 输入示例应用程序的 Git 存储库 URL、github BranchPath,在其中创建资源 busybox Pod 和 PVC。

    使用示例应用程序存储库作为 https://github.com/red-hat-storage/ocm-ramen-samples,其中 Branchrelease-4.16Pathbusybox-odr-metro

  6. 向下滚动,直到您看到 Deploy application resources on cluster with all specified labels

    • 选择全局 Cluster set 或包含环境正确受管集群的全局集群。
    • 添加一个 <name> 标签,将其值设置为受管集群的名称。
  7. 点位于右上角的 Create

    在接下来的屏幕中,进入 Topology 选项卡。您可以看到应用程序拓扑上有所有的绿色对勾图标。

    注意

    要获取更多信息,请点击任何拓扑元素,拓扑视图右侧会显示一个窗口。

  8. 验证示例应用程序部署。

    现在,busybox 应用程序已部署到首选集群,现在可以验证部署。

    登录到您的受管集群,其中 busybox 由 RHACM 部署。

    $ oc get pods,pvc -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                          READY   STATUS    RESTARTS   AGE
    pod/busybox-67bf494b9-zl5tr   1/1     Running   0          77s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-c732e5fe-daaf-4c4d-99dd-462e04c18412   5Gi        RWO            ocs-storagecluster-ceph-rbd   77s
    Copy to Clipboard Toggle word wrap
3.11.1.2. 将数据策略应用到示例应用程序

先决条件

  • 确保 Data 策略中引用的两个受管集群都可以访问。如果没有,在两个集群都在线前,应用程序不会受到灾难恢复的影响。

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications
  2. 点应用程序末尾的 Actions 菜单,以查看可用操作的列表。
  3. Manage data policyAssign data policy
  4. 选择 Policy,再单击 Next
  5. 选择 Application resource,然后使用 PVC 标签选择器 为所选应用程序资源选择 PVC 标签

    注意

    您可以为所选应用程序资源选择多个 PVC 标签。您还可以使用 Add application resource 选项添加多个资源。

  6. 添加所有应用程序资源后,点 Next
  7. 检查 Policy 配置详情并点 Assign。新分配的 Data 策略显示在 Manage data policy modal 列表视图中。
  8. 验证您可以在 Applications 页面中查看分配的策略详情。

    1. 在 Applications 页面上,进入到 Data policy 列,再单击 策略链接 以展开视图。
    2. 验证您可以看到分配的策略数量以及故障转移和重新定位状态。
    3. 单击 View more details,以查看与应用程序一起使用的策略持续活动的状态。
  9. 将 DRPolicy 应用到应用程序后,确认 drpc yaml 输出中是否将 ClusterDataProtected 设置为 True

3.11.2. 基于 ApplicationSet 的应用程序

3.11.2.1. 创建基于 ApplicationSet 的应用程序

前提条件

  • 确保在所有三个集群中安装 Red Hat OpenShift GitOps operator: Hub 集群Primary 受管集群和 Secondary 受管集群。具体步骤,请参阅在 Web 控制台中安装 Red Hat OpenShift GitOps Operator
  • 在 Hub 集群中,确保 Primary 和 Secondary 受管集群都注册到 GitOps。有关注册说明,请参阅将受管集群注册到 GitOps。然后,检查 GitOpsCluster 资源使用的放置是否用于注册两个受管集群,具有处理集群的容限。您可以使用 oc get placement <placement-name> -n openshift-gitops -o yaml 命令来验证以下容限是否已添加到放置中。

      tolerations:
      - key: cluster.open-cluster-management.io/unreachable
        operator: Exists
      - key: cluster.open-cluster-management.io/unavailable
        operator: Exists
    Copy to Clipboard Toggle word wrap

    如果没有添加容限,请参阅为 Red Hat Advanced Cluster Management 和 OpenShift GitOps 配置应用程序放置容限

  • 确保已在 PrimarySecondary 受管集群 上创建 ClusterRoleBinding yaml。具体步骤请查看 RHACM 文档中的 先决条件 章节

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications 并点 Create application
  2. 将应用程序类型选择为 Argo CD ApplicationSet - Pull model
  3. General 步骤中,输入 应用程序设置名称
  4. 选择 Argo server openshift-gitopsRequeue time180 秒。
  5. 点击 Next
  6. 在 Repository location for resources 部分中,选择 Repository type Git
  7. 输入示例应用程序的 Git 存储库 URL、github Branch 和 Path,在其中创建资源 busybox Pod 和 PVC。

    1. 使用示例应用程序存储库作为 https://github.com/red-hat-storage/ocm-ramen-samples
    2. 选择 Revision 作为 release-4.16
    3. 选择 Path 为 busybox-odr-metro
  8. 输入 Remote namespace 值。(例如 busybox-sample),然后点 Next
  9. 根据您的要求选择 Sync policy 设置,或选择默认选择,然后单击 Next

    您可以选择一个或多个选项。

  10. 在 Label 表达式中,添加一个标签 & lt;name >,其 值设置为受管集群名称
  11. 点击 Next
  12. 检查设置详情并点 Submit

先决条件

  • 确保 Data 策略中引用的两个受管集群都可以访问。如果没有,在两个集群都在线前,应用程序不会受到灾难恢复的影响。

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications
  2. 点应用程序末尾的 Actions 菜单,以查看可用操作的列表。
  3. Manage data policyAssign data policy
  4. 选择 Policy,再单击 Next
  5. 选择 Application resource,然后使用 PVC 标签选择器 为所选应用程序资源选择 PVC 标签

    注意

    您可以为所选应用程序资源选择多个 PVC 标签。

  6. 添加所有应用程序资源后,点 Next
  7. 检查 Policy 配置详情并点 Assign。新分配的 Data 策略显示在 Manage data policy modal 列表视图中。
  8. 验证您可以在 Applications 页面中查看分配的策略详情。

    1. 在 Applications 页面上,进入到 Data policy 列,再单击 策略链接 以展开视图。
    2. 验证您可以看到分配的策略数量以及故障转移和重新定位状态。
  9. 将 DRPolicy 应用到应用程序后,确认 drpc yaml 输出中是否将 ClusterDataProtected 设置为 True

3.11.3. 删除示例应用程序

本节提供有关使用 RHACM 控制台删除示例应用程序 busybox 的说明。

重要

删除 DR 保护应用程序时,需要访问属于 DRPolicy 的两个集群。这是为了确保清理相应 S3 存储中的所有受保护的 API 资源和资源,作为删除 DR 保护的一部分。如果对其中一个集群的访问不健康,在 hub 上删除应用程序的 DRPlacementControl 资源将保持在 Deleting 状态。

先决条件

  • 在故障转移和重新定位测试完成并且应用程序已准备好从 RHACM 和受管集群中删除之前,不应执行这些示例应用程序。

流程

  1. 在 RHACM 控制台上,前往 Applications
  2. 搜索要删除的示例应用程序(例如 busybox)。
  3. 点击您要删除的应用程序旁边的 Action Menu (⋮)
  4. 点击 Delete application

    选择了 Delete application 时,将显示一个新屏幕,询问是否还应删除与应用相关的资源。

  5. 选中 Remove application 相关资源复选框,以删除 Subscription 和 PlacementRule。
  6. 单击 Delete。这将删除主受管集群(或应用程序所运行的任何群集)上的 busybox 应用程序。
  7. 除了使用 RHACM 控制台删除的资源外,如果删除 busybox 应用后没有自动删除,则删除 DRPlacementControl

    1. 登录到 Hub 集群的 OpenShift Web 控制台,再进入到 项目 busybox-sample 的 Installed Operators。

      对于 ApplicationSet 应用程序,将项目选为 openshift-gitops

    2. 单击 OpenShift DR Hub Operator,然后单击 DRPlacementControl 选项卡。
    3. 点击您要删除的 busybox 应用程序 DRPlacementControl 旁边的 Action Menu (⋮)
    4. 单击 Delete DRPlacementControl
    5. 单击 Delete
注意

此过程可用于使用 DRPlacementControl 资源删除任何应用。

当受管集群因任何原因而不可用时,执行故障转移。这个故障转移方法基于应用程序。

先决条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为它可能需要一些时间才能更新。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行故障转移操作前,请检查两个受管集群的状态。

      但是,当您切换到的集群处于 Ready 状态时,故障转移操作仍然可以运行。

流程

  1. Hub 集群上启用隔离。

    1. 打开 CLI 终端并编辑 DRCluster 资源,其中 <drcluster_name> 是您的唯一名称。

      Important

      在隔离了受管集群后,所有 从应用程序到 OpenShift Data Foundation 外部存储集群的通信将失败,一些 Pod 都将处于不健康状态(例如: CreateContainerError,CrashLoopBackOff)现已被隔离的集群。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        ## Add this line
        clusterFence: Fenced
        cidrs:
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 主受管集群验证 Hub 集群上的隔离状态,使用您的唯一标识符替换 <drcluster_name>。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Fenced
      Copy to Clipboard Toggle word wrap
    3. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 现在位于 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      输出示例

      cidr:10.1.161.1:0/32 2028-10-30T22:30:03.585634+0000
      cidr:10.1.161.14:0/32 2028-10-30T22:30:02.483561+0000
      cidr:10.1.161.51:0/32 2028-10-30T22:30:01.272267+0000
      cidr:10.1.161.63:0/32 2028-10-30T22:30:05.099655+0000
      cidr:10.1.161.129:0/32 2028-10-30T22:29:58.335390+0000
      cidr:10.1.161.130:0/32 2028-10-30T22:29:59.861518+0000
      Copy to Clipboard Toggle word wrap
  2. 在 Hub 集群中,进入到 Applications
  3. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  4. Failover application
  5. 在显示了 Failover 应用程序 模态后,选择策略目标集群,相关的应用程序将在出现灾难时故障转移。
  6. 选择订阅组下拉菜单,验证默认选择或修改此设置。

    默认情况下,选择为应用程序资源复制的订阅组。

  7. 检查 Failover readiness 的状态。

    • 如果状态是 Ready 且带有一个绿色勾号,这表示目标集群已就绪,可启动故障转移。继续执行第 7 步。
    • 如果状态是 UnknownNot ready,请等待到状态变为 Ready
  8. Initiate。busybox 应用程序现在故障转移到 Secondary-managed 集群
  9. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  10. 验证活动状态是否为应用的 FailedOver

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,点 View more details 链接。

当受管集群因任何原因而不可用时,执行故障转移。这个故障转移方法基于应用程序。

先决条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为它可能需要一些时间才能更新。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行故障转移操作前,请检查两个受管集群的状态。

      但是,当您切换到的集群处于 Ready 状态时,故障转移操作仍然可以运行。

流程

  1. Hub 集群上启用隔离。

    1. 打开 CLI 终端并编辑 DRCluster 资源,其中 <drcluster_name> 是您的唯一名称。

      Important

      在隔离了受管集群后,所有 从应用程序到 OpenShift Data Foundation 外部存储集群的通信将失败,一些 Pod 都将处于不健康状态(例如: CreateContainerError,CrashLoopBackOff)现已被隔离的集群。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        ## Add this line
        clusterFence: Fenced
        cidrs:
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 主受管集群验证 Hub 集群上的隔离状态,使用您的唯一标识符替换 <drcluster_name>。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Fenced
      Copy to Clipboard Toggle word wrap
    3. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 现在位于 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      输出示例

      cidr:10.1.161.1:0/32 2028-10-30T22:30:03.585634+0000
      cidr:10.1.161.14:0/32 2028-10-30T22:30:02.483561+0000
      cidr:10.1.161.51:0/32 2028-10-30T22:30:01.272267+0000
      cidr:10.1.161.63:0/32 2028-10-30T22:30:05.099655+0000
      cidr:10.1.161.129:0/32 2028-10-30T22:29:58.335390+0000
      cidr:10.1.161.130:0/32 2028-10-30T22:29:59.861518+0000
      Copy to Clipboard Toggle word wrap
  2. 在 Hub 集群中,进入到 Applications
  3. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  4. Failover application
  5. 显示 Failover 应用程序 模态时,验证显示的详细信息是否正确并检查 Failover readiness 的状态。如果状态是 Ready 且带有绿色勾号,这表示目标集群已准备好故障转移启动。
  6. Initiate。busybox 资源现在在目标集群上创建。
  7. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  8. 验证活动状态是否为应用的 FailedOver

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,验证您可以看到一个或多个策略名称以及与应用程序中使用的策略关联的持续活动。

当所有受管集群都可用时,将应用程序重新定位到首选位置。

前提条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为可能需要一些时间来更新。只有在主集群和首选集群启动并运行时才可执行重新定位。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行重新定位操作前,请单独检查两个受管集群的状态。
  • 在取消隔离前,验证应用程序是否已从集群中清理。

流程

  1. 在 Hub 集群中禁用隔离功能。

    1. 编辑此集群的 DRCluster 资源,将 <drcluster_name> 替换为唯一名称。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        cidrs:
        [...]
        ## Modify this line
        clusterFence: Unfenced
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 正常重新引导了 Fenced 的 OpenShift Container Platform 节点。重启后,需要重启来恢复 I/O 操作,以避免进一步恢复编配失败。按照安全重启节点的步骤 ,重新引导集群中的所有节点。

      注意

      先确保所有节点已被封锁和排空,然后再重新引导并在节点上执行 uncordon 操作。

    3. 在所有 OpenShift 节点被重新引导并处于 Ready 状态后,通过在主受管集群中运行此命令(或任何集群是 Unfenced),验证所有 Pod 都处于健康状态。

      oc get pods -A | egrep -v 'Running|Completed'
      Copy to Clipboard Toggle word wrap

      输出示例:

      NAMESPACE                                          NAME                                                              READY   STATUS      RESTARTS       AGE
      Copy to Clipboard Toggle word wrap

      此查询的输出应该为零个 Pod,然后继续下一步。

      重要

      如果因为严重的存储通信导致 pod 仍然处于不健康状态,请在继续操作前进行故障排除并解决。由于存储集群位于 OpenShift 的外部,因此在 OpenShift 应用正常运行的站点中断后,还必须正确恢复它。

      另外,您可以使用 OpenShift Web 控制台仪表板和 Overview 选项卡来评估应用程序和外部 ODF 存储集群的健康状态。详细的 OpenShift Data Foundation 仪表板可通过 Storage → Data Foundation 找到。

    4. 验证 Unfenced 集群是否处于健康状态。为 Primary-managed 集群验证 Hub 集群中的隔离状态,将 <drcluster_name> 替换为唯一名称。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Unfenced
      Copy to Clipboard Toggle word wrap
    5. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 不在 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      确保您没有看到隔离过程中添加的 IP。

  2. 在 Hub 集群中,进入到 Applications
  3. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  4. Relocate application
  5. Relocate application 模态显示时,选择 policytarget cluster,在出现灾难时相关的应用程序将重新定位到其中。
  6. 默认情况下,选择部署应用程序资源的订阅组。点选择订阅组下拉菜单,验证默认选择或修改此设置。
  7. 检查 Relocation readiness 的状态。

    • 如果状态是 Ready 且带有一个绿色勾号,这表示目标集群已准备好重定位来进行启动。继续执行第 7 步。
    • 如果状态是 UnknownNot ready,请等待到状态变为 Ready
  8. Initiate。busybox 资源现在在目标集群上创建。
  9. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  10. 验证应用程序的活动状态是否显示为 Relocated

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,点 View more details 链接。

当所有受管集群都可用时,将应用程序重新定位到首选位置。

前提条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为可能需要一些时间来更新。只有在主集群和首选集群启动并运行时才可执行重新定位。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行重新定位操作前,请单独检查两个受管集群的状态。
  • 在取消隔离前,验证应用程序是否已从集群中清理。

流程

  1. 在 Hub 集群中禁用隔离功能。

    1. 编辑此集群的 DRCluster 资源,将 <drcluster_name> 替换为唯一名称。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        cidrs:
        [...]
        ## Modify this line
        clusterFence: Unfenced
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 正常重新引导了 Fenced 的 OpenShift Container Platform 节点。重启后,需要重启来恢复 I/O 操作,以避免进一步恢复编配失败。按照安全重启节点的步骤 ,重新引导集群中的所有节点。

      注意

      先确保所有节点已被封锁和排空,然后再重新引导并在节点上执行 uncordon 操作。

    3. 在所有 OpenShift 节点被重新引导并处于 Ready 状态后,通过在主受管集群中运行此命令(或任何集群是 Unfenced),验证所有 Pod 都处于健康状态。

      oc get pods -A | egrep -v 'Running|Completed'
      Copy to Clipboard Toggle word wrap

      输出示例:

      NAMESPACE                                          NAME                                                              READY   STATUS      RESTARTS       AGE
      Copy to Clipboard Toggle word wrap

      此查询的输出应该为零个 Pod,然后继续下一步。

      重要

      如果因为严重的存储通信导致 pod 仍然处于不健康状态,请在继续操作前进行故障排除并解决。由于存储集群位于 OpenShift 的外部,因此在 OpenShift 应用正常运行的站点中断后,还必须正确恢复它。

      另外,您可以使用 OpenShift Web 控制台仪表板和 Overview 选项卡来评估应用程序和外部 ODF 存储集群的健康状态。详细的 OpenShift Data Foundation 仪表板可通过 Storage → Data Foundation 找到。

    4. 验证 Unfenced 集群是否处于健康状态。为 Primary-managed 集群验证 Hub 集群中的隔离状态,将 <drcluster_name> 替换为唯一名称。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Unfenced
      Copy to Clipboard Toggle word wrap
    5. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 不在 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      确保您没有看到隔离过程中添加的 IP。

  2. 在 Hub 集群中,进入到 Applications
  3. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  4. Relocate application
  5. Relocate application 模态显示时,选择 policytarget cluster,在出现灾难时相关的应用程序将重新定位到其中。
  6. Initiate。busybox 资源现在在目标集群上创建。
  7. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  8. 验证应用程序的活动状态是否显示为 Relocated

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,验证您可以看到一个或多个策略名称以及与应用程序一起使用的策略关联的重新定位状态。

3.16. 发现应用程序的灾难恢复保护

Red Hat OpenShift Data Foundation 现在为在其中一个受管集群中部署的工作负载提供灾难恢复(DR)保护和支持,而无需使用 Red Hat Advanced Cluster Management (RHACM)。这些工作负载称为发现的应用程序。

使用 RHACM 部署的工作负载现在被称为受管应用程序。当工作负载直接部署到其中一个受管集群上时,不使用 RHACM,则这些工作负载称为发现的应用程序。虽然这些工作负载详情可在 RHACM 控制台中看到,但应用程序生命周期(创建、删除、编辑)不受 RHACM 管理。

本节提供了指导您完成保护发现的应用程序的先决条件的说明。这包括分配数据策略和启动 DR 操作等任务,如故障转移和重新定位。

  1. 确保所有 DR 配置都已安装在主受管集群和次受管集群上。
  2. 安装 OADP 1.4 operator。

    注意

    OADP 1.4 之前的任何版本都不适用于保护发现的应用程序。

    1. PrimarySecondary 受管集群上,进入到 OperatorHub,并使用关键字过滤器搜索 OADP
    2. OADP 标题。
    3. 保留所有默认设置,然后点安装。确保 Operator 资源已安装在 openshift-adp 项目中。
    注意

    如果在 DR 配置完成后安装了 OADP 1.4,则 主受管集群上的 ramen-dr-cluster-operator pod 必须重启命名空间 openshift-dr-system 中的二级受管集群 (删除并重新创建)。

  3. [可选] 将 CACertificates 添加到 ramen-hub-operator-config ConfigMap 中。

    在主集群和次要集群间配置网络(SSL)访问,以便元数据可以使用安全传输协议和 Hub 集群中的安全传输协议存储在 Multicloud Gateway (MCG)对象存储桶中的备用集群中,以验证对对象存储桶的访问。

    注意

    如果所有 OpenShift 集群都为您的环境使用签名的有效证书集进行部署,则可以跳过本节。

    如果您使用自签名证书,则您已在 openshift-config 命名空间中创建一个名为 user-ca-bundleConfigMap,并将此 ConfigMap 添加到默认 Proxy 集群资源中。

    1. 查找 CACertificates 的编码值。

      $ oc get configmap user-ca-bundle -n openshift-config -o jsonpath="{['data']['ca-bundle\.crt']}" |base64 -w 0
      Copy to Clipboard Toggle word wrap
    2. 将此 base64 编码值添加到 Hub 集群上的 configmap ramen-hub-operator-config 中。下面的示例显示了添加 CACertificates 的位置。

      $ oc edit configmap ramen-hub-operator-config -n openshift-operators
      Copy to Clipboard Toggle word wrap
      [...]
          ramenOpsNamespace: openshift-dr-ops
          s3StoreProfiles:
          - s3Bucket: odrbucket-36bceb61c09c
            s3CompatibleEndpoint: https://s3-openshift-storage.apps.hyper3.vmw.ibmfusion.eu
            s3ProfileName: s3profile-hyper3-ocs-storagecluster
            s3Region: noobaa
            s3SecretRef:
              name: 60f2ea6069e168346d5ad0e0b5faa59bb74946f
            caCertificates: {input base64 encoded value here}
          - s3Bucket: odrbucket-36bceb61c09c
            s3CompatibleEndpoint: https://s3-openshift-storage.apps.hyper4.vmw.ibmfusion.eu
            s3ProfileName: s3profile-hyper4-ocs-storagecluster
            s3Region: noobaa
            s3SecretRef:
              name: cc237eba032ad5c422fb939684eb633822d7900
            caCertificates: {input base64 encoded value here}
      Copy to Clipboard Toggle word wrap
  4. 验证 OADP operator 默认命名空间 openshift-adp 是否在 主受管集群和次受管集群 中创建的 DR secret。创建第一个 DRPolicy 时创建的 DR secret 类似于以下的 secret。DR secret 名称前面带有字母 v

    $ oc get secrets -n openshift-adp
    NAME                                       TYPE     DATA   AGE
    v60f2ea6069e168346d5ad0e0b5faa59bb74946f   Opaque   1      3d20h
    vcc237eba032ad5c422fb939684eb633822d7900   Opaque   1      3d20h
    [...]
    Copy to Clipboard Toggle word wrap
    注意

    openshift-adp 命名空间中为每个受管集群创建一个 DR 创建 secret。

  5. 验证 Data Protection Application (DPA)是否已安装到 OADP 命名空间 openshift-adp 的每个受管集群中。如果尚未创建,则按照下一步创建此资源。

    1. 通过将以下 YAML 定义内容复制到 dpa.yaml 来创建 DPA。

      apiVersion: oadp.openshift.io/v1alpha1
      kind: DataProtectionApplication
      metadata:
        labels:
          app.kubernetes.io/component: velero
        name: velero
        namespace: openshift-adp
      spec:
        backupImages: false
        configuration:
          nodeAgent:
            enable: false
            uploaderType: restic
          velero:
            defaultPlugins:
              - openshift
              - aws
            noDefaultBackupLocation: true
      Copy to Clipboard Toggle word wrap
    2. 创建 DPA 资源。

      $ oc create -f dpa.yaml -n openshift-adp
      Copy to Clipboard Toggle word wrap
      dataprotectionapplication.oadp.openshift.io/velero created
      Copy to Clipboard Toggle word wrap
    3. 验证 OADP 资源是否已创建并处于 Running 状态。

      $ oc get pods,dpa -n openshift-adp
      NAME                                                    READY   STATUS    RESTARTS   AGE
      pod/openshift-adp-controller-manager-7b64b74fcd-msjbs   1/1     Running   0          5m30s
      pod/velero-694b5b8f5c-b4kwg                             1/1     Running   0          3m31s
      
      
      NAME                                                 AGE
      dataprotectionapplication.oadp.openshift.io/velero   3m31s
      Copy to Clipboard Toggle word wrap

3.16.2. 创建示例发现的应用程序

为了测试从主 受管集群到二级受管集群的 故障切换,并为发现的应用程序 重新定位,您需要在不使用 RHACM 创建应用程序功能的情况下安装示例应用程序。

流程

  1. 登录 Primary 受管集群,并克隆示例应用程序存储库。

    $ git clone https://github.com/red-hat-storage/ocm-ramen-samples.git
    Copy to Clipboard Toggle word wrap
  2. 验证您是否位于 main 分支中。

    $ cd ~/ocm-ramen-samples
    $ git branch
    * main
    Copy to Clipboard Toggle word wrap

    根据您的场景、满足或地区创建示例应用程序时,应使用正确的目录。

    注意

    发现的应用程序只支持使用 CephRBD 或块卷的应用程序。

    $ ls workloads/deployment | egrep -v 'cephfs|k8s|base'
    odr-metro-rbd
    odr-regional-rbd
    Copy to Clipboard Toggle word wrap
  3. Primary 和 Secondary 受管集群上,创建名为 busybox-discovered 的项目。

    $ oc new-project busybox-discovered
    Copy to Clipboard Toggle word wrap
  4. 在主受管集群 上创建 busybox 应用程序。此示例应用示例是使用块(Ceph RBD)卷的 Metro-DR。

    $ oc apply -k workloads/deployment/odr-metro-rbd -n busybox-discovered
    persistentvolumeclaim/busybox-pvc created
    deployment.apps/busybox created
    Copy to Clipboard Toggle word wrap
    注意

    OpenShift Data Foundation 灾难恢复解决方案现在扩展到跨多个命名空间的发现应用程序。

  5. 验证 busybox 是否在 Primary 受管集群 上的正确项目中运行。

    $ oc get pods,pvc,deployment -n busybox-discovered
    Copy to Clipboard Toggle word wrap
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          18s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 18s
    
    
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/busybox   1/1     1            1           18
    Copy to Clipboard Toggle word wrap

本节介绍了如何从 Protected applications 选项卡中应用现有的 DR 策略到发现的应用程序。

先决条件

  • 确保配置了灾难恢复功能,并且至少有一个 DR 策略。

流程

  1. 在 RHACM 控制台中,导航到 disaster recoveryProtected applications 选项卡。
  2. Enroll application 以开始为 DR 保护配置现有应用程序。
  3. 选择 ACM 发现的应用程序
  4. 在 Namespace 页面中,选择 DR 集群,这是安装 busyboxPrimary 受管集群 的名称。
  5. 选择安装应用程序 的命名空间。例如: busybox-discovered

    注意

    如果您的工作负载分布到多个命名空间中,您可以选择所有这些命名空间进行 DR 保护。

  6. 为发现的应用程序选择一个唯一的 Name,如 busybox-rbd,然后单击 Next
  7. 在 Configuration 页面中,Resource 标签用于 保护资源,您可以在其中设置 kubernetes-object 备份中包含哪些资源,以及要复制哪些卷持久数据。默认选择 资源标签。
  8. 提供标签表达式和 PVC 标签选择器。为 kubernetes-objectsPVC 选择 标签 appname=busybox
  9. 点击 Next
  10. 在 Replication 页面中,选择一个现有的 DR Policykubernetes-objects 备份间隔

    注意

    建议您为 PVC 数据复制和 kubernetes-object 备份间隔(例如 5 分钟)选择相同的持续时间。

  11. 点击 Next
  12. 检查配置并点 Save

    使用 Back 按钮返回到屏幕,以更正所有问题。

  13. 在继续 DR Failover 和 Relocate 测试前,请验证 应用程序卷(PVC)Kubernetes 对象 备份是否具有 Healthy 状态。您可以在 Protected applications 选项卡中查看发现的应用程序的状态。

    1. 要查看 DRPC 的状态,请在 Hub 集群中运行以下命令:

      $ oc get drpc {drpc_name} -o wide -n openshift-dr-ops
      Copy to Clipboard Toggle word wrap

      发现的应用将 DRPlacementControl (DRPC)和放置等资源存储在名为 openshift-dr-ops 的新命名空间中。DRPC 名称可以通过前面的步骤(如 busybox-rbd)中配置的唯一名称来标识。

    2. 要查看发现的应用程序的 VolumeReplicationGroup (VRG)的状态,请在手动安装 busybox 应用程序的受管集群中运行以下命令。

      $ oc get vrg {vrg_name} -n openshift-dr-ops
      Copy to Clipboard Toggle word wrap

      在为发现的应用程序分配 DR Policy 后,VRG 资源存储在命名空间 openshift-dr-ops 中。VRG 名称可以通过前面的步骤(如 busybox-rbd)中配置的唯一名称来标识。

3.16.4. 发现的应用程序故障切换和重新定位

受保护的发现 应用程序可以 故障切换或重新定位 到与 受管应用程序 类似的对等集群。但是,发现的应用程序还有一些额外的步骤,因为 RHACM 不会管理应用程序的生命周期,因为它适用于 Managed 应用程序。

本节指导您为受保护的发现的应用程序完成 Failover 和 Relocate 进程。

重要

当一个或多个资源类型处于 Warning 或 Critical 状态时,永远不会启动 Failover 或 Relocate of an application。

本节介绍了如何故障转移受灾难恢复保护的发现应用程序。

先决条件

  • 确保在两个受管集群中创建了应用程序命名空间(如 busybox-discovered)。

流程

  1. Hub 集群上启用隔离。

    1. 打开 CLI 终端并编辑 DRCluster 资源,其中 <drcluster_name> 是您的唯一名称。

      Important

      在隔离了受管集群后,所有 从应用程序到 OpenShift Data Foundation 外部存储集群的通信将失败,一些 Pod 都将处于不健康状态(例如: CreateContainerError,CrashLoopBackOff)现已被隔离的集群。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        ## Add this line
        clusterFence: Fenced
        cidrs:
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 主受管集群验证 Hub 集群上的隔离状态,使用您的唯一标识符替换 <drcluster_name>。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Fenced
      Copy to Clipboard Toggle word wrap
    3. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 现在位于 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      输出示例

      cidr:10.1.161.1:0/32 2028-10-30T22:30:03.585634+0000
      cidr:10.1.161.14:0/32 2028-10-30T22:30:02.483561+0000
      cidr:10.1.161.51:0/32 2028-10-30T22:30:01.272267+0000
      cidr:10.1.161.63:0/32 2028-10-30T22:30:05.099655+0000
      cidr:10.1.161.129:0/32 2028-10-30T22:29:58.335390+0000
      cidr:10.1.161.130:0/32 2028-10-30T22:29:59.861518+0000
      Copy to Clipboard Toggle word wrap
  2. 在 RHACM 控制台中,导航到 disaster RecoveryProtected applications 选项卡。
  3. 在应用程序行的末尾,单击 Actions 菜单并选择 启动 Failover
  4. 在 Failover 应用程序 modal 窗口中,查看应用程序和目标集群的状态。
  5. Initiate。等待 故障切换 过程完成。
  6. 验证 busybox 应用程序是否在 次受管集群 上运行。

    $ oc get pods,pvc -n busybox-discovered
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          2m46s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 2m57s
    Copy to Clipboard Toggle word wrap
  7. 检查 Failover 的进度状态,直到结果为 WaitOnUserToCleanup。DRPC 名称可以通过前面的步骤中配置的唯一名称(如 busybox-rbd)来标识。

    $ oc get drpc {drpc_name} -n openshift-dr-ops -o jsonpath='{.status.progression}{"\n"}'
    WaitOnUserToCleanUp
    Copy to Clipboard Toggle word wrap
  8. Primary 受管集群中删除 busybox 应用程序, 以完成 Failover 进程。

    1. 导航到 Protected applications 选项卡。您将看到删除应用的消息。
    2. 导航到 busybox 的克隆存储库,并在从中 失败的 Primary 受管集群上 运行以下命令。使用用于创建应用程序的同一目录(如 odr-metro-rbd)。

      $ cd ~/ocm-ramen-samples/
      $ git branch
      * main
      $ oc delete -k workloads/deployment/odr-metro-rbd -n busybox-discovered
      persistentvolumeclaim "busybox-pvc" deleted
      deployment.apps "busybox" deleted
      Copy to Clipboard Toggle word wrap
  9. 删除应用程序后,进入到 Protected applications 选项卡,并验证 busybox 资源是否处于 Healthy 状态。

本节介绍了如何重新定位发现的应用程序,这些应用程序受灾难恢复保护。

流程

  1. 在 Hub 集群中禁用隔离功能。

    1. 编辑此集群的 DRCluster 资源,将 <drcluster_name> 替换为唯一名称。

      $ oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        cidrs:
        [...]
        ## Modify this line
        clusterFence: Unfenced
        [...]
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      drcluster.ramendr.openshift.io/ocp4perf1 edited
      Copy to Clipboard Toggle word wrap
    2. 正常重新引导了 Fenced 的 OpenShift Container Platform 节点。重启后,需要重启来恢复 I/O 操作,以避免进一步恢复编配失败。按照安全重启节点的步骤 ,重新引导集群中的所有节点。

      注意

      先确保所有节点已被封锁和排空,然后再重新引导并在节点上执行 uncordon 操作。

    3. 在所有 OpenShift 节点被重新引导并处于 Ready 状态后,通过在主受管集群中运行此命令(或任何集群是 Unfenced),验证所有 Pod 都处于健康状态。

      oc get pods -A | egrep -v 'Running|Completed'
      Copy to Clipboard Toggle word wrap

      输出示例:

      NAMESPACE                                          NAME                                                              READY   STATUS      RESTARTS       AGE
      Copy to Clipboard Toggle word wrap

      此查询的输出应该为零个 Pod,然后继续下一步。

      重要

      如果因为严重的存储通信导致 pod 仍然处于不健康状态,请在继续操作前进行故障排除并解决。由于存储集群位于 OpenShift 的外部,因此在 OpenShift 应用正常运行的站点中断后,还必须正确恢复它。

      另外,您可以使用 OpenShift Web 控制台仪表板和 Overview 选项卡来评估应用程序和外部 ODF 存储集群的健康状态。详细的 OpenShift Data Foundation 仪表板可通过 Storage → Data Foundation 找到。

    4. 验证 Unfenced 集群是否处于健康状态。为 Primary-managed 集群验证 Hub 集群中的隔离状态,将 <drcluster_name> 替换为唯一名称。

      $ oc get drcluster.ramendr.openshift.io <drcluster_name> -o jsonpath='{.status.phase}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Unfenced
      Copy to Clipboard Toggle word wrap
    5. 登录您的 Ceph 集群,并验证属于 OpenShift Container Platform 集群节点的 IP 不在 blocklist 中。

      $ ceph osd blocklist ls
      Copy to Clipboard Toggle word wrap

      确保您没有看到隔离过程中添加的 IP。

  2. 在 RHACM 控制台中,导航到 disaster RecoveryProtected applications 选项卡。
  3. 在应用程序行的末尾,单击 Actions 菜单,然后选择 启动 Relocate
  4. 在 Relocate application modal 窗口中,查看应用程序和目标集群的状态。
  5. Initiate
  6. 检查 Relocate 的进度状态,直到结果为 WaitOnUserToCleanup。DRPC 名称可以通过前面的步骤中配置的唯一名称(如 busybox-rbd)来标识。

    $ oc get drpc {drpc_name} -n openshift-dr-ops -o jsonpath='{.status.progression}{"\n"}'
    WaitOnUserToCleanUp
    Copy to Clipboard Toggle word wrap
  7. Relocate to the Primary managed cluster 之前,从 Secondary 受管集群中删除 busybox 应用程序。

    导航到 busybox 的克隆存储库,并在从其 重新定位Secondary 受管集群上 运行以下命令。使用用于创建应用程序的同一目录(如 odr-metro-rbd)。

    $ cd ~/ocm-ramen-samples/
    $ git branch
    * main
    $ oc delete -k workloads/deployment/odr-metro-rbd -n busybox-discovered
    persistentvolumeclaim "busybox-pvc" deleted
    deployment.apps "busybox" deleted
    Copy to Clipboard Toggle word wrap
  8. 删除应用程序后,进入到 Protected applications 选项卡,并验证 busybox 资源是否处于 Healthy 状态。
  9. 验证 busybox 应用程序是否 在主受管集群 上运行。

    $ oc get pods,pvc -n busybox-discovered
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          2m46s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 2m57s
    Copy to Clipboard Toggle word wrap

3.16.5. 为受保护的应用程序禁用灾难恢复

本节指导您在删除受保护的应用程序或应用程序不再需要保护时禁用灾难恢复资源。

流程

  1. 登录到 Hub 集群。
  2. 列出 DRPlacementControl (DRPC)资源。每个 DRPC 资源都是在应用程序分配 DR 策略时创建的。

    $ oc get drpc -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  3. 找到包含您在分配 DR 策略(如 busybox-rbd)时选择的唯一标识符的 DRPC,并删除 DRPC。

    $ oc delete {drpc_name} -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  4. 列出 放置资源。每个放置资源都是在应用程序分配 DR 策略时创建的。

    $ oc get placements -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  5. 找到名称 放置,其中包含您在分配 DR 策略时选择的唯一标识符(如 busybox-rbd-placement-1)并删除 放置

    $ oc delete placements {placement_name} -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap

3.17. 使用 Metro-DR 恢复到替换集群

当主集群有故障时,您可以获得修复的选项,等待现有集群恢复,或者如果集群不可行,请完全替换集群。此解决方案指导您在将故障的主集群替换为新集群,并为这个新集群启用故障恢复(分配)。

在这些说明中,我们假定在安装和保护应用程序后必须替换 RHACM 受管集群。对于本节,RHACM 受管集群是 替换集群,而未替换的集群是 存活的集群,新集群是 恢复集群

注意

目前不支持为发现的应用程序替换集群恢复。仅支持受管应用程序。

前提条件

  • 确保 Metro-DR 环境已配置了使用红帽 Advance Cluster Management (RHACM)安装的应用程序。
  • 确保为应用程序分配保护它们不受集群故障的数据策略。

流程

  1. Hub 集群中 执行以下步骤:

    1. 使用 CLI 终端编辑 DRCluster 资源来隔离替换集群,其中 < drcluster_name&gt; 是替换集群名称。

      oc edit drcluster <drcluster_name>
      Copy to Clipboard Toggle word wrap
      apiVersion: ramendr.openshift.io/v1alpha1
      kind: DRCluster
      metadata:
      [...]
      spec:
        ## Add or modify this line
        clusterFence: Fenced
        cidrs:
        [...]
      [...]
      Copy to Clipboard Toggle word wrap
    2. 使用 RHACM 控制台,进入到 Applications,并将受保护的所有应用程序从失败集群切换到 surviving 集群。
    3. 验证并确保所有受保护的应用程序现在都在存活的集群中运行。

      注意

      每个应用程序 DRPlacementControl 的 PROGRESSION 状态将显示为 Cleaning Up。如果替换集群离线或停机,则这是预期的。

  2. 取消保护替换集群。

    使用 CLI 终端编辑 DRCluster 资源,其中 < drcluster_name& gt; 是替换集群名称。

    $ oc edit drcluster <drcluster_name>
    Copy to Clipboard Toggle word wrap
    apiVersion: ramendr.openshift.io/v1alpha1
    kind: DRCluster
    metadata:
    [...]
    spec:
      ## Modify this line
      clusterFence: Unfenced
      cidrs:
      [...]
    [...]
    Copy to Clipboard Toggle word wrap
  3. 删除替换集群的 DRCluster。

    $ oc delete drcluster <drcluster_name> --wait=false
    Copy to Clipboard Toggle word wrap
    注意

    使用 --wait=false,因为 DRCluster 在稍后的步骤之前不会删除。

  4. Hub 集群上为存活的集群的 每个受保护的应用程序禁用灾难恢复。

    1. 对于每个应用程序,编辑放置并确保选择了 surviving 集群。

      注意

      对于基于 Subscription 的应用程序,相关的放置可以在 hub 集群上的同一命名空间中找到,类似于受管集群。对于基于 ApplicationSets 的应用程序,相关的放置可以在 hub 集群上的 openshift-gitops 命名空间中找到。

      $ oc edit placement <placement_name> -n <namespace>
      Copy to Clipboard Toggle word wrap
      apiVersion: cluster.open-cluster-management.io/v1beta1
      kind: Placement
      metadata:
      annotations:
        cluster.open-cluster-management.io/experimental-scheduling-disable: "true"
      [...]
      spec:
      clusterSets:
      - submariner
      predicates:
      - requiredClusterSelector:
          claimSelector: {}
          labelSelector:
            matchExpressions:
            - key: name
              operator: In
              values:
              - cluster1  <-- Modify to be surviving cluster name
      [...]
      Copy to Clipboard Toggle word wrap
    2. 在每个受保护的应用程序的 VolumeReplicationGroup 上运行以下命令来验证为替换集群删除了 s3Profile

      $ oc get vrg -n <application_namespace> -o jsonpath='{.items[0].spec.s3Profiles}' | jq
      Copy to Clipboard Toggle word wrap
    3. 在将受保护的应用程序 放置资源 配置为使用 surviving 集群并替换集群 s3Profile (从受保护的应用程序中删除)后,所有 DRPlacementControl 资源都必须从 Hub 集群中删除

      $ oc delete drpc <drpc_name> -n <namespace>
      Copy to Clipboard Toggle word wrap
      注意

      对于基于 Subscription 的应用程序,关联的 DRPlacementControl 可以与 hub 集群上的受管集群位于同一个命名空间中。对于基于 ApplicationSets 的应用程序,关联的 DRPlacementControl 可以在 hub 集群上的 openshift-gitops 命名空间中找到。

    4. 在继续下一步之前,验证所有 DRPlacementControl 资源是否都已被删除。此命令是所有命名空间的查询。不应找到任何资源。

      $ oc get drpc -A
      Copy to Clipboard Toggle word wrap
    5. 最后一步是编辑每个应用程序的 放置 并删除注解 cluster.open-cluster-management.io/experimental-scheduling-disable: "true "。

      $ oc edit placement <placement_name> -n <namespace>
      Copy to Clipboard Toggle word wrap
      apiVersion: cluster.open-cluster-management.io/v1beta1
      kind: Placement
      metadata:
      annotations:
        ## Remove this annotation
        cluster.open-cluster-management.io/experimental-scheduling-disable: "true"
      [...]
      Copy to Clipboard Toggle word wrap
  5. 对存活的集群中每个受保护的应用程序重复最后一步中详述的流程。为受保护的应用程序禁用 DR 现已完成。
  6. 在 Hub 集群中,运行以下脚本从 存活 集群和 hub 集群中删除所有灾难恢复配置。

    #!/bin/bash
    secrets=$(oc get secrets -n openshift-operators | grep Opaque | cut -d" " -f1)
    echo $secrets
    for secret in $secrets
    do
        oc patch -n openshift-operators secret/$secret -p '{"metadata":{"finalizers":null}}' --type=merge
    done
    mirrorpeers=$(oc get mirrorpeer -o name)
    echo $mirrorpeers
    for mp in $mirrorpeers
    do
        oc patch $mp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $mp
    done
    drpolicies=$(oc get drpolicy -o name)
    echo $drpolicies
    for drp in $drpolicies
    do
        oc patch $drp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $drp
    done
    drclusters=$(oc get drcluster -o name)
    echo $drclusters
    for drp in $drclusters
    do
        oc patch $drp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $drp
    done
    oc delete project openshift-operators
    managedclusters=$(oc get managedclusters -o name | cut -d"/" -f2)
    echo $managedclusters
    for mc in $managedclusters
    do
        secrets=$(oc get secrets -n $mc | grep multicluster.odf.openshift.io/secret-type | cut -d" " -f1)
        echo $secrets
        for secret in $secrets
        do
            set -x
            oc patch -n $mc secret/$secret -p '{"metadata":{"finalizers":null}}' --type=merge
            oc delete -n $mc secret/$secret
        done
    done
    
    oc delete clusterrolebinding spoke-clusterrole-bindings
    Copy to Clipboard Toggle word wrap
    注意

    此脚本使用 oc delete project openshift-operators 命令删除 hub 集群上的此命名空间中的灾难恢复(DR)操作器。如果此命名空间中还有其他非DR Operator,则必须从 OperatorHub 重新安装它们。

  7. 在命名空间 openshift-operators 再次自动创建后,添加监控标签以收集灾难恢复指标。

    $ oc label namespace openshift-operators openshift.io/cluster-monitoring='true'
    Copy to Clipboard Toggle word wrap
  8. 在 surviving 集群中,确保 DR 安装过程中创建的对象存储桶已被删除。如果没有通过脚本删除对象存储桶,请删除它。用于 DR 的对象存储桶的名称以 odrbucket 开头。

    $ oc get obc -n openshift-storage
    Copy to Clipboard Toggle word wrap
  9. 在 RHACM 控制台中,导航到 InfrastructureClusters 视图

    1. 分离替换集群。
    2. 创建新的 OpenShift 集群(恢复集群),并将新集群导入到 RHACM 控制台。具体步骤请参阅创建集群和将目标受管集群 导入到 hub 集群
  10. 在恢复集群中安装 OpenShift Data Foundation 操作器,并将它连接到与存活集群相同的外部 Ceph 存储系统。具体步骤请参考 以外部模式部署 OpenShift Data Foundation

    注意

    确保 OpenShift Data Foundation 版本为 4.15 (或更高),且相同的 OpenShift Data Foundation 版本位于存活的集群中。

  11. 在 hub 集群中,从 OperatorHub 安装 ODF Multicluster Orchestrator operator。具体步骤请参阅有关安装 OpenShift Data Foundation Multicluster Orchestrator operator 的章节。
  12. 使用 RHACM 控制台,进入到 Data ServicesData policies

    1. 选择 Create DRPolicy 并命名您的策略。
    2. 选择 恢复集群 和存存 集群
    3. 创建策略。具体步骤,请参阅在 Hub 集群上创建灾难恢复策略

    只有在 DRPolicy 的状态更改为 Validated 时才会进入下一步。

  13. 将 DRPolicy 应用到在替换集群失败前最初保护的集群中的应用程序。
  14. 将 Surviving 集群中的新受保护的应用程序重新定位回新的恢复(主)集群。使用 RHACM 控制台,进入到 Applications 菜单来执行重新定位。

当您的设置有主动和被动 Red Hat Advanced Cluster Management for Kubernetes (RHACM) hub 集群,如果活跃 hub 停机,您可以使用被动 hub 故障转移或重新定位灾难恢复受保护的工作负载。

重要

Metro-DR 的 hub 恢复是一个技术预览功能,受技术预览支持限制。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

如需更多信息,请参阅技术预览功能支持范围

3.18.1. 配置被动 hub 集群

要在活跃 hub 停机或无法访问的情况下执行 hub 恢复,请按照本节中的步骤配置被动 hub 集群,然后故障转移或重新定位灾难恢复受保护的工作负载。

流程

  1. 确保在被动 hub 集群上安装了 RHACM operator 和 MultiClusterHub。具体步骤请查看 RHACM 安装指南

    成功安装 Operator 后,用户界面中会显示一个带有 Web 控制台更新可用消息的弹出窗口。点此弹出窗口中的 Refresh Web 控制台来反映控制台更改。

  2. 在 hub 恢复前,配置备份和恢复。请参阅 RHACM 业务连续性 指南的 备份和恢复 主题。
  3. 在恢复前,在被动 RHACM hub 上安装多集群编配器(MCO) Operator 和 Red Hat OpenShift GitOps operator。有关恢复 RHACM hub 的说明,请参阅安装 OpenShift Data Foundation Multicluster Orchestrator operator
  4. 确保 Restore.cluster.open-cluster-management.io 资源将 .spec.cleanupBeforeRestore 设置为 None。详情请参阅在 检查 RHACM 文档的备份时恢复被动资源
  5. 如果在设置过程中手动配置了跨集群的 SSL 访问,请在集群间重新配置 SSL 访问。具体步骤请参阅 在集群间配置 SSL 访问 部分。
  6. 在被动 hub 上,为 openshift-operators 命名空间添加标签,以便使用以下命令启用 VolumeSyncronizationDelay 警报的基本监控。如需警报详情,请参阅 灾难恢复警报 章节。

    $ oc label namespace openshift-operators openshift.io/cluster-monitoring='true'
    Copy to Clipboard Toggle word wrap

3.18.2. 切换到被动 hub 集群

当活跃 hub 停机或无法访问时,请使用这个步骤。

流程

  1. 在恢复过程中,为了避免正确重新生成 ManifestWorks 时资源驱除,您可以放大 AppliedManifestWork 驱除 宽限期。在被动 hub 集群中,检查现有的全局 KlusterletConfig

    • 如果存在全局 KlusterletConfig,则编辑 appliedManifestWorkEvictionGracePeriod 参数的值。例如,24 小时或更多。
    • 如果全局 KlusterletConfig 不存在,则使用以下 yaml 创建 Klusterletconfig

      apiVersion: config.open-cluster-management.io/v1alpha1
      kind: KlusterletConfig
      metadata:
        name: global
      spec:
        appliedManifestWorkEvictionGracePeriod: "24h"
      Copy to Clipboard Toggle word wrap

      配置将自动传播到所有受管集群。

  2. 恢复被动 hub 集群上的备份。如需更多信息,请参阅 从备份中恢复 hub 集群

    重要

    将失败的 hub 恢复到其被动实例只会将应用程序及其 DR 保护状态恢复到其最后一个调度的备份。在最后一次调度的备份后任何受 DR 保护的应用程序都需要在新 hub 上再次保护。

  3. 验证恢复是否已完成。

    $ oc -n <restore-namespace> wait restore <restore-name> --for=jsonpath='{.status.phase}'=Finished --timeout=120s
    Copy to Clipboard Toggle word wrap
  4. 验证 Primary 和 Secondary 受管集群是否已成功导入到 RHACM 控制台,并可以访问它们。如果有任何受管集群停机或无法访问,则无法成功导入。
  5. 等待 DRPolicy 验证成功。
  6. 验证 DRPolicy 是否已成功创建。对创建的每个 DRPolicy 资源在 Hub 集群中 运行此命令,其中 < drpolicy_name& gt; 替换为唯一名称。

    $ oc get drpolicy <drpolicy_name> -o jsonpath='{.status.conditions[].reason}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    Succeeded
    Copy to Clipboard Toggle word wrap
  7. 刷新 RHACM 控制台,以便在 Active hub 集群上启用了 DR 监控仪表板标签页。
  8. 在新 hub 集群中使用以下命令验证 DRPC 输出:

    $ oc get drpc -A -o wide
    Copy to Clipboard Toggle word wrap

    如果 PROGRESSION 显示 PAUSED 状态,则需要管理干预才能取消暂停它。PROGRESSION 在以下条件下进入 PAUSED 状态:

    • Cluster Query Failure: 在 DRPC 协调过程中成功查询任何集群。在 hub 恢复过程中可能会出现这种情况。
    • action Mismatch: DRPC 操作与查询的 VRG 操作不同。
    • Cluster Mismatch: DRPC 操作和 VRG 操作相同,但 Primary VRG 存在于与 DRPC 所期望的不同集群中。

      重要

      如果您无法诊断并解决暂停的原因,请联系红帽客户支持

      如果 PROGRESSION 处于 CompletedCleaning up,则可以安全地继续。

  9. 编辑新 hub 上的全局 KlusterletConfig,并删除 appliedManifestWorkEvictionGracePeriod 及其值的参数。
  10. 根据活跃 hub 集群还是活跃 hub 集群以及主受管集群是否已停机,根据您的场景按照以下步骤操作:

    1. 如果只有活跃的 hub 集群停机,且受管集群仍然可以访问,则不需要进一步的操作。
    2. 如果主受管集群与活跃 hub 集群一起停机,则需要将工作负载从主受管集群切换到二级受管集群。

      有关故障转移说明,根据您的工作负载类型,请参阅 基于订阅的应用程序或基于 ApplicationSet 的应用程序

  11. 验证故障转移是否成功。如果主受管集群也停机,则工作负载的 PROGRESSION 状态将处于 Cleaning Up 阶段,直到主受管集群恢复在线并成功导入到 RHACM 控制台。

    在被动 hub 集群中,运行以下命令来检查 PROGRESSION 状态。

    $ oc get drpc -o wide -A
    Copy to Clipboard Toggle word wrap

本指南详细介绍了区域灾难恢复(Regional-DR)步骤和命令,将应用程序从一个 OpenShift Container Platform 集群切换到另一个集群,然后将同一应用程序恢复到原始集群。在这种情况下,将使用 Red Hat Advanced Cluster Management (RHACM)创建或导入 OpenShift Container Platform 集群。

虽然 Regional-DR 解决方案基于同步数据复制构建,因此可能会存在潜在的数据丢失,但可以防止大量失败。

这是在由距离分开的两个不同 OpenShift Container Platform 集群中使用 OpenShift Data Foundation 和 RHACM 配置和执行 OpenShift 灾难恢复(ODR)功能所需的 Regional-DR 步骤的一般概述。除了这两个被称为受管集群的集群外,还需要第三个 OpenShift Container Platform 集群,它将是 Red Hat Advanced Cluster Management (RHACM) hub 集群。

重要

现在,您可以使用 OpenShift Data Foundation 为工作负载轻松设置区域灾难恢复解决方案。如需更多信息,请参阅知识库文章

4.1. 区域 DR 解决方案的组件

Region-DR 由 Red Hat Advanced Cluster Management for Kubernetes 和 OpenShift Data Foundation 组件组成,以便在 Red Hat OpenShift Container Platform 集群中提供应用程序和数据移动性。

Red Hat Advanced Cluster Management for Kubernetes

Red Hat Advanced Cluster Management (RHACM)提供了管理多个集群和应用程序生命周期的功能。因此,它充当多集群环境中的控制平面。

RHACM 分为两个部分:

  • RHACM Hub:在多集群 control plane 上运行的组件。
  • 受管集群:在受管理的集群中运行的组件。

有关此产品的更多信息,请参阅 RHACM 文档RHACM"管理应用程序"文档

OpenShift Data Foundation

OpenShift Data Foundation 为 OpenShift Container Platform 集群中有状态应用程序提供部署和管理存储的功能。

OpenShift Data Foundation 由 Ceph 作为存储提供商提供支持,其生命周期由 OpenShift Data Foundation 组件堆栈中的 Rook 进行管理。Ceph-CSI 为有状态应用提供持久卷的调配与管理。

OpenShift Data Foundation 堆栈现在增强了以下灾难恢复功能:

  • 启用 RBD 块池,以便在 OpenShift Data Foundation 实例(集群)之间进行镜像。
  • 可以在一个 RBD 块池中 mirror 特定的镜像
  • 提供 csi-addons 以管理每个持久性卷声明(PVC)镜像

OpenShift DR

OpenShift DR 是跨一组使用 RHACM 部署和管理的有状态应用程序的灾难恢复编排器,并提供云原生接口来编排应用程序状态在持久性卷上的生命周期。它们是:

  • 保护跨 OpenShift 集群的应用程序及其状态关系
  • 将一个应用程序及其状态转移到一个对等集群
  • 将一个应用程序及其状态重新定位到之前部署的集群

OpenShift DR 被分成三个组件:

  • ODF Multicluster Orchestrator: 安装在多集群控制平面 (RHACM Hub) 中,它会编配配置并针对 Metro 和 Regional D 关系对等 OpenShift Data Foundation 集群
  • OpenShift DR Hub Operator:在 hub 集群上作为 ODF 多集群安装的一部分自动安装,以编配启用 DR 应用程序的故障转移或重新定位。
  • OpenShift DR Cluster Operator:在属于 Metro 和 Regional DR relationship的每个受管集群中自动安装,用于管理应用程序的所有 PVC 的生命周期。

4.2. 区域DR 部署工作流

本节概述了在两个不同的 OpenShift Container Platform 集群中使用最新版本的 Red Hat OpenShift Data Foundation 配置和部署 Regional-DR 功能所需的步骤。除了两个受管集群外,还需要第三个 OpenShift Container Platform 集群来部署 Red Hat Advanced Cluster Management (RHACM)。

要配置基础架构,请按照给定的顺序执行以下步骤:

  1. 确保满足作为 DR 解决方案的三个集群(Hub、Primary 和 Secondary Openshift Container Platform)集群的要求。请参阅启用区域DR 的要求
  2. 安装 OpenShift Data Foundation operator,并在 Primary 和 Secondary 受管集群上创建存储系统。请参阅 在受管集群中创建 OpenShift Data Foundation 集群
  3. 在 Hub 集群上安装 ODF Multicluster Orchestrator。请参阅在 Hub 集群上安装 ODF 多集群编排器
  4. 配置 Hub、Primary 和 Secondary 集群之间的 SSL 访问。请参阅配置跨集群的 SSL 访问
  5. 创建 DRPolicy 资源,以用于在跨 Primary 和 Secondary 应用程序所需的 DR 保护的应用程序。请参阅在 Hub 集群上创建灾难恢复策略

    注意

    可以有多个策略。

  6. 测试您的灾难恢复解决方案:

    1. 基于订阅的应用程序

    2. 基于 ApplicationSet 的应用程序:

    3. 发现的应用程序

4.3. 启用区域DR 的要求

安装 Red Hat OpenShift Data Foundation 支持的灾难恢复解决方案的先决条件如下:

  • 您必须有三个在它们之间具有网络可访问性的 OpenShift 集群:

    • 安装 Red Hat Advanced Cluster Management (RHACM) for Kubernetes operator 的 hub 集群
    • 运行 OpenShift Data Foundation 的主受管集群
    • 运行 OpenShift Data Foundation 的从受管集群
    注意

    要配置 hub 恢复设置,您需要一个 4 个集群,它充当被动 hub。主受管集群(Site-1)可以与活跃的 RHACM hub 集群共存,而被动 hub 集群与二级受管集群(Site-2)在一起。或者,活跃的 RHACM hub 集群可以放在中立站点(Site-3)中,不受 Site-1 主受管集群或 Site-2 次要集群的故障的影响。在这种情况下,如果使用被动 hub 集群,它可以放在 Site-2 的次要集群。如需更多信息,请参阅为 hub 恢复配置被动 hub 集群

  • 确保在 Hub 集群中安装 RHACM 操作符和 MultiClusterHub。具体步骤请查看 RHACM 安装指南

    成功安装 Operator 后,用户界面中会显示一个带有 Web 控制台更新可用消息的弹出窗口。点此弹出窗口中的 Refresh Web 控制台来反映控制台更改。

重要

确保正确配置了应用程序流量路由和重定向。

  • 在 Hub 集群中

    • 进入到 All ClustersInfrastructureClusters
    • 使用 RHACM 控制台导入或创建主受管集群次受管集群
    • 为您的环境选择适当的选项。

    具体步骤请参阅创建集群和将目标受管集群 导入到 hub 集群

  • 使用 RHACM Submariner 附加组件连接私有 OpenShift 集群和服务网络。验证两个集群是否没有重叠的服务和集群专用网络。否则,请确保在 Submariner 附加组件安装过程中启用了 Globalnet。

    为每个受管集群运行以下命令,以确定是否需要启用 Globalnet。此处显示的示例用于非重叠的集群和服务网络,因此不会启用 Globalnet。

    $ oc get networks.config.openshift.io cluster -o json | jq .spec
    Copy to Clipboard Toggle word wrap

    Primary 集群的示例输出:

    {
      "clusterNetwork": [
        {
          "cidr": "10.5.0.0/16",
          "hostPrefix": 23
        }
      ],
      "externalIP": {
        "policy": {}
      },
      "networkType": "OVNKubernetes",
      "serviceNetwork": [
        "10.15.0.0/16"
      ]
    }
    Copy to Clipboard Toggle word wrap

    Secondary 集群的输出示例:

    {
      "clusterNetwork": [
        {
          "cidr": "10.6.0.0/16",
          "hostPrefix": 23
        }
      ],
      "externalIP": {
        "policy": {}
      },
      "networkType": "OVNKubernetes",
      "serviceNetwork": [
        "10.16.0.0/16"
      ]
    }
    Copy to Clipboard Toggle word wrap

    如需更多信息,请参阅 Submariner 文档

要在两个 OpenShift Container Platform 集群间配置存储复制,请在安装 OpenShift Data Foundation Operator 后创建一个 OpenShift Data Foundation 存储系统。

注意

请参阅 OpenShift Data Foundation 部署指南和特定于基础架构的说明(如 AWS、VMware、BM、Azure 等)。

流程

  1. 在每个受管集群中,安装和配置最新的 OpenShift Data Foundation 集群。

    如需有关 OpenShift Data Foundation 部署的信息,请参阅基础架构特定的部署指南 (如 AWS、VMware、Bare metal、Azure)。

    注意

    在创建存储集群时,在 数据保护 步骤中,您必须选择 Prepare cluster for disaster recovery (Regional-DR only) 复选框。

  2. 使用以下命令验证每个受管集群中 OpenShift Data Foundation 部署是否成功:

    $ oc get storagecluster -n openshift-storage ocs-storagecluster -o jsonpath='{.status.phase}{"\n"}'
    Copy to Clipboard Toggle word wrap

    对于 Multicloud 网关(MCG):

    $ oc get noobaa -n openshift-storage noobaa -o jsonpath='{.status.phase}{"\n"}'
    Copy to Clipboard Toggle word wrap

    如果状态结果是 Ready,用于主受管集群二级受管集群上的查询,则继续执行下一步。

  3. 在 OpenShift Web 控制台中,进入到 Installed Operators → OpenShift Data Foundation → Storage System → ocs-storagecluster-storagesystem → Resources,并验证 StorageClusterStatus 是否为 Ready,并在其旁边有一个绿色勾号标记。
  4. [可选] 如果在安装 Submariner 时启用了 Globalnet,然后在 OpenShift Data Foundation 安装完成后编辑 StorageCluster

    对于 Globalnet 网络,手动编辑 StorageCluster yaml 以添加 clusterID 并将 enabled 设置为 true。将 <clustername> 替换为您的 RHACM 导入或新创建的受管集群名称。在主受管集群和次受管集群中编辑 StorageCluster

    警告

    不要在 StorageCluster 中进行这个更改,除非您在安装 Submariner 时启用了 Globalnet。

    $ oc edit storagecluster -o yaml -n openshift-storage
    Copy to Clipboard Toggle word wrap
    spec:
      network:
        multiClusterService:
          clusterID: <clustername>
          enabled: true
    Copy to Clipboard Toggle word wrap
  5. 进行上述更改后,

    1. 等待 OSD pod 重启,并且创建 OSD 服务。
    2. 等待所有 MONS 故障转移。
    3. 确保已导出 MONS 和 OSD 服务。

      $ oc get serviceexport -n openshift-storage
      Copy to Clipboard Toggle word wrap
      NAME              AGE
      rook-ceph-mon-d   4d14h
      rook-ceph-mon-e   4d14h
      rook-ceph-mon-f   4d14h
      rook-ceph-osd-0   4d14h
      rook-ceph-osd-1   4d14h
      rook-ceph-osd-2   4d14h
      Copy to Clipboard Toggle word wrap
    4. 确保集群处于 Ready 状态,集群健康状态有一个绿色勾号表示 Health ok。使用第 3 步进行验证。

OpenShift Data Foundation Multicluster Orchestrator 是一个控制器,从 Hub 集群上的 OpenShift Container Platform OperatorHub 安装。

流程

  1. Hub 集群中,进入到 OperatorHub 并使用关键字过滤器搜索 ODF Multicluster Orchestrator
  2. ODF Multicluster Orchestrator 标题。
  3. 保留所有默认设置,然后点安装

    确保 operator 资源安装在 openshift-operators 中,并可用于所有命名空间。

    注意

    ODF Multicluster Orchestrator 还会在 RHACM hub 集群上作为依赖项安装 Openshift DR Hub Operator

  4. 验证 Operator Pod 处于 Running 状态。OpenShift DR Hub operator 也安装在 openshift-operators 命名空间中。

    $ oc get pods -n openshift-operators
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                                        READY   STATUS       RESTARTS    AGE
    odf-multicluster-console-6845b795b9-blxrn   1/1     Running      0           4d20h
    odfmo-controller-manager-f9d9dfb59-jbrsd    1/1     Running      0           4d20h
    ramen-hub-operator-6fb887f885-fss4w         2/2     Running      0           4d20h
    Copy to Clipboard Toggle word wrap

4.6. 在集群间配置 SSL 访问

primary 和 secondary 集群间配置网络 SSL 访问,因此元数据可以以一个安全的方式保持在不同的集群中的 Multicloud Gateway (MCG) 对象存储桶,以及保持在 Hub 集群中验证对对象存储桶的访问。

注意

如果所有 OpenShift 集群都为您的环境使用签名的有效证书集进行部署,则可以跳过本节。

步骤

  1. 提取主受管集群的入口证书,并将输出保存到 primary.crt

    $ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > primary.crt
    Copy to Clipboard Toggle word wrap
  2. 提取二级受管集群的入口证书,并将输出保存到 secondary.crt

    $ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > secondary.crt
    Copy to Clipboard Toggle word wrap
  3. 创建新的 ConfigMap 文件,以使用文件名 cm-clusters-crt.yaml 来保存远程集群的证书捆绑包。

    注意

    如本示例文件所示,每个集群可能有超过三个证书。另外,请确保在从之前创建的 primary.crtsecondary.crt 文件中复制并粘贴后,证书内容会被正确缩进。

    apiVersion: v1
    data:
      ca-bundle.crt: |
        -----BEGIN CERTIFICATE-----
        <copy contents of cert1 from primary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert2 from primary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert3 primary.crt here>
        -----END CERTIFICATE----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert1 from secondary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert2 from secondary.crt here>
        -----END CERTIFICATE-----
    
        -----BEGIN CERTIFICATE-----
        <copy contents of cert3 from secondary.crt here>
        -----END CERTIFICATE-----
    kind: ConfigMap
    metadata:
      name: user-ca-bundle
      namespace: openshift-config
    Copy to Clipboard Toggle word wrap
  4. Primary 受管集群, Secondary 受管集群, 和 Hub 集群 中创建 ConfigMap

    $ oc create -f cm-clusters-crt.yaml
    Copy to Clipboard Toggle word wrap

    输出示例:

    configmap/user-ca-bundle created
    Copy to Clipboard Toggle word wrap
  5. 主受管集群二级受管集群Hub 集群上的默认代理资源进行补丁。

    $ oc patch proxy cluster --type=merge  --patch='{"spec":{"trustedCA":{"name":"user-ca-bundle"}}}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    proxy.config.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

4.7. 在 Hub 集群上创建灾难恢复策略

OpenShift 灾难恢复策略(DRPolicy)资源指定参与灾难恢复解决方案和所需的复制间隔的 OpenShift Container Platform 集群。DRPolicy 是一个集群范围的资源,用户可以应用到需要灾难恢复解决方案的应用程序。

ODF MultiCluster Orchestrator Operator 通过 Multicluster Web console 促进每个 DRPolicy 和相应的 DRClusters 的创建。

先决条件

  • 确保至少一组两个受管集群。

流程

  1. OpenShift 控制台中,导航到 All ClustersData Servicesdisaster recovery
  2. 在 Overview 选项卡中,点 Create a disaster recovery policy 或 navigate to Policies 标签页,点 Create DRPolicy
  3. 输入 Policy name。确保每个 DRPolicy 都有一个唯一名称(例如: ocp4bos1-ocp4bos2-5m)。
  4. 从与此新策略关联的受管集群列表中选择两个集群。

    注意

    如果在选择集群后收到 "OSD not migrated" 错误信息,那么请在继续执行下一步前,按照知识库文章 从现有 OSD 迁移到 OpenShift Data Foundation for Regional-DR 集群中的优化 OSD

  5. 复制策略根据所选的 OpenShift 集群自动设置为 Asynchronous(async),一个 Sync schedule 选项变为可用。
  6. 设置同步调度

    重要

    对于每个需要的复制间隔,必须使用唯一名称(如 ocp4bos1-ocp4bos2-10m)创建新的 DRPolicy。可以选择同一集群,但 Sync 调度 可以用分钟/小时/天内使用不同的复制间隔配置。最小值为一分钟。

  7. Create
  8. 验证 DRPolicy 是否已成功创建。在 Hub 集群中,为创建的每个 DRPolicy 资源运行这个命令,使用您的唯一名称替换 <drpolicy_name>

    $ oc get drpolicy <drpolicy_name> -o jsonpath='{.status.conditions[].reason}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    Succeeded
    Copy to Clipboard Toggle word wrap

    创建 DRPolicy 时,也会创建两个 DRCluster 资源。验证所有三个资源并且状态显示为 Succeeded 最多需要 10 分钟。

    注意

    DRPolicy 不支持编辑 SchedulingIntervalReplicationClassSelectorVolumeSnapshotClassSelectorDRClusters 字段值。

  9. 验证对象存储桶可以从 Hub 集群Primary 受管集群Secondary 受管集群访问。

    1. 获取 Hub 集群上的 DRClusters 的名称。

      $ oc get drclusters
      Copy to Clipboard Toggle word wrap

      输出示例:

      NAME        AGE
      ocp4bos1   4m42s
      ocp4bos2   4m42s
      Copy to Clipboard Toggle word wrap
    2. 检查 S3 访问每个受管集群上创建的每个存储桶。使用 DRCluster 验证命令,使用您的唯一名称替换 <drcluster_name>

      注意

      DRClusters 不支持编辑 RegionS3ProfileName 字段值。

      $ oc get drcluster <drcluster_name> -o jsonpath='{.status.conditions[2].reason}{"\n"}'
      Copy to Clipboard Toggle word wrap

      输出示例:

      Succeeded
      Copy to Clipboard Toggle word wrap
      注意

      确保为在 Hub 集群中的两个 DRClusters 运行命令。

  10. 验证 OpenShift DR Cluster operator 已成功在 Primary 受管集群Secondary 受管集群上成功安装。

    $ oc get csv,pod -n openshift-dr-system
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                                                                            DISPLAY                         VERSION        REPLACES   PHASE
    clusterserviceversion.operators.coreos.com/odr-cluster-operator.v4.15.0         Openshift DR Cluster Operator   4.15.0                    Succeeded
    clusterserviceversion.operators.coreos.com/volsync-product.v0.8.0               VolSync                         0.8.0                     Succeeded
    
    NAME                                             READY   STATUS    RESTARTS   AGE
    pod/ramen-dr-cluster-operator-6467cf5d4c-cc8kz   2/2     Running   0          3d12h
    Copy to Clipboard Toggle word wrap

    您还可以验证 OpenShift DR Cluster Operator 是否在每个受管集群的 OperatorHub 上成功安装。

    注意

    在初始运行时,会自动安装 VolSync operator。VolSync 用于在两个集群之间设置卷复制,以保护基于 CephF 的 PVC。复制功能默认为启用。

  11. 验证 OpenShift Data Foundation 镜像 Primary 受管集群Secondary 受管集群中的 daemon 健康的状态。

    $ oc get cephblockpool ocs-storagecluster-cephblockpool -n openshift-storage -o jsonpath='{.status.mirroringStatus.summary}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    {"daemon_health":"OK","health":"OK","image_health":"OK","states":{}}
    Copy to Clipboard Toggle word wrap
    Important

    daemon_healthhealthWarning 变为 OK 可能需要最多 10 分钟。如果状态最终未变为 OK,则使用 RHACM 控制台验证受管集群之间的 Submariner 连接是否仍然处于健康状态。在所有值都变为 OK 之前不要继续。

OpenShift Data Foundation 灾难恢复 (DR) 解决方案支持针对由 RHACM 管理的基于 Subscription 和 ApplicationSet 的应用程序的灾难恢复。如需了解更多详细信息,请参阅 订阅和 ApplicationSet 文档。

以下小节详细介绍了如何创建应用程序并将 DRPolicy 应用到应用程序。

4.8.1. 基于订阅的应用程序

4.8.1.1. 创建基于订阅的应用程序示例

为了测试从 Primary 受管集群Secondary 受管集群failoverrelocate,我们需要一个简单的应用程序。

先决条件

  • 在创建用于常规消耗的应用程序时,请确保应用程序仅部署到一个集群。
  • 使用名为 busybox 的示例应用作为示例。
  • 当应用程序通过或重新定位失败时,确保使用全局流量管理器(GTM)或 Global Server Load Balancing (GLSB)服务配置应用程序的所有外部路由。
  • 作为最佳实践,将属于 Red Hat Advanced Cluster Management (RHACM) 订阅的 Red Hat Advanced Cluster Management (RHACM) 订阅分组在一起,以指代单个 Placement Rule 到 DR 保护它们作为组。进一步将它们创建为一个应用程序,用于订阅的逻辑分组,以备将来 DR 操作,如故障转移和重新定位。

    注意

    如果不相关的订阅引用与放置操作相同的放置规则,它们也会受到 DR 保护,因为 DR 工作流控制引用放置规则的所有订阅。

流程

  1. 在 Hub 集群中,进入到 Applications,再点 Create application
  2. 选择类型 Subscription
  3. 输入应用程序 Name (如 busybox)和 Namespace (如 busybox-sample)。
  4. 在 Repository location for resources 部分中,选择 Repository type Git
  5. 输入示例应用程序的 Git 存储库 URL、github BranchPath,在其中创建资源 busybox Pod 和 PVC。

  6. 向下滚动,直到您看到 Deploy application resources on cluster with all specified labels

    • 选择全局 Cluster set 或包含环境正确受管集群的全局集群。
    • 添加一个 <name> 标签,将其值设置为受管集群的名称。
  7. 点位于右上角的 Create

    在接下来的屏幕中,进入 Topology 选项卡。您可以看到应用程序拓扑上有所有的绿色对勾图标。

    注意

    要获取更多信息,请点击任何拓扑元素,拓扑视图右侧会显示一个窗口。

  8. 验证示例应用程序部署。

    现在,busybox 应用程序已部署到首选集群,现在可以验证部署。

    登录到您的受管集群,其中 busybox 由 RHACM 部署。

    $ oc get pods,pvc -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                          READY   STATUS    RESTARTS   AGE
    pod/busybox-67bf494b9-zl5tr   1/1     Running   0          77s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-c732e5fe-daaf-4c4d-99dd-462e04c18412   5Gi        RWO            ocs-storagecluster-ceph-rbd   77s
    Copy to Clipboard Toggle word wrap
4.8.1.2. 将数据策略应用到示例应用程序

先决条件

  • 确保 Data 策略中引用的两个受管集群都可以访问。如果没有,在两个集群都在线前,应用程序不会受到灾难恢复的影响。

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications
  2. 点应用程序末尾的 Actions 菜单,以查看可用操作的列表。
  3. Manage data policyAssign data policy
  4. 选择 Policy,再单击 Next
  5. 选择 Application resource,然后使用 PVC 标签选择器 为所选应用程序资源选择 PVC 标签

    注意

    您可以为所选应用程序资源选择多个 PVC 标签。您还可以使用 Add application resource 选项添加多个资源。

  6. 添加所有应用程序资源后,点 Next
  7. 检查 Policy 配置详情并点 Assign。新分配的 Data 策略显示在 Manage data policy modal 列表视图中。
  8. 验证您可以在 Applications 页面中查看分配的策略详情。

    1. 在 Applications 页面上,进入到 Data policy 列,再单击 策略链接 以展开视图。
    2. 验证您可以看到分配的策略数量以及故障转移和重新定位状态。
    3. 单击 View more details,以查看与应用程序一起使用的策略持续活动的状态。
  9. 可选:在主集群中验证 RADOS 块设备(RBD) volumereplicationvolumereplicationgroup

    $ oc get volumereplications.replication.storage.openshift.io -A
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             AGE     VOLUMEREPLICATIONCLASS                  PVCNAME          DESIREDSTATE   CURRENTSTATE
    busybox-pvc      2d16h   rbd-volumereplicationclass-1625360775   busybox-pvc      primary        Primary
    Copy to Clipboard Toggle word wrap
    $ oc get volumereplicationgroups.ramendr.openshift.io -A
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME           DESIREDSTATE   CURRENTSTATE
    busybox-drpc   primary        Primary
    Copy to Clipboard Toggle word wrap
  10. 可选:验证 CephFS volsync 复制源已在主集群中成功设置,在故障切换集群中设置了 VolSync ReplicationDestination。

    $ oc get replicationsource -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             SOURCE           LAST SYNC              DURATION          NEXT SYNC
    busybox-pvc      busybox-pvc      2022-12-20T08:46:07Z   1m7.794661104s    2022-12-20T08:50:00Z
    Copy to Clipboard Toggle word wrap
    $ oc get replicationdestination -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             LAST SYNC              DURATION          NEXT SYNC
    busybox-pvc      2022-12-20T08:46:32Z   4m39.52261108s
    Copy to Clipboard Toggle word wrap

4.8.2. 基于 ApplicationSet 的应用程序

4.8.2.1. 创建基于 ApplicationSet 的应用程序

前提条件

  • 确保在所有三个集群中安装 Red Hat OpenShift GitOps operator: Hub 集群Primary 受管集群和 Secondary 受管集群。具体步骤,请参阅在 Web 控制台中安装 Red Hat OpenShift GitOps Operator
  • 在 Hub 集群中,确保 Primary 和 Secondary 受管集群都注册到 GitOps。有关注册说明,请参阅将受管集群注册到 GitOps。然后,检查 GitOpsCluster 资源使用的放置是否用于注册两个受管集群,具有处理集群的容限。您可以使用 oc get placement <placement-name> -n openshift-gitops -o yaml 命令来验证以下容限是否已添加到放置中。

      tolerations:
      - key: cluster.open-cluster-management.io/unreachable
        operator: Exists
      - key: cluster.open-cluster-management.io/unavailable
        operator: Exists
    Copy to Clipboard Toggle word wrap

    如果没有添加容限,请参阅为 Red Hat Advanced Cluster Management 和 OpenShift GitOps 配置应用程序放置容限

  • 确保已在 PrimarySecondary 受管集群 上创建 ClusterRoleBinding yaml。具体步骤请查看 RHACM 文档中的 先决条件 章节

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications 并点 Create application
  2. 将应用程序类型选择为 Argo CD ApplicationSet - Pull model
  3. General 步骤中,输入 应用程序设置名称
  4. 选择 Argo server openshift-gitopsRequeue time180 秒。
  5. 点击 Next
  6. 在 Repository location for resources 部分中,选择 Repository type Git
  7. 输入示例应用程序的 Git 存储库 URL、github Branch 和 Path,在其中创建资源 busybox Pod 和 PVC。

    1. 使用示例应用程序存储库作为 https://github.com/red-hat-storage/ocm-ramen-samples
    2. 选择 Revision 作为 release-4.16
    3. 选择以下路径之一:

      • busybox-odr 使用 RBD Regional-DR。
      • busybox-odr-cephfs 使用 CephFS Regional-DR。
  8. 输入 Remote namespace 值。(例如 busybox-sample),然后点 Next
  9. 根据您的要求选择 Sync policy 设置,或选择默认选择,然后单击 Next

    您可以选择一个或多个选项。

  10. 在 Label 表达式中,添加一个标签 & lt;name >,其 值设置为受管集群名称
  11. 点击 Next
  12. 检查设置详情并点 Submit

先决条件

  • 确保 Data 策略中引用的两个受管集群都可以访问。如果没有,在两个集群都在线前,应用程序不会受到灾难恢复的影响。

流程

  1. 在 Hub 集群中,进入到 All ClustersApplications
  2. 点应用程序末尾的 Actions 菜单,以查看可用操作的列表。
  3. Manage data policyAssign data policy
  4. 选择 Policy,再单击 Next
  5. 选择 Application resource,然后使用 PVC 标签选择器 为所选应用程序资源选择 PVC 标签

    注意

    您可以为所选应用程序资源选择多个 PVC 标签。

  6. 添加所有应用程序资源后,点 Next
  7. 检查 Policy 配置详情并点 Assign。新分配的 Data 策略显示在 Manage data policy modal 列表视图中。
  8. 验证您可以在 Applications 页面中查看分配的策略详情。

    1. 在 Applications 页面上,进入到 Data policy 列,再单击 策略链接 以展开视图。
    2. 验证您可以看到分配的策略数量以及故障转移和重新定位状态。
  9. 可选:在主集群中验证 Rados 块设备(RBD) volumereplicationvolumereplicationgroup

    $ oc get volumereplications.replication.storage.openshift.io -A
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             AGE     VOLUMEREPLICATIONCLASS                  PVCNAME          DESIREDSTATE   CURRENTSTATE
    busybox-pvc      2d16h   rbd-volumereplicationclass-1625360775   busybox-pvc      primary        Primary
    Copy to Clipboard Toggle word wrap
    $ oc get volumereplicationgroups.ramendr.openshift.io -A
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME           DESIREDSTATE   CURRENTSTATE
    busybox-drpc   primary        Primary
    Copy to Clipboard Toggle word wrap
  10. [可选] 验证 CephFS volsync 复制源已在主集群中成功设置,在故障转移集群中已设置了 VolSync ReplicationDestination。

    $ oc get replicationsource -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             SOURCE           LAST SYNC              DURATION          NEXT SYNC
    busybox-pvc      busybox-pvc      2022-12-20T08:46:07Z   1m7.794661104s    2022-12-20T08:50:00Z
    Copy to Clipboard Toggle word wrap
    $ oc get replicationdestination -n busybox-sample
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME             LAST SYNC              DURATION          NEXT SYNC
    busybox-pvc      2022-12-20T08:46:32Z   4m39.52261108s
    Copy to Clipboard Toggle word wrap

4.8.3. 删除示例应用程序

本节提供有关使用 RHACM 控制台删除示例应用程序 busybox 的说明。

重要

删除 DR 保护应用程序时,需要访问属于 DRPolicy 的两个集群。这是为了确保清理相应 S3 存储中的所有受保护的 API 资源和资源,作为删除 DR 保护的一部分。如果对其中一个集群的访问不健康,在 hub 上删除应用程序的 DRPlacementControl 资源将保持在 Deleting 状态。

先决条件

  • 在故障转移和重新定位测试完成并且应用程序已准备好从 RHACM 和受管集群中删除之前,不应执行这些示例应用程序。

流程

  1. 在 RHACM 控制台上,前往 Applications
  2. 搜索要删除的示例应用程序(例如 busybox)。
  3. 点击您要删除的应用程序旁边的 Action Menu (⋮)
  4. 点击 Delete application

    选择了 Delete application 时,将显示一个新屏幕,询问是否还应删除与应用相关的资源。

  5. 选中 Remove application 相关资源复选框,以删除 Subscription 和 PlacementRule。
  6. 单击 Delete。这将删除主受管集群(或应用程序所运行的任何群集)上的 busybox 应用程序。
  7. 除了使用 RHACM 控制台删除的资源外,如果删除 busybox 应用后没有自动删除,则删除 DRPlacementControl

    1. 登录到 Hub 集群的 OpenShift Web 控制台,再进入到 项目 busybox-sample 的 Installed Operators。

      对于 ApplicationSet 应用程序,将项目选为 openshift-gitops

    2. 单击 OpenShift DR Hub Operator,然后单击 DRPlacementControl 选项卡。
    3. 点击您要删除的 busybox 应用程序 DRPlacementControl 旁边的 Action Menu (⋮)
    4. 单击 Delete DRPlacementControl
    5. 单击 Delete
注意

此过程可用于使用 DRPlacementControl 资源删除任何应用。

4.9. 受管集群间基于订阅的应用程序故障切换

故障转移( failover)是一个在主集群出现故障时将应用程序从主集群迁移到次要集群的过程。虽然故障转移提供了应用程序在辅助集群中运行的功能,在最少的中断中断时,进行不正确的故障转移决策可能会带来不明确的复制故障,如从主要到次要集群出现无法发生的复制故障时造成的数据丢失。如果自上次成功复制以来存在大量时间,则最好等待失败的主恢复。

LastGroupSyncTime 是一个 关键指标,它反映了与应用程序关联的所有 PVC 最后一次成功复制的时间。本质上,它会测量主集群和次要集群之间的同步健康状况。因此,在从一个集群启动故障切换前,请检查此指标,只有在 LastGroupSyncTime 在过去的合理时间内启动故障转移。

注意

在故障转移集群中故障转移 Ceph-RBD 镜像部署期间,会缩减故障转移,以确保 Ceph-RBD 支持的卷的干净故障转移作为存储置备程序。

先决条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为它可能需要一些时间才能更新。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行故障转移操作前,请检查两个受管集群的状态。

      但是,当您切换到的集群处于 Ready 状态时,故障转移操作仍然可以运行。

  • 与当前时间相比,在 Hub Cluster 上运行以下命令,检查 lastGroupSyncTime 是否位于可接受的数据丢失窗口中。

    $ oc get drpc -o yaml -A | grep lastGroupSyncTime
    Copy to Clipboard Toggle word wrap

    输出示例:

    [...]
    lastGroupSyncTime: "2023-07-10T12:40:10Z"
    Copy to Clipboard Toggle word wrap

流程

  1. 在 Hub 集群中,进入到 Applications
  2. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  3. Failover application
  4. 在显示了 Failover 应用程序 模态后,选择策略目标集群,相关的应用程序将在出现灾难时故障转移。
  5. 选择订阅组下拉菜单,验证默认选择或修改此设置。

    默认情况下,选择为应用程序资源复制的订阅组。

  6. 检查 Failover readiness 的状态。

    • 如果状态是 Ready 且带有一个绿色勾号,这表示目标集群已就绪,可启动故障转移。继续执行第 7 步。
    • 如果状态是 UnknownNot ready,请等待到状态变为 Ready
  7. Initiate。busybox 应用程序现在故障转移到 Secondary-managed 集群
  8. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  9. 验证活动状态是否为应用的 FailedOver

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,点 View more details 链接。
    4. 验证您能否看到一个或多个策略名称以及与应用程序中使用的策略关联的持续活动(同步时间和活动状态)。

故障转移( failover)是一个在主集群出现故障时将应用程序从主集群迁移到次要集群的过程。虽然故障转移提供了应用程序在辅助集群中运行的功能,在最少的中断中断时,进行不正确的故障转移决策可能会带来不明确的复制故障,如从主要到次要集群出现无法发生的复制故障时造成的数据丢失。如果自上次成功复制以来存在大量时间,则最好等待失败的主恢复。

LastGroupSyncTime 是一个 关键指标,它反映了与应用程序关联的所有 PVC 最后一次成功复制的时间。本质上,它会测量主集群和次要集群之间的同步健康状况。因此,在从一个集群启动故障切换前,请检查此指标,只有在 LastGroupSyncTime 在过去的合理时间内启动故障转移。

注意

在故障转移集群中故障转移 Ceph-RBD 镜像部署期间,会缩减故障转移,以确保 Ceph-RBD 支持的卷的干净故障转移作为存储置备程序。

先决条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为它可能需要一些时间才能更新。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行故障转移操作前,请检查两个受管集群的状态。

      但是,当您切换到的集群处于 Ready 状态时,故障转移操作仍然可以运行。

  • 与当前时间相比,在 Hub Cluster 上运行以下命令,检查 lastGroupSyncTime 是否位于可接受的数据丢失窗口中。

    $ oc get drpc -o yaml -A | grep lastGroupSyncTime
    Copy to Clipboard Toggle word wrap

    输出示例:

    [...]
    lastGroupSyncTime: "2023-07-10T12:40:10Z"
    Copy to Clipboard Toggle word wrap

流程

  1. 在 Hub 集群中,进入到 Applications
  2. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  3. Failover application
  4. 显示 Failover 应用程序 模态时,验证显示的详细信息是否正确并检查 Failover readiness 的状态。如果状态是 Ready 且带有绿色勾号,这表示目标集群已准备好故障转移启动。
  5. Initiate。busybox 资源现在在目标集群上创建。
  6. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  7. 验证活动状态是否为应用的 FailedOver

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,验证您可以看到一个或多个策略名称以及与应用程序中使用的策略关联的持续活动。

当所有受管集群都可用时,将应用程序重新定位到首选位置。

前提条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为可能需要一些时间来更新。只有在主集群和首选集群启动并运行时才可执行重新定位。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行重新定位操作前,请单独检查两个受管集群的状态。
  • 与当前时间相比,当 lastGroupSyncTime 位于复制间隔(例如 5 分钟)时,执行重定位。建议为任何单个应用程序最小化恢复时间目标(RTO)。

    在 Hub 集群中运行这个命令:

    $ oc get drpc -o yaml -A | grep lastGroupSyncTime
    Copy to Clipboard Toggle word wrap

    输出示例:

    [...]
    lastGroupSyncTime: "2023-07-10T12:40:10Z"
    Copy to Clipboard Toggle word wrap

    将输出时间(UTC)与当前时间进行比较,以验证所有 lastGroupSyncTime 值是否在应用程序复制间隔内。如果没有,请等待 Relocate,直到所有 lastGroupSyncTime 值都为 true。

流程

  1. 在 Hub 集群中,进入到 Applications
  2. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  3. Relocate application
  4. Relocate application 模态显示时,选择 policytarget cluster,在出现灾难时相关的应用程序将重新定位到其中。
  5. 默认情况下,选择部署应用程序资源的订阅组。点选择订阅组下拉菜单,验证默认选择或修改此设置。
  6. 检查 Relocation readiness 的状态。

    • 如果状态是 Ready 且带有一个绿色勾号,这表示目标集群已准备好重定位来进行启动。继续执行第 7 步。
    • 如果状态是 UnknownNot ready,请等待到状态变为 Ready
  7. Initiate。busybox 资源现在在目标集群上创建。
  8. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  9. 验证应用程序的活动状态是否显示为 Relocated

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,点 View more details 链接。
    4. 验证您能否看到一个或多个策略名称以及与应用程序中使用的策略关联的持续活动(同步时间和活动状态)。

当所有受管集群都可用时,将应用程序重新定位到首选位置。

前提条件

  • 如果您的设置有主动和被动 RHACM hub 集群,请参阅使用 Red Hat Advanced Cluster Management 进行 Hub 恢复
  • 当主集群处于 Ready 以外的状态时,请检查集群的实际状态,因为可能需要一些时间来更新。只有在主集群和首选集群启动并运行时才可执行重新定位。

    1. 进入到 RHACM 控制台 → Infrastructure → Clusters → Cluster list 选项卡。
    2. 在执行重新定位操作前,请单独检查两个受管集群的状态。
  • 与当前时间相比,当 lastGroupSyncTime 位于复制间隔(例如 5 分钟)时,执行重定位。建议为任何单个应用程序最小化恢复时间目标(RTO)。

    在 Hub 集群中运行这个命令:

    $ oc get drpc -o yaml -A | grep lastGroupSyncTime
    Copy to Clipboard Toggle word wrap

    输出示例:

    [...]
    lastGroupSyncTime: "2023-07-10T12:40:10Z"
    Copy to Clipboard Toggle word wrap

    将输出时间(UTC)与当前时间进行比较,以验证所有 lastGroupSyncTime 值是否在应用程序复制间隔内。如果没有,请等待 Relocate,直到所有 lastGroupSyncTime 值都为 true。

流程

  1. 在 Hub 集群中,进入到 Applications
  2. 点应用程序行末尾的 Actions 菜单,以查看可用操作的列表。
  3. Relocate application
  4. Relocate application 模态显示时,选择 policytarget cluster,在出现灾难时相关的应用程序将重新定位到其中。
  5. Initiate。busybox 资源现在在目标集群上创建。
  6. 关闭模态窗口,并使用 Applications 页面中的 Data policies 列跟踪状态。
  7. 验证应用程序的活动状态是否显示为 Relocated

    1. 进入 ApplicationsOverview 选项卡。
    2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。
    3. Data policy 弹出窗口中,验证您可以看到一个或多个策略名称以及与应用程序一起使用的策略关联的重新定位状态。

4.13. 发现应用程序的灾难恢复保护

Red Hat OpenShift Data Foundation 现在为在其中一个受管集群中部署的工作负载提供灾难恢复(DR)保护和支持,而无需使用 Red Hat Advanced Cluster Management (RHACM)。这些工作负载称为发现的应用程序。

使用 RHACM 部署的工作负载称为受管应用程序,而那些直接在其中一个受管集群中部署的工作负载,而无需使用 RHACM 来称为发现的应用程序。虽然 RHACM 显示两种类型的工作负载的详情,但它不管理发现应用程序的生命周期(创建、删除、编辑)。

本节提供了指导您完成保护发现的应用程序的先决条件的说明。这包括分配数据策略和启动 DR 操作等任务,如故障转移和重新定位。

  1. 确保所有 DR 配置都已安装在主受管集群和次受管集群上。
  2. 安装 OADP 1.4 operator。

    注意

    OADP 1.4 之前的任何版本都不适用于保护发现的应用程序。

    1. PrimarySecondary 受管集群上,进入到 OperatorHub,并使用关键字过滤器搜索 OADP
    2. OADP 标题。
    3. 保留所有默认设置,然后点安装。确保 Operator 资源已安装在 openshift-adp 项目中。
    注意

    如果在 DR 配置完成后安装了 OADP 1.4,则 主受管集群上的 ramen-dr-cluster-operator pod 必须重启命名空间 openshift-dr-system 中的二级受管集群 (删除并重新创建)。

  3. [可选] 将 CACertificates 添加到 ramen-hub-operator-config ConfigMap 中。

    在主集群和次要集群间配置网络(SSL)访问,以便元数据可以使用安全传输协议和 Hub 集群中的安全传输协议存储在 Multicloud Gateway (MCG)对象存储桶中的备用集群中,以验证对对象存储桶的访问。

    注意

    如果所有 OpenShift 集群都为您的环境使用签名的有效证书集进行部署,则可以跳过本节。

    如果您使用自签名证书,则您已在 openshift-config 命名空间中创建一个名为 user-ca-bundleConfigMap,并将此 ConfigMap 添加到默认 Proxy 集群资源中。

    1. 查找 CACertificates 的编码值。

      $ oc get configmap user-ca-bundle -n openshift-config -o jsonpath="{['data']['ca-bundle\.crt']}" |base64 -w 0
      Copy to Clipboard Toggle word wrap
    2. 将此 base64 编码值添加到 Hub 集群上的 configmap ramen-hub-operator-config 中。下面的示例显示了添加 CACertificates 的位置。

      $ oc edit configmap ramen-hub-operator-config -n openshift-operators
      Copy to Clipboard Toggle word wrap
      [...]
          ramenOpsNamespace: openshift-dr-ops
          s3StoreProfiles:
          - s3Bucket: odrbucket-36bceb61c09c
            s3CompatibleEndpoint: https://s3-openshift-storage.apps.hyper3.vmw.ibmfusion.eu
            s3ProfileName: s3profile-hyper3-ocs-storagecluster
            s3Region: noobaa
            s3SecretRef:
              name: 60f2ea6069e168346d5ad0e0b5faa59bb74946f
            caCertificates: {input base64 encoded value here}
          - s3Bucket: odrbucket-36bceb61c09c
            s3CompatibleEndpoint: https://s3-openshift-storage.apps.hyper4.vmw.ibmfusion.eu
            s3ProfileName: s3profile-hyper4-ocs-storagecluster
            s3Region: noobaa
            s3SecretRef:
              name: cc237eba032ad5c422fb939684eb633822d7900
            caCertificates: {input base64 encoded value here}
      Copy to Clipboard Toggle word wrap
  4. 验证 OADP operator 默认命名空间 openshift-adp 是否在 主受管集群和次受管集群 中创建的 DR secret。创建第一个 DRPolicy 时创建的 DR secret 类似于以下的 secret。DR secret 名称前面带有字母 v

    $ oc get secrets -n openshift-adp
    NAME                                       TYPE     DATA   AGE
    v60f2ea6069e168346d5ad0e0b5faa59bb74946f   Opaque   1      3d20h
    vcc237eba032ad5c422fb939684eb633822d7900   Opaque   1      3d20h
    [...]
    Copy to Clipboard Toggle word wrap
    注意

    openshift-adp 命名空间中为每个受管集群创建一个 DR 创建 secret。

  5. 验证 Data Protection Application (DPA)是否已安装到 OADP 命名空间 openshift-adp 的每个受管集群中。如果尚未创建,则按照下一步创建此资源。

    1. 通过将以下 YAML 定义内容复制到 dpa.yaml 来创建 DPA。

      apiVersion: oadp.openshift.io/v1alpha1
      kind: DataProtectionApplication
      metadata:
        labels:
          app.kubernetes.io/component: velero
        name: velero
        namespace: openshift-adp
      spec:
        backupImages: false
        configuration:
          nodeAgent:
            enable: false
            uploaderType: restic
          velero:
            defaultPlugins:
              - openshift
              - aws
            noDefaultBackupLocation: true
      Copy to Clipboard Toggle word wrap
    2. 创建 DPA 资源。

      $ oc create -f dpa.yaml -n openshift-adp
      Copy to Clipboard Toggle word wrap
      dataprotectionapplication.oadp.openshift.io/velero created
      Copy to Clipboard Toggle word wrap
    3. 验证 OADP 资源是否已创建并处于 Running 状态。

      $ oc get pods,dpa -n openshift-adp
      NAME                                                    READY   STATUS    RESTARTS   AGE
      pod/openshift-adp-controller-manager-7b64b74fcd-msjbs   1/1     Running   0          5m30s
      pod/velero-694b5b8f5c-b4kwg                             1/1     Running   0          3m31s
      
      
      NAME                                                 AGE
      dataprotectionapplication.oadp.openshift.io/velero   3m31s
      Copy to Clipboard Toggle word wrap

4.13.2. 创建示例发现的应用程序

为了测试从主 受管集群到二级受管集群的 故障切换,并为发现的应用程序 重新定位,您需要在不使用 RHACM 创建应用程序功能的情况下安装示例应用程序。

流程

  1. 登录 Primary 受管集群,并克隆示例应用程序存储库。

    $ git clone https://github.com/red-hat-storage/ocm-ramen-samples.git
    Copy to Clipboard Toggle word wrap
  2. 验证您是否位于 main 分支中。

    $ cd ~/ocm-ramen-samples
    $ git branch
    * main
    Copy to Clipboard Toggle word wrap

    根据您的场景、满足或地区创建示例应用程序时,应使用正确的目录。

    注意

    发现的应用程序只支持使用 CephRBD 或块卷的应用程序。

    $ ls workloads/deployment | egrep -v 'cephfs|k8s|base'
    odr-metro-rbd
    odr-regional-rbd
    Copy to Clipboard Toggle word wrap
  3. Primary 和 Secondary 受管集群上,创建名为 busybox-discovered 的项目。

    $ oc new-project busybox-discovered
    Copy to Clipboard Toggle word wrap
  4. 在主受管集群 上创建 busybox 应用程序。此示例应用示例是使用块(Ceph RBD)卷的 Regional-DR。

    $ oc apply -k workloads/deployment/odr-regional-rbd -n busybox-discovered
    persistentvolumeclaim/busybox-pvc created
    deployment.apps/busybox created
    Copy to Clipboard Toggle word wrap
    注意

    OpenShift Data Foundation 灾难恢复解决方案现在扩展到跨多个命名空间的发现应用程序。

  5. 验证 busybox 是否在 Primary 受管集群 上的正确项目中运行。

    $ oc get pods,pvc,deployment -n busybox-discovered
    Copy to Clipboard Toggle word wrap
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          18s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 18s
    
    
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/busybox   1/1     1            1           18
    Copy to Clipboard Toggle word wrap

本节介绍了如何从 Protected applications 选项卡中应用现有的 DR 策略到发现的应用程序。

先决条件

  • 确保配置了灾难恢复功能,并且至少有一个 DR 策略。

流程

  1. 在 RHACM 控制台中,导航到 disaster recoveryProtected applications 选项卡。
  2. Enroll application 以开始为 DR 保护配置现有应用程序。
  3. 选择 ACM 发现的应用程序
  4. 在 Namespace 页面中,选择 DR 集群,这是安装 busyboxPrimary 受管集群 的名称。
  5. 选择安装应用程序 的命名空间。例如: busybox-discovered

    注意

    如果您的工作负载分布到多个命名空间中,您可以选择所有这些命名空间进行 DR 保护。

  6. 为发现的应用程序选择一个唯一的 Name,如 busybox-rbd,然后单击 Next
  7. 在 Configuration 页面中,Resource 标签用于 保护资源,您可以在其中设置 kubernetes-object 备份中包含哪些资源,以及要复制哪些卷持久数据。默认选择 资源标签。
  8. 提供标签表达式和 PVC 标签选择器。为 kubernetes-objectsPVC 选择 标签 appname=busybox
  9. 点击 Next
  10. 在 Replication 页面中,选择一个现有的 DR Policykubernetes-objects 备份间隔

    注意

    建议您为 PVC 数据复制和 kubernetes-object 备份间隔(例如 5 分钟)选择相同的持续时间。

  11. 点击 Next
  12. 检查配置并点 Save

    使用 Back 按钮返回到屏幕,以更正所有问题。

  13. 在继续 DR Failover 和 Relocate 测试前,请验证 应用程序卷(PVC)Kubernetes 对象 备份是否具有 Healthy 状态。您可以在 Protected applications 选项卡中查看发现的应用程序的状态。

    1. 要查看 DRPC 的状态,请在 Hub 集群中运行以下命令:

      $ oc get drpc {drpc_name} -o wide -n openshift-dr-ops
      Copy to Clipboard Toggle word wrap

      发现的应用将 DRPlacementControl (DRPC)和放置等资源存储在名为 openshift-dr-ops 的新命名空间中。DRPC 名称可以通过前面的步骤(如 busybox-rbd)中配置的唯一名称来标识。

    2. 要查看发现的应用程序的 VolumeReplicationGroup (VRG)的状态,请在手动安装 busybox 应用程序的受管集群中运行以下命令。

      $ oc get vrg {vrg_name} -n openshift-dr-ops
      Copy to Clipboard Toggle word wrap

      在为发现的应用程序分配 DR Policy 后,VRG 资源存储在命名空间 openshift-dr-ops 中。VRG 名称可以通过前面的步骤(如 busybox-rbd)中配置的唯一名称来标识。

4.13.4. 发现的应用程序故障切换和重新定位

受保护的发现 应用程序可以 故障切换或重新定位 到与 受管应用程序 类似的对等集群。但是,发现的应用程序还有一些额外的步骤,因为 RHACM 不会管理应用程序的生命周期,因为它适用于 Managed 应用程序。

本节指导您为受保护的发现的应用程序完成 Failover 和 Relocate 进程。

重要

当一个或多个资源类型处于 Warning 或 Critical 状态时,永远不会启动 Failover 或 Relocate of an application。

本节介绍了如何故障转移受灾难恢复保护的发现应用程序。

先决条件

  • 确保在两个受管集群中创建了应用程序命名空间(如 busybox-discovered)。

流程

  1. 在 RHACM 控制台中,导航到 disaster RecoveryProtected applications 选项卡。
  2. 在应用程序行的末尾,单击 Actions 菜单并选择 启动 Failover
  3. 在 Failover 应用程序 modal 窗口中,查看应用程序和目标集群的状态。
  4. Initiate。等待 故障切换 过程完成。
  5. 验证 busybox 应用程序是否在 次受管集群 上运行。

    $ oc get pods,pvc,volumereplication -n busybox-discovered
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          2m46s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 2m57s
    
    
    NAME                                                             AGE     VOLUMEREPLICATIONCLASS                  PVCNAME       DESIREDSTATE   CURRENTSTATE
    volumereplication.replication.storage.openshift.io/busybox-pvc   2m45s   rbd-volumereplicationclass-1625360775   busybox-pvc   primary        Primary
    Copy to Clipboard Toggle word wrap
  6. 检查 Failover 的进度状态,直到结果为 WaitOnUserToCleanup。DRPC 名称可以通过前面的步骤中配置的唯一名称(如 busybox-rbd)来标识。

    $ oc get drpc {drpc_name} -n openshift-dr-ops -o jsonpath='{.status.progression}{"\n"}'
    WaitOnUserToCleanUp
    Copy to Clipboard Toggle word wrap
  7. Primary 受管集群中删除 busybox 应用程序, 以完成 Failover 进程。

    1. 导航到 Protected applications 选项卡。您将看到删除应用的消息。
    2. 导航到 busybox 的克隆存储库,并在从中 失败的 Primary 受管集群上 运行以下命令。使用用于创建应用程序的同一目录(如 odr-regional-rbd)。

      $ cd ~/ocm-ramen-samples/
      $ git branch
      * main
      $ oc delete -k workloads/deployment/odr-regional-rbd -n busybox-discovered
      persistentvolumeclaim "busybox-pvc" deleted
      deployment.apps "busybox" deleted
      Copy to Clipboard Toggle word wrap
  8. 删除应用程序后,进入到 Protected applications 选项卡,并验证 busybox 资源是否处于 Healthy 状态。

本节介绍了如何重新定位发现的应用程序,这些应用程序受灾难恢复保护。

流程

  1. 在 RHACM 控制台中,导航到 disaster RecoveryProtected applications 选项卡。
  2. 在应用程序行的末尾,单击 Actions 菜单,然后选择 启动 Relocate
  3. 在 Relocate application modal 窗口中,查看应用程序和目标集群的状态。
  4. Initiate
  5. 检查 Relocate 的进度状态,直到结果为 WaitOnUserToCleanup。DRPC 名称可以通过前面的步骤中配置的唯一名称(如 busybox-rbd)来标识。

    $ oc get drpc {drpc_name} -n openshift-dr-ops -o jsonpath='{.status.progression}{"\n"}'
    WaitOnUserToCleanUp
    Copy to Clipboard Toggle word wrap
  6. Relocate to the Primary managed cluster 之前,从 Secondary 受管集群中删除 busybox 应用程序。

    导航到 busybox 的克隆存储库,并在从其 重新定位Secondary 受管集群上 运行以下命令。使用用于创建应用程序的同一目录(如 odr-regional-rbd)。

    $ cd ~/ocm-ramen-samples/
    $ git branch
    * main
    $ oc delete -k workloads/deployment/odr-regional-rbd -n busybox-discovered
    persistentvolumeclaim "busybox-pvc" deleted
    deployment.apps "busybox" deleted
    Copy to Clipboard Toggle word wrap
  7. 删除应用程序后,进入到 Protected applications 选项卡,并验证 busybox 资源是否处于 Healthy 状态。
  8. 验证 busybox 应用程序是否 在主受管集群 上运行。

    $ oc get pods,pvc -n busybox-discovered
    NAME                           READY   STATUS    RESTARTS   AGE
    pod/busybox-796fccbb95-qmxjf   1/1     Running   0          2m46s
    
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  VOLUMEATTRIBUTESCLASS   AGE
    persistentvolumeclaim/busybox-pvc   Bound    pvc-b20e4129-902d-47c7-b962-040ad64130c4   1Gi        RWO            ocs-storagecluster-ceph-rbd   <unset>                 2m57s
    
    
    NAME                                                             AGE     VOLUMEREPLICATIONCLASS                  PVCNAME       DESIREDSTATE   CURRENTSTATE
    volumereplication.replication.storage.openshift.io/busybox-pvc   2m45s   rbd-volumereplicationclass-1625360775   busybox-pvc   primary        Primary
    Copy to Clipboard Toggle word wrap

4.13.5. 为受保护的应用程序禁用灾难恢复

本节指导您在删除受保护的应用程序或应用程序不再需要保护时禁用灾难恢复资源。

流程

  1. 登录到 Hub 集群。
  2. 列出 DRPlacementControl (DRPC)资源。每个 DRPC 资源都是在应用程序分配 DR 策略时创建的。

    $ oc get drpc -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  3. 找到包含您在分配 DR 策略(如 busybox-rbd)时选择的唯一标识符的 DRPC,并删除 DRPC。

    $ oc delete {drpc_name} -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  4. 列出 放置资源。每个放置资源都是在应用程序分配 DR 策略时创建的。

    $ oc get placements -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap
  5. 找到名称 放置,其中包含您在分配 DR 策略时选择的唯一标识符(如 busybox-rbd-placement-1)并删除 放置

    $ oc delete placements {placement_name} -n openshift-dr-ops
    Copy to Clipboard Toggle word wrap

4.14. 使用 Regional-DR 恢复到替换集群

当主集群有故障时,您可以获得修复的选项,等待现有集群恢复,或者如果集群不可行,请完全替换集群。此解决方案指导您在将故障的主集群替换为新集群,并为这个新集群启用故障恢复(分配)。

在这些说明中,我们假定在安装和保护应用程序后必须替换 RHACM 受管集群。对于本节,RHACM 受管集群是 替换集群,而未替换的集群是 存活的集群,新集群是 恢复集群

注意

目前不支持为发现的应用程序替换集群恢复。仅支持受管应用程序。

前提条件

  • 确保 Regional-DR 环境已配置了使用红帽 Advance Cluster Management (RHACM)安装的应用程序。
  • 确保为应用程序分配保护它们不受集群故障的数据策略。

流程

  1. 在 Hub 集群中,导航到 Applications,并将故障替换集群中的所有受保护的应用程序切换到 surviving 集群。
  2. 在继续下一步之前,验证所有受保护的应用程序都在存活的集群上运行。

    注意

    每个应用程序 DRPlacementControl 的 PROGRESSION 状态显示为 Cleaning Up。如果替换集群离线或停机,则这是预期的。

  3. 在 Hub 集群中,删除用于替换集群的 DRCluster。

    $ oc delete drcluster <drcluster_name> --wait=false
    Copy to Clipboard Toggle word wrap
    注意

    use- wait=false,因为 DRCluster 在稍后的步骤之前不会删除。

  4. 在存活的集群中为每个受保护的应用程序禁用灾难恢复。在 hub 集群上执行所有子步骤。

    1. 对于每个应用程序,编辑放置并确保选择了 surviving 集群。

      $ oc edit placement <placement_name> -n <namespace>
      Copy to Clipboard Toggle word wrap
      apiVersion: cluster.open-cluster-management.io/v1beta1
      kind: Placement
      metadata:
      annotations:
        cluster.open-cluster-management.io/experimental-scheduling-disable: "true"
      [...]
      spec:
      clusterSets:
      - submariner
      predicates:
      - requiredClusterSelector:
          claimSelector: {}
          labelSelector:
            matchExpressions:
            - key: name
              operator: In
              values:
              - cluster1  <-- Modify to be surviving cluster name
      [...]
      Copy to Clipboard Toggle word wrap
      注意

      对于基于 Subscription 的应用程序,相关的放置可以在 hub 集群上的同一命名空间中找到,类似于受管集群。对于基于 ApplicationSets 的应用程序,相关的放置可以在 hub 集群上的 openshift-gitops 命名空间中找到。

    2. 在每个受保护的应用程序的 VolumeReplicationGroup 上运行以下命令来验证为替换集群删除了 s3Profile

      $ oc get vrg -n <application_namespace> -o jsonpath='{.items[0].spec.s3Profiles}' | jq
      Copy to Clipboard Toggle word wrap
    3. 在将受保护的应用程序 放置资源 配置为使用存活 集群并从受保护的应用程序中删除后,从 Hub 集群中删除了所有 DRPlacementControl (DRPC)资源。

      1. 在删除 DRPC 之前,请编辑每个应用的 DRPC,并添加注解 drplacementcontrol.ramendr.openshift.io/do-not-delete-pvc: "true "。

        $ oc edit drpc {drpc_name} -n {namespace}
        Copy to Clipboard Toggle word wrap
        apiVersion: ramendr.openshift.io/v1alpha1
           kind: DRPlacementControl
           metadata:
             annotations:
             ## Add this annotation
             drplacementcontrol.ramendr.openshift.io/do-not-delete-pvc: "true"
        Copy to Clipboard Toggle word wrap
      2. 验证该注解是否已复制到每个受保护应用程序的 surviving 集群上的关联 VolumeReplicationGroup (VRG)。

        $ oc get vrg -n {namespace} -o jsonpath='{.items[*].metadata.annotations}' | jq
        Copy to Clipboard Toggle word wrap
      3. 删除 DRPC。

        $ oc delete drpc {drpc_name} -n {namespace}
        Copy to Clipboard Toggle word wrap
        注意

        对于基于 Subscription 的应用程序,关联的 DRPlacementControl 可以与 hub 集群上的受管集群位于同一个命名空间中。对于基于 ApplicationSet 的应用程序,关联的 DRPlacementControl 可以在 hub 集群上的 openshift-gitops 命名空间中找到。

      4. 在继续下一步之前,验证所有 DRPlacementControl 资源是否都已被删除。此命令是所有命名空间的查询。不应找到任何资源。

        $ oc get drpc -A
        Copy to Clipboard Toggle word wrap
    4. 编辑每个应用程序的 放置 并删除注解 cluster.open-cluster-management.io/experimental-scheduling-disable: "true "。

      $ oc edit placement {placement_name} -n {namespace}
      Copy to Clipboard Toggle word wrap
      apiVersion: cluster.open-cluster-management.io/v1beta1
      kind: Placement
      metadata:
      annotations:
        ## Remove this annotation
        cluster.open-cluster-management.io/experimental-scheduling-disable: "true"
      [...]
      Copy to Clipboard Toggle word wrap
  5. 对存活的集群中每个受保护的应用程序重复最后一步中详述的流程。为受保护的应用程序禁用 DR 现已完成。
  6. hub 集群中,运行以下脚本从 存活 集群和 hub 集群中删除所有灾难恢复配置。

    #!/bin/bash
    
    secrets=$(oc get secrets -n openshift-operators | grep Opaque | cut -d" " -f1)
    echo $secrets
    for secret in $secrets
    do
        oc patch -n openshift-operators secret/$secret -p '{"metadata":{"finalizers":null}}' --type=merge
    done
    
    mirrorpeers=$(oc get mirrorpeer -o name)
    echo $mirrorpeers
    for mp in $mirrorpeers
    do
        oc patch $mp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $mp
    done
    
    drpolicies=$(oc get drpolicy -o name)
    echo $drpolicies
    for drp in $drpolicies
    do
        oc patch $drp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $drp
    done
    
    drclusters=$(oc get drcluster -o name)
    echo $drclusters
    for drp in $drclusters
    do
        oc patch $drp -p '{"metadata":{"finalizers":null}}' --type=merge
        oc delete $drp
    done
    
    oc delete project openshift-operators
    
    managedclusters=$(oc get managedclusters -o name | cut -d"/" -f2)
    echo $managedclusters
    for mc in $managedclusters
    do
        secrets=$(oc get secrets -n $mc | grep multicluster.odf.openshift.io/secret-type | cut -d" " -f1)
        echo $secrets
        for secret in $secrets
        do
            set -x
            oc patch -n $mc secret/$secret -p '{"metadata":{"finalizers":null}}' --type=merge
            oc delete -n $mc secret/$secret
        done
    done
    
    oc delete clusterrolebinding spoke-clusterrole-bindings
    Copy to Clipboard Toggle word wrap
    注意

    此脚本使用 oc delete project openshift-operators 命令删除 hub 集群上的此命名空间中的灾难恢复(DR)操作器。如果此命名空间中还有其他非DR 操作器,则必须从 OperatorHub 重新安装它们。

  7. 在命名空间 openshift-operators 再次自动创建后,添加监控标签以收集灾难恢复指标。

    $ oc label namespace openshift-operators openshift.io/cluster-monitoring='true'
    Copy to Clipboard Toggle word wrap
  8. surviving 集群中,确保 DR 安装过程中创建的对象存储桶已被删除。如果没有通过脚本删除对象存储桶,请删除它。用于 DR 的对象存储桶的名称以 odrbucket 开头。

    $ oc get obc -n openshift-storage
    Copy to Clipboard Toggle word wrap
  9. 使用 RHACM 控制台只为 替换集群 (失败集群)卸载 Submariner

    1. 导航到 Infrastructure → Clusters → Clustersets → Submariner add-ons view,只为替换集群卸载 Submariner。

      注意

      替换集群的 Submariner 的卸载过程将保持 GREEN,在替换集群从 RHACM 控制台分离前不会完成。

    2. 返回到 Clusters 视图 和分离替换集群。
    3. 创建新的 OpenShift 集群(恢复集群),并导入到 Infrastructure → Clusters 视图
    4. 将新的恢复集群添加到 Submariner 使用的 Clusterset 中。
    5. 仅为新的 恢复集群 安装 Submariner 附加组件

      注意

      如果将 GlobalNet 用于存活的集群,请确保为恢复集群启用 GlobalNet。

  10. 在恢复集群中安装 OpenShift Data Foundation。OpenShift Data Foundation 版本应该是 OpenShift Data Foundation 4.16 (或更多)以及与存活集群中的 ODF 版本相同的版本。在创建存储集群时,在 数据保护 步骤中,您必须选择 Prepare cluster for disaster recovery (Regional-DR only) 复选框。

    注意

    如果在安装 Submariner 时启用了 GlobalNet,确保按照文档中的可选说明来修改恢复集群中的 OpenShift Data Foundation 存储集群。

  11. Hub 集群中,从 OperatorHub 安装 ODF Multicluster Orchestrator operator。具体步骤请参阅有关安装 OpenShift Data Foundation Multicluster Orchestrator operator 的章节。
  12. 使用 RHACM 控制台,进入到 Data Services → disaster recovery → Policies 选项卡。

    1. 选择 Create DRPolicy 并命名您的策略。
    2. 选择 恢复集群 和存存 集群
    3. 创建策略。具体步骤,请参阅在 Hub 集群上创建灾难恢复策略

    只有在 DRPolicy 的状态更改为 Validated 时才会进入下一步。

  13. 验证 cephblockpool ID 是否保持不变。

    1. 在恢复集群中运行以下命令

      $ oc get cm -n openshift-storage rook-ceph-csi-mapping-config -o yaml
      Copy to Clipboard Toggle word wrap

      结果是示例输出。

      apiVersion: v1
      data:
        csi-mapping-config-json: '[{"ClusterIDMapping":{"openshift-storage":"openshift-storage"},"RBDPoolIDMapping":[{"1":"1"}]}]'
      kind: ConfigMap
      [...]
      Copy to Clipboard Toggle word wrap
    2. 在存活集群 上运行以下命令

      $ oc get cm -n openshift-storage rook-ceph-csi-mapping-config -o yaml
      Copy to Clipboard Toggle word wrap

      结果是示例输出。

      apiVersion: v1
      data:
        csi-mapping-config-json: '[{"ClusterIDMapping":{"openshift-storage":"openshift-storage"},"RBDPoolIDMapping":[{"3":"1"}]}]'
      kind: ConfigMap
      [...]
      Copy to Clipboard Toggle word wrap
    3. 检查两个集群的 yaml 中的 RBDPoolIDMapping。如果 RBDPoolIDMapping 不匹配,则编辑 recovery 集群的 rook-ceph-csi-mapping-config 配置映射,以添加额外的或缺失的 RBDPoolIDMapping,如以下示例所示。

      csi-mapping-config-json: '[{"ClusterIDMapping":{"openshift-storage":"openshift-storage"},"RBDPoolIDMapping":[{"1":"1"}]},{"ClusterIDMapping":{"openshift-storage":"openshift-storage"},"RBDPoolIDMapping":[{"1":"3"}]}]’
      Copy to Clipboard Toggle word wrap
      注意

      编辑 configmap 后,通过删除 pod,在存活的集群中命名空间 openshift-storage 中重启 rook-ceph-operator pod。

  14. 将 DRPolicy 应用到在替换集群失败前最初保护的集群中的应用程序。
  15. Surviving 集群中 的新受保护的应用程序重新定位回新的恢复集群。使用 RHACM 控制台,进入到 Applications 菜单来执行重新定位。
注意

如果在按照此过程后遇到任何问题,请联系红帽客户支持

恢复点目标 (RPO) 值是应用程序当前有效的集群中的持久数据的最新同步时间。此同步时间有助于确定在故障切换过程中丢失的数据持续时间。

注意

此 RPO 值仅适用于故障切换期间的 Regional-DR。重新定位可确保操作过程中没有数据丢失,因为所有对等集群都可用。

您可以在 Hub 集群中查看所有受保护的卷的恢复点目标 (RPO) 值。

流程

  1. 在 Hub 集群中,进入到 ApplicationsOverview 选项卡。
  2. Data policy 列中,点您要将策略应用到的应用程序的策略链接。

    Data policies modal 页面会出现,每个应用程序所应用的灾难恢复策略数量以及故障转移和重新定位状态。

  3. Data policies 模态页面中,点 View more details 链接。

    此时会显示一个详细的 数据策略 模态页面,其中显示策略名称和与应用到应用程序的策略关联的持续活动(Last sync、Activity 状态)。

    在模态页面中报告的 Last sync 时间 代表,表示所有针对应用程序保护的 DR 的卷的最新同步时间。

当您的设置有主动和被动 Red Hat Advanced Cluster Management for Kubernetes (RHACM) hub 集群,如果活跃 hub 停机,您可以使用被动 hub 故障转移或重新定位灾难恢复受保护的工作负载。

4.16.1. 配置被动 hub 集群

要在活跃 hub 停机或无法访问的情况下执行 hub 恢复,请按照本节中的步骤配置被动 hub 集群,然后故障转移或重新定位灾难恢复受保护的工作负载。

流程

  1. 确保在被动 hub 集群上安装了 RHACM operator 和 MultiClusterHub。具体步骤请查看 RHACM 安装指南

    成功安装 Operator 后,用户界面中会显示一个带有 Web 控制台更新可用消息的弹出窗口。点此弹出窗口中的 Refresh Web 控制台来反映控制台更改。

  2. 在 hub 恢复前,配置备份和恢复。请参阅 RHACM 业务连续性 指南的 备份和恢复 主题。
  3. 在恢复前,在被动 RHACM hub 上安装多集群编配器(MCO) Operator 和 Red Hat OpenShift GitOps operator。有关恢复 RHACM hub 的说明,请参阅安装 OpenShift Data Foundation Multicluster Orchestrator operator
  4. 确保 Restore.cluster.open-cluster-management.io 资源将 .spec.cleanupBeforeRestore 设置为 None。详情请参阅在 检查 RHACM 文档的备份时恢复被动资源
  5. 如果在设置过程中手动配置了跨集群的 SSL 访问,请在集群间重新配置 SSL 访问。具体步骤请参阅 在集群间配置 SSL 访问 部分。
  6. 在被动 hub 中,在 openshift-operators 命名空间中添加标签,以便使用以下命令启用 VolumeSyncronizationDelay 警报的基本监控。如需警报详情,请参阅 灾难恢复警报 章节。

    $ oc label namespace openshift-operators openshift.io/cluster-monitoring='true'
    Copy to Clipboard Toggle word wrap

4.16.2. 切换到被动 hub 集群

当活跃 hub 停机或无法访问时,请使用这个步骤。

流程

  1. 在恢复过程中,为了避免正确重新生成 ManifestWorks 时资源驱除,您可以放大 AppliedManifestWork 驱除 宽限期。在被动 hub 集群中,检查现有的全局 KlusterletConfig

    • 如果存在全局 KlusterletConfig,则编辑 appliedManifestWorkEvictionGracePeriod 参数的值。例如,24 小时或更多。
    • 如果全局 KlusterletConfig 不存在,则使用以下 yaml 创建 Klusterletconfig

      apiVersion: config.open-cluster-management.io/v1alpha1
      kind: KlusterletConfig
      metadata:
        name: global
      spec:
        appliedManifestWorkEvictionGracePeriod: "24h"
      Copy to Clipboard Toggle word wrap

      配置将自动传播到所有受管集群。

  2. 恢复被动 hub 集群上的备份。如需更多信息,请参阅 从备份中恢复 hub 集群

    重要

    将失败的 hub 恢复到其被动实例只会将应用程序及其 DR 保护状态恢复到其最后一个调度的备份。在最后一次调度的备份后任何受 DR 保护的应用程序都需要在新 hub 上再次保护。

  3. 验证恢复是否已完成。

    $ oc -n <restore-namespace> wait restore <restore-name> --for=jsonpath='{.status.phase}'=Finished --timeout=120s
    Copy to Clipboard Toggle word wrap
  4. 验证 Primary 和 Seconday 受管集群是否已成功导入到 RHACM 控制台,并可以访问它们。如果有任何受管集群停机或无法访问,则无法成功导入。

    在执行任何 DR 操作前,等待 DRPolicy 验证成功。

    注意

    当受管集群在被动 hub 上导入后,Submariner 会被自动安装。

  5. 验证 DRPolicy 是否已成功创建。对创建的每个 DRPolicy 资源在 Hub 集群中 运行此命令,其中 < drpolicy_name& gt; 替换为唯一名称。

    $ oc get drpolicy <drpolicy_name> -o jsonpath='{.status.conditions[].reason}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    Succeeded
    Copy to Clipboard Toggle word wrap
  6. 刷新 RHACM 控制台,以便在 Active hub 集群上启用了 DR 监控仪表板标签页。
  7. 在新 hub 集群中使用以下命令验证 DRPC 输出:

    $ oc get drpc -A -o wide
    Copy to Clipboard Toggle word wrap

    如果 PROGRESSION 显示 PAUSED 状态,则需要管理干预才能取消暂停它。PROGRESSION 在以下条件下进入 PAUSED 状态:

    • Cluster Query Failure: 在 DRPC 协调过程中成功查询任何集群。在 hub 恢复过程中可能会出现这种情况。
    • action Mismatch: DRPC 操作与查询的 VRG 操作不同。
    • Cluster Mismatch: DRPC 操作和 VRG 操作相同,但 Primary VRG 存在于与 DRPC 所期望的不同集群中。

      重要

      如果您无法诊断并解决暂停的原因,请联系红帽客户支持

      如果 PROGRESSION 处于 CompletedCleaning up,则可以安全地继续。

  8. 编辑新 hub 上的全局 KlusterletConfig,并删除 appliedManifestWorkEvictionGracePeriod 及其值的参数。
  9. 根据活跃 hub 集群还是活跃 hub 集群以及主受管集群是否已停机,根据您的场景按照以下步骤操作:

    1. 如果只有活跃的 hub 集群停机,且受管集群仍然可以访问,则不需要进一步的操作。
    2. 如果主受管集群与活跃 hub 集群一起停机,则需要将工作负载从主受管集群切换到二级受管集群。

      有关故障转移说明,根据您的工作负载类型,请参阅 基于订阅的应用程序或基于 ApplicationSet 的应用程序

  10. 如果主受管集群和活跃的 hub 集群停机,则需要将工作负载从主受管集群切换到二级受管集群。

    有关故障转移说明,根据您的工作负载类型,请参阅 基于订阅的应用程序或基于 ApplicationSet 的应用程序

  11. 验证故障转移是否成功。如果主受管集群也停机,则工作负载的 PROGRESSION 状态将处于 Cleaning Up 阶段,直到主受管集群恢复在线并成功导入到 RHACM 控制台。

    在被动 hub 集群中,运行以下命令来检查 PROGRESSION 状态。

    $ oc get drpc -o wide -A
    Copy to Clipboard Toggle word wrap

Red Hat OpenShift Data Foundation 部署可以在两个不同的地理位置扩展,为存储基础架构提供灾难恢复功能。当遇到灾难时,如两个位置中的一个部分或完全不可用,OpenShift Container Platform 部署中的 OpenShift Data FoundationOpenShift 必须能够存活。此解决方案仅适用于在基础架构服务器之间具有特定延迟要求的 edorpolitan 跨数据中心。

注意

扩展集群解决方案是为在包含数据卷的区域之间不超过 10 ms 最大往返时间(RTT)的部署而设计。对于 Arbiter 节点遵循为 etcd 指定的延迟要求,请参阅 Red Hat OpenShift Container Platform 集群的指南 - 部署生成多个站点(Data Centers/Regions)。如果您计划以更高的延迟进行部署,请联系红帽客户支持

下图显示了扩展集群的最简单的部署:

OpenShift 节点和 OpenShift Data Foundation 守护进程

OpenShift nodes and OpenShift Data Foundation daemons

在上图中,Arbiter 区域中部署的 OpenShift Data Foundation 监控 pod 具有 master 节点内置的容错能力。图中显示了每个 Data Zone 中的 master 节点,它们是高可用性 OpenShift Container Platform control plane 所需的 master 节点。另外,重要的一点是,其中一个区的 OpenShift Container Platform 节点与另外两个区的 OpenShift Container Platform 节点需要具有网络连接。

重要

现在,您可以使用 OpenShift Data Foundation 为基于 OpenShift virtualization 技术的工作负载轻松设置灾难恢复功能。如需更多信息,请参阅 OpenShift Container Platform 指南中的 OpenShift Virtualization

5.1. 启用扩展集群的要求

  • 确保已解决了跨越多个站点的部署的 OpenShift Container Platform 要求。如需更多信息,请参阅有关跨多个站点的集群部署的知识库文章
  • 确保您在三个不同的区中至少有三个 OpenShift Container Platform master 节点。三个区域中的每一区域中有一个主节点。
  • 确保至少四个 OpenShift Container Platform worker 节点分布在两个数据区中。
  • 对于裸机上的扩展集群,请使用 SSD 驱动器作为 OpenShift Container Platform master 节点的 root 驱动器。
  • 确保每个节点已预先标记其 zone 标签。如需更多信息,请参阅将拓扑区标签应用到 OpenShift Container Platform 节点部分。
  • 扩展集群解决方案是为在区域间延迟不超过 10 毫秒的部署而设计。如果您计划以更高的延迟进行部署,请联系红帽客户支持
注意

灵活的缩放和仲裁程序不能与缩放逻辑冲突同时启用。通过灵活扩展,您可以一次向 OpenShift Data Foundation 集群添加一个节点。而在 Arbiter 集群中,您需要在每个数据区中添加至少一个节点。

在一个站点停机时,具有仲裁器功能的区域使用仲裁器标签。这些标签是任意的,对于这三个位置来说必须是唯一的。

例如,您可以按如下方式标记节点:

topology.kubernetes.io/zone=arbiter for Master0

topology.kubernetes.io/zone=datacenter1 for Master1, Worker1, Worker2

topology.kubernetes.io/zone=datacenter2 for Master2, Worker3, Worker4
Copy to Clipboard Toggle word wrap
  • 将标签应用到节点:

    $ oc label node <NODENAME> topology.kubernetes.io/zone=<LABEL>
    Copy to Clipboard Toggle word wrap
    <NODENAME>
    是节点的名称
    <LABEL>
    是拓扑区标签
  • 使用三个区的示例标签来验证标签:

    $ oc get nodes -l topology.kubernetes.io/zone=<LABEL> -o name
    Copy to Clipboard Toggle word wrap
    <LABEL>

    是拓扑区标签

    或者,您可以运行单个命令来查看带有其区域的所有节点。

    $ oc get nodes -L topology.kubernetes.io/zone
    Copy to Clipboard Toggle word wrap

扩展集群拓扑区域标签现在应用于适当的 OpenShift Container Platform 节点来定义三个位置。

5.3. 安装 Local Storage Operator

在本地存储设备上创建 Red Hat OpenShift Data Foundation 集群前,请先从 Operator Hub 安装 Local Storage Operator。

流程

  1. 登录 OpenShift Web 控制台。
  2. Operators → OperatorHub
  3. Filter by keyword 框中键入 local storage,从操作器列表中搜索 Local Storage operator 并单击它。
  4. Install Operator 页面中设置以下选项:

    1. 将频道更新为 stable
    2. 安装模式是 A specific namespace on the cluster
    3. Installed Namespace 为 Operator recommended namespace openshift-local-storage
    4. 将批准更新为 Automatic
  5. Install

验证步骤

  • 验证 Local Storage Operator 是否显示绿色勾号,代表安装成功。

5.4. 安装 Red Hat OpenShift Data Foundation Operator

您可以使用 Red Hat OpenShift Container Platform Operator Hub 安装 Red Hat OpenShift Data Foundation Operator。

先决条件

  • 使用具有 cluster-admin 和 Operator 安装权限的账户访问 OpenShift Container Platform 集群。
  • 您必须至少在 Red Hat OpenShift Container Platform 集群的两个数据中心中平均分配四个 worker 节点。
  • 有关其他资源要求,请参阅规划您的部署
重要
  • 当您需要覆盖 OpenShift Data Foundation 的集群范围默认节点选择器时,您可以在命令行界面中使用以下命令为 openshift-storage 命名空间指定空白节点选择器(在这种情况下创建 openshift-storage 命名空间):

    $ oc annotate namespace openshift-storage openshift.io/node-selector=
    Copy to Clipboard Toggle word wrap
  • 将节点作为 infra 污点,以确保只在该节点上调度 Red Hat OpenShift Data Foundation 资源。这有助于您节省订阅成本。如需更多信息,请参阅管理和分配存储资源指南中的如何将专用 worker 节点用于 Red Hat OpenShift Data Foundation 章节。

流程

  1. 登录 OpenShift Web 控制台。
  2. Operators → OperatorHub
  3. Filter by keyword 框中滚动或键入 OpenShift Data Foundation,以查找 OpenShift Data Foundation Operator。
  4. Install
  5. Install Operator 页面中设置以下选项:

    1. 将频道更新为 stable-4.15
    2. 安装模式是 A specific namespace on the cluster
    3. Installed Namespace 为 Operator recommended namespace openshift-storage。如果命名空间 openshift-storage 不存在,它会在 Operator 安装过程中创建。
    4. Approval Strategy 选为 AutomaticManual

      如果选择 Automatic 更新,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需任何干预。

      如果选择了 手动 更新,则 OLM 会创建一个更新请求。作为集群管理员,您必须手动批准该更新请求,才能将 Operator 更新至更新的版本。

  6. 确保为 Console 插件 选择了 Enable 选项。
  7. Install

验证步骤

  • 成功安装 Operator 后,用户界面中会显示一个带有 Web console update is available 信息的弹出窗口。点这个弹出窗口中的 Refresh web console 来反映控制台的更改。
  • 在 Web 控制台中:

    • 进入到 Installed Operators,再验证 OpenShift Data Foundation Operator 是否显示绿色勾号,指示安装成功。
    • 进入到 Storage,再验证 Data Foundation 仪表板是否可用。

5.5. 创建 OpenShift Data Foundation 集群

先决条件

流程

  1. 在 OpenShift Web 控制台中,点 Operators → Installed Operators 查看所有已安装的 Operator。

    确保所选 项目openshift-storage

  2. 单击 OpenShift Data Foundation 操作器,然后单击 Create StorageSystem
  3. 在 Backing storage 页面中,选择 Create a new StorageClass using the local storage devices 选项。
  4. 点击 Next

    重要

    如果还没有安装,系统会提示您安装 Local Storage Operator。点 Install 并按照 Installing Local Storage Operator 中所述的步骤进行操作。

  5. Create local volume set 页面中,提供以下信息:

    1. LocalVolumeSetStorageClass 输入一个名称。

      默认情况下,存储类名称会出现本地卷集名称。您可以更改名称。

    2. 选择以下任意一项:

      • 所有节点上的磁盘

        使用与所有节点上所选过滤器匹配的可用磁盘。

      • 所选节点上的磁盘

        仅在所选节点上使用与所选过滤器匹配的可用磁盘。

        重要

        如果选择的节点与 OpenShift Data Foundation 的一个聚合的 30 个 CPU 和 72 GiB RAM 的要求不匹配,则会部署一个最小的集群。

        如需最低起始节点要求,请参阅 规划指南中的资源要求部分。

    3. 选择 SSDNVMe 来构建受支持的配置。您可以为不支持的测试安装选择 HDD
    4. 展开 Advanced 部分并设置以下选项:

      卷模式

      默认会选择块。

      设备类型

      从下拉列表中选择一个或多个设备类型。

      磁盘大小

      为设备设置最小 100GB 大小,以及需要包含的设备的最大可用大小。

      磁盘限制上限

      这表示节点上可以创建的 PV 数量上限。如果此字段留空,则为匹配节点上的所有可用磁盘创建 PV。

    5. Next

      此时会显示一个用于确认创建 LocalVolumeSet 的弹出窗口。

    6. 单击 Yes 以继续。
  6. Capacity 和 nodes 页面中,配置以下内容:

    1. 可用的原始容量会根据与存储类关联的所有附加磁盘填充容量值。这将需要一些时间才能出现。

      Selected nodes 列表根据存储类显示节点。

    2. 如果要使用扩展集群,选择 Enable arbiter 复选框。这个选项只有在满足仲裁程序的所有先决条件并且填充了所选节点时才可用。如需更多信息,请参阅启用扩展集群 的要求中的 Arbiter 扩展集群 要求。

      从下拉列表中选择 arbiter 区域

  7. 配置性能选择一个性能配置集

    您还可以使用 StorageSystems 选项卡的选项菜单中的 Configure performance 选项在部署后配置性能配置集。

    重要

    在选择资源配置集前,请确保检查集群中资源的当前可用性。在资源不足的集群中选择更高的资源配置集可能会导致安装失败。有关资源要求的更多信息,请参阅 性能配置集的资源要求

    1. Next
  8. 可选:在 Security and network 页面中,根据您的要求进行配置:

    1. 若要启用加密,可选择为块存储和文件存储启用数据加密。
    2. 选择以下加密级别之一:

      • Cluster-wide encryption 来加密整个集群(块存储和文件存储)。
      • Storage class encryption 以使用加密启用的存储类创建加密的持久性卷(仅限块)。
    3. 可选:选择 Connect to an external key management service 复选框。这是集群范围加密的可选选项。

      1. Key Management Service Provider 下拉列表中,选择 VaultThales CipherTrust Manager (using KMIP)。如果选择了 Vault,请进入下一步。如果您选择了 Thales CipherTrust Manager (using KMIP),请转到步骤 iii。
      2. 选择身份验证方法

        使用令牌验证方法
        • 输入唯一的连接名称 , Vault 服务器的主机地址('https://<hostname 或 ip>'),端口号和令牌
        • 展开 Advanced Settings,以根据您的 Vault 配置输入其他设置和证书详情:

          • 后端路径中输入为 OpenShift Data Foundation 专用且唯一的 Key Value secret 路径。
          • (可选)输入 TLS 服务器名称Vault Enterprise 命名空间
          • 上传对应的 PEM 编码证书文件,以提供 CA 证书客户端证书客户端私钥
          • Save 并跳过步骤 iv。
        使用 Kubernetes 验证方法
        • 输入唯一的 Vault Connection Name, Vault 服务器的主机地址('https://<hostname 或 ip>')、端口号和角色名称。
        • 展开 Advanced Settings,以根据您的 Vault 配置输入其他设置和证书详情:

          • 后端路径中输入为 OpenShift Data Foundation 专用且唯一的 Key Value secret 路径。
          • 可选:输入 TLS Server NameAuthentication Path (如果适用)。
          • 上传对应的 PEM 编码证书文件,以提供 CA 证书客户端证书客户端私钥
          • Save 并跳过步骤 iv。
      3. 要使用 Thales CipherTrust Manager (using KMIP) 作为 KMS 供应商,请按照以下步骤执行:

        1. 在项目中输入密钥管理服务的唯一连接名称
        2. AddressPort 部分中,输入 Thales CipherTrust Manager 的 IP 以及在其中启用了 KMIP 接口的端口。例如:

          • 地址: 123.34.3.2
          • 端口 :5696
        3. 上传 客户端证书CA 证书客户端私钥
        4. 如果启用了 StorageClass 加密,请输入用于加密和解密的唯一标识符。
        5. TLS Server 字段是可选的,并在没有 KMIP 端点的 DNS 条目时使用。例如,kmip_all_<port>.ciphertrustmanager.local
    4. 如果您使用 单个网络,则网络设置为 Default (OVN)。

      如果您使用多个网络接口,则可以切换到 Custom (Multus),然后选择以下任意一个:

      1. 从下拉菜单中选择公共网络接口。
      2. 从下拉菜单中选择集群网络接口。
    注意

    如果您只使用一个额外网络接口,请选择单个 NetworkAttachementDefinition,即 ocs-public-cluster 用于公共网络接口,并将 Cluster Network Interface 留空。

    1. 点击 Next
  9. 数据保护 页面中,单击 Next
  10. Review and create 页面中,检查配置详情。

    若要修改任何配置设置,请单击 Back 以返回到上一配置页面。

  11. 单击 Create StorageSystem

验证步骤

  • 验证已安装存储集群的最终状态:

    1. 在 OpenShift Web 控制台中,导航到 Installed OperatorsOpenShift Data FoundationStorage Systemocs-storagecluster-storagesystemResources
    2. 验证 StorageClusterStatus 是否为 Ready,并在其旁边有一个绿色勾号标记。
  • 对于部署的仲裁模式:

    1. 在 OpenShift Web 控制台中,导航到 Installed OperatorsOpenShift Data FoundationStorage Systemocs-storagecluster-storagesystemResourcesocs-storagecluster
    2. 在 YAML 选项卡中,在 spec 部分搜索 arbiter 键,并确保 enable 设置为 true

      spec:
          arbiter:
            enable: true
          [..]
          nodeTopologies:
            arbiterLocation: arbiter #arbiter zone
          storageDeviceSets:
          - config: {}
            count: 1
              [..]
            replica: 4
      status:
          conditions:
          [..]
          failureDomain: zone
      Copy to Clipboard Toggle word wrap
  • 要验证 OpenShift Data Foundation 的所有组件是否已成功安装,请参阅验证您的 OpenShift 数据基础安装

5.6. 验证 OpenShift Data Foundation

验证 OpenShift Data Foundation 是否已正确部署:

5.6.1. 验证 pod 的状态

流程

  1. 从 OpenShift Web 控制台点 Workloads → Pods
  2. Project 下拉列表中选择 openshift-storage

    注意

    如果禁用 Show default projects 选项,请使用切换按钮列出所有默认项目。

    有关每个组件预期的 pod 数量及其变化取决于节点数量的更多信息,请参阅 表 5.1 “对应 OpenShift Data Foundation 集群的 Pod”

  3. RunningCompleted 标签页验证以下 pod 是否处于 RunningCompleted 状态:
Expand
表 5.1. 对应 OpenShift Data Foundation 集群的 Pod
组件对应的 pod

OpenShift Data Foundation Operator

  • OCS-operator-*(在任何 worker 节点上有 1 个 pod)
  • ocS-metrics-exporter-*(任何 worker 节点上 1 个 pod)
  • odF-operator-controller-manager-*(任何 worker 节点上 1 个 pod)
  • odf-console-* (任何 worker 节点上 1 个 pod)
  • csi-addons-controller-manager-* (任何 worker 节点上 1 个 pod)

Rook-ceph Operator

rook-ceph-operator-*

(任何 worker 节点上有 1 个 pod)

多云对象网关

  • noobaa-operator-* (任何 worker 节点上 1 个 pod)
  • noobaa-core-* (任何存储节点上 1 个 pod)
  • noobaa-db-pg-* (任何存储节点上 1 个 pod)
  • noobaa-endpoint-* (任何存储节点上 1 个 pod)

MON

rook-ceph-mon-*

(5 个 pod 分布到 3 个区域,每个数据中心区域 2 个,1 个在仲裁区域内)

MGR

rook-ceph-mgr-*

(任何存储节点 2 个 pod)

MDS

rook-ceph-mds-ocs-storagecluster-cephfilesystem-*

(2 个 pod 分布到 2 个数据中心区域)

RGW

rook-ceph-rgw-ocs-storagecluster-cephobjectstore-*

(2 个 pod 分布到 2 个数据中心区域)

CSI

  • cephfs

    • csi-cephfsplugin-* (每个 worker 节点上 1 个 pod)
    • csi-cephfsplugin-provisioner-* (2 个 pod 在不同的 worker 节点上分布)
  • rbd

    • csi-rbdplugin-* (每个 worker 节点上 1 个 pod)
    • csi-rbdplugin-provisioner-* (2 个 pod 在不同的 worker 节点上分步)

rook-ceph-crashcollector

rook-ceph-crashcollector-*

(每个存储节点 1 个 pod,1 个 pod 在仲裁区域上)

OSD

  • rook-ceph-osd-* (每个设备 1 个 pod)
  • rook-ceph-osd-prepare-ocs-deviceset-* (每个设备 1 个 pod)

5.6.2. 验证 OpenShift Data Foundation 集群是否健康

流程

  1. 在 OpenShift Web 控制台中,点 StorageData Foundation
  2. Overview 选项卡的 Status 卡中,点 Storage System,然后点弹出框中的存储系统链接。
  3. Block and File 选项卡的 Status 卡中,验证 Storage Cluster 是否具有绿色勾号。
  4. Details 卡中,验证是否显示集群信息。

如需有关使用 Block and File 仪表板的 OpenShift Data Foundation 集群健康的更多信息,请参阅 监控 OpenShift Data Foundation

5.6.3. 验证 Multicloud 对象网关是否健康

流程

  1. 在 OpenShift Web 控制台中,点 StorageData Foundation
  2. Overview 选项卡的 Status 卡中,点 Storage System,然后点弹出框中的存储系统链接。

    1. Object 选项卡的 Status 卡 中,验证 Object Service数据弹性 都具有绿色勾号。
    2. Details 卡中,验证是否显示了 MCG 信息。

如需有关使用对象服务仪表板的 OpenShift Data Foundation 集群健康的更多信息,请参阅监控 OpenShift Data Foundation

重要

Multicloud 对象网关只有一个数据库副本(NooBaa DB)。这意味着,如果 NooBaa DB PVC 被破坏,且我们无法恢复它,可能会导致位于 Multicloud Object Gateway 上的适用数据的数据丢失。因此,红帽建议定期备份 NooBaa DB PVC。如果 NooBaa DB 失败且无法恢复,您可以恢复到最新的备份版本。有关备份 NooBaa DB 的说明,请按照 本知识库文章 中的步骤操作。

5.6.4. 验证特定的存储类是否存在

流程

  1. 从 OpenShift Web 控制台左侧窗格中,点击 Storage → Storage Classes
  2. 验证是否在创建 OpenShift Data Foundation 集群时创建了以下存储类:

    • ocs-storagecluster-ceph-rbd
    • ocs-storagecluster-cephfs
    • openshift-storage.noobaa.io
    • ocs-storagecluster-ceph-rgw

5.7. 安装区示例应用程序

部署区域感知示例应用,以验证 OpenShift Data Foundation,扩展集群设置是否正确配置。

重要

随着数据区域之间的延迟,可以预期与节点和区域之间具有低延迟的 OpenShift 集群(例如,同一位置的所有节点)相比,可以看到性能下降。性能下降的速度取决于区域之间的延迟和使用存储(如高写流量)的应用程序行为。请确保使用扩展集群配置测试关键应用程序,以确保应用程序性能达到所需的服务水平。

ReadWriteMany(RWX)持久性卷声明(PVC)是使用 ocs-storagecluster-cephfs 存储类创建的。多个 pod 同时使用新创建的 RWX PVC。使用的应用称为文件上传程序。

演示应用程序如何在拓扑区间分布,以便在站点中断时仍然可用:

注意

此演示是可行的,因为此应用共享同一个 RWX 卷来存储文件。这也适用于持久数据访问,因为 Red Hat OpenShift Data Foundation 被配置为具有区感知和高可用性的扩展集群。

  1. 创建一个新项目。

    $ oc new-project my-shared-storage
    Copy to Clipboard Toggle word wrap
  2. 部署名为 file-uploader 的示例 PHP 应用。

    $ oc new-app openshift/php:latest~https://github.com/mashetty330/openshift-php-upload-demo --name=file-uploader
    Copy to Clipboard Toggle word wrap

    输出示例:

    Found image 4f2dcc0 (9 days old) in image stream "openshift/php" under tag "7.2-ubi8" for "openshift/php:7.2-
    ubi8"
    
    Apache 2.4 with PHP 7.2
    -----------------------
    PHP 7.2 available as container is a base platform for building and running various PHP 7.2 applications and frameworks. PHP is an HTML-embedded scripting language. PHP attempts to make it easy for developers to write dynamically generated web pages. PHP also offers built-in database integration for several commercial and non-commercial database management systems, so writing a database-enabled webpage with PHP is fairly simple. The most common
    use of PHP coding is probably as a replacement for CGI scripts.
    
    Tags: builder, php, php72, php-72
    
    * A source build using source code from https://github.com/christianh814/openshift-php-upload-demo will be cr
    eated
    * The resulting image will be pushed to image stream tag "file-uploader:latest"
    * Use 'oc start-build' to trigger a new build
    
    --> Creating resources ...
        imagestream.image.openshift.io "file-uploader" created
        buildconfig.build.openshift.io "file-uploader" created
        deployment.apps "file-uploader" created
        service "file-uploader" created
    --> Success
        Build scheduled, use 'oc logs -f buildconfig/file-uploader' to track its progress.
    
        Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
         'oc expose service/file-uploader'
    
        Run 'oc status' to view your app.
    Copy to Clipboard Toggle word wrap
  3. 查看构建日志并等待应用部署好。

    $ oc logs -f bc/file-uploader -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    输出示例:

    Cloning "https://github.com/christianh814/openshift-php-upload-demo" ...
    
        [...]
        Generating dockerfile with builder image image-registry.openshift-image-regis
    try.svc:5000/openshift/php@sha256:d97466f33999951739a76bce922ab17088885db610c
    0e05b593844b41d5494ea
    STEP 1: FROM image-registry.openshift-image-registry.svc:5000/openshift/php@s
    ha256:d97466f33999951739a76bce922ab17088885db610c0e05b593844b41d5494ea
    STEP 2: LABEL "io.openshift.build.commit.author"="Christian Hernandez <christ
    ian.hernandez@yahoo.com>"       "io.openshift.build.commit.date"="Sun Oct 1 1
    7:15:09 2017 -0700"       "io.openshift.build.commit.id"="288eda3dff43b02f7f7
    b6b6b6f93396ffdf34cb2"       "io.openshift.build.commit.ref"="master"       "
    io.openshift.build.commit.message"="trying to modularize"       "io.openshift
    .build.source-location"="https://github.com/christianh814/openshift-php-uploa
    d-demo"       "io.openshift.build.image"="image-registry.openshift-image-regi
    stry.svc:5000/openshift/php@sha256:d97466f33999951739a76bce922ab17088885db610
    c0e05b593844b41d5494ea"
    STEP 3: ENV OPENSHIFT_BUILD_NAME="file-uploader-1"     OPENSHIFT_BUILD_NAMESP
    ACE="my-shared-storage"     OPENSHIFT_BUILD_SOURCE="https://github.com/christ
    ianh814/openshift-php-upload-demo"     OPENSHIFT_BUILD_COMMIT="288eda3dff43b0
    2f7f7b6b6b6f93396ffdf34cb2"
    STEP 4: USER root
    STEP 5: COPY upload/src /tmp/src
    STEP 6: RUN chown -R 1001:0 /tmp/src
    STEP 7: USER 1001
    STEP 8: RUN /usr/libexec/s2i/assemble
    ---> Installing application source...
    => sourcing 20-copy-config.sh ...
    ---> 17:24:39     Processing additional arbitrary httpd configuration provide
    d by s2i ...
    => sourcing 00-documentroot.conf ...
    => sourcing 50-mpm-tuning.conf ...
    => sourcing 40-ssl-certs.sh ...
    STEP 9: CMD /usr/libexec/s2i/run
    STEP 10: COMMIT temp.builder.openshift.io/my-shared-storage/file-uploader-1:3
    b83e447
    Getting image source signatures
    
    [...]
    Copy to Clipboard Toggle word wrap

    当您看到 Push successful 后,命令提示符会从 tail 模式返回。

    注意

    new-app 命令直接从 git 存储库部署应用,而不使用 OpenShift 模板,因此默认情况下不创建 OpenShift 路由资源。您需要手动创建路线。

扩展应用程序

  1. 将应用缩放为四个副本,并公开其服务,使应用区域了解和可用。

    $ oc expose svc/file-uploader -n my-shared-storage
    Copy to Clipboard Toggle word wrap
    $ oc scale --replicas=4 deploy/file-uploader -n my-shared-storage
    Copy to Clipboard Toggle word wrap
    $ oc get pods -o wide -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    几分钟后,您应该有四个 file-uploader pod。重复上述命令,直到有 4 个文件加载程序容器集处于 Running 状态。

  2. 创建 PVC 并将其附加到应用程序中。

    $ oc set volume deploy/file-uploader --add --name=my-shared-storage \
    -t pvc --claim-mode=ReadWriteMany --claim-size=10Gi \
    --claim-name=my-shared-storage --claim-class=ocs-storagecluster-cephfs \
    --mount-path=/opt/app-root/src/uploaded \
    -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    这个命令:

    • 创建 PVC。
    • 更新应用部署,以包含卷定义。
    • 更新应用部署,将卷挂载附加到指定的 mount-path 中。
    • 使用四个应用 pod 创建一个新部署。
  3. 检查添加卷的结果。

    $ oc get pvc -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    my-shared-storage   Bound    pvc-5402cc8a-e874-4d7e-af76-1eb05bd2e7c7   10Gi       RWX            ocs-storagecluster-cephfs   52s
    Copy to Clipboard Toggle word wrap

    注意 ACCESS MODE 已设置为 RWX。

    所有四个 file-uploader pod 都使用相同的 RWX 卷。如果没有这种访问模式,OpenShift 不会尝试可靠地将多个容器集附加到同一持久卷(PV)。如果您试图扩展正在使用 ReadWriteOnce(RWO) PV 的部署,则 pod 可能会在同一节点上在一起。

5.7.1. 安装后扩展应用程序

流程

  1. 将应用缩放为四个副本,并公开其服务,使应用区域了解和可用。

    $ oc expose svc/file-uploader -n my-shared-storage
    Copy to Clipboard Toggle word wrap
    $ oc scale --replicas=4 deploy/file-uploader -n my-shared-storage
    Copy to Clipboard Toggle word wrap
    $ oc get pods -o wide -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    几分钟后,您应该有四个 file-uploader pod。重复上述命令,直到有 4 个文件加载程序容器集处于 Running 状态。

  2. 创建 PVC 并将其附加到应用程序中。

    $ oc set volume deploy/file-uploader --add --name=my-shared-storage \
    -t pvc --claim-mode=ReadWriteMany --claim-size=10Gi \
    --claim-name=my-shared-storage --claim-class=ocs-storagecluster-cephfs \
    --mount-path=/opt/app-root/src/uploaded \
    -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    这个命令:

    • 创建 PVC。
    • 更新应用部署,以包含卷定义。
    • 更新应用部署,将卷挂载附加到指定的 mount-path 中。
    • 使用四个应用 pod 创建一个新部署。
  3. 检查添加卷的结果。

    $ oc get pvc -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    输出示例:

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
    my-shared-storage   Bound    pvc-5402cc8a-e874-4d7e-af76-1eb05bd2e7c7   10Gi       RWX            ocs-storagecluster-cephfs   52s
    Copy to Clipboard Toggle word wrap

    注意 ACCESS MODE 已设置为 RWX。

    所有四个 file-uploader pod 都使用相同的 RWX 卷。如果没有这种访问模式,OpenShift 不会尝试可靠地将多个容器集附加到同一持久卷(PV)。如果您试图扩展正在使用 ReadWriteOnce(RWO) PV 的部署,则 pod 可能会在同一节点上在一起。

5.7.2. 将 Deployment 修改为区域 Aware

目前,file-uploader Deployment 不是区域感知型,它可以调度同一区域中的所有 pod。在这种情况下,如果站点中断,则应用不可用。如需更多信息,请参阅使用 pod 拓扑分布限制控制 pod 放置

  1. 在应用部署配置中添加容器集放置规则,使应用区域感知。

    1. 运行以下命令并查看输出:

      $ oc get deployment file-uploader -o yaml -n my-shared-storage | less
      Copy to Clipboard Toggle word wrap

      输出示例:

      [...]
      spec:
        progressDeadlineSeconds: 600
        replicas: 4
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            deployment: file-uploader
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            annotations:
              openshift.io/generated-by: OpenShiftNewApp
            creationTimestamp: null
            labels:
              deployment: file-uploader
            spec: # <-- Start inserted lines after here
              containers: # <-- End inserted lines before here
              - image: image-registry.openshift-image-registry.svc:5000/my-shared-storage/file-uploader@sha256:a458ea62f990e431ad7d5f84c89e2fa27bdebdd5e29c5418c70c56eb81f0a26b
                imagePullPolicy: IfNotPresent
                name: file-uploader
      [...]
      Copy to Clipboard Toggle word wrap
    2. 编辑部署以使用拓扑区标签。

      $ oc edit deployment file-uploader -n my-shared-storage
      Copy to Clipboard Toggle word wrap

      StartEnd (上一步中的输出中显示)之间添加以下新行:

      [...]
          spec:
            topologySpreadConstraints:
              - labelSelector:
                  matchLabels:
                    deployment: file-uploader
                maxSkew: 1
                topologyKey: topology.kubernetes.io/zone
                whenUnsatisfiable: DoNotSchedule
              - labelSelector:
                  matchLabels:
                    deployment: file-uploader
                maxSkew: 1
                topologyKey: kubernetes.io/hostname
                whenUnsatisfiable: ScheduleAnyway
            nodeSelector:
              node-role.kubernetes.io/worker: ""
            containers:
      [...]
      Copy to Clipboard Toggle word wrap

      输出示例:

      deployment.apps/file-uploader edited
      Copy to Clipboard Toggle word wrap
  2. 将部署缩减为个容器集,然后重新扩展到四个容器集。这是必要的,因为部署在 pod 的放置方面发生了变化。

    缩减至个 pod
    $ oc scale deployment file-uploader --replicas=0 -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    输出示例:

    deployment.apps/file-uploader scaled
    Copy to Clipboard Toggle word wrap
    扩展到个 pod
    $ oc scale deployment file-uploader --replicas=4 -n my-shared-storage
    Copy to Clipboard Toggle word wrap

    输出示例:

    deployment.apps/file-uploader scaled
    Copy to Clipboard Toggle word wrap
  3. 验证这四个容器集分散到 datacenter1 和 datacenter2 区域中的四个节点上。

    $ oc get pods -o wide -n my-shared-storage | egrep '^file-uploader'| grep -v build | awk '{print $7}' | sort | uniq -c
    Copy to Clipboard Toggle word wrap

    输出示例:

       1 perf1-mz8bt-worker-d2hdm
       1 perf1-mz8bt-worker-k68rv
       1 perf1-mz8bt-worker-ntkp8
       1 perf1-mz8bt-worker-qpwsr
    Copy to Clipboard Toggle word wrap

    搜索所用的区域标签。

    $ oc get nodes -L topology.kubernetes.io/zone | grep datacenter | grep -v master
    Copy to Clipboard Toggle word wrap

    输出示例:

    perf1-mz8bt-worker-d2hdm   Ready    worker   35d   v1.20.0+5fbfd19   datacenter1
    perf1-mz8bt-worker-k68rv   Ready    worker   35d   v1.20.0+5fbfd19   datacenter1
    perf1-mz8bt-worker-ntkp8   Ready    worker   35d   v1.20.0+5fbfd19   datacenter2
    perf1-mz8bt-worker-qpwsr   Ready    worker   35d   v1.20.0+5fbfd19   datacenter2
    Copy to Clipboard Toggle word wrap
  4. 使用浏览器中的 file-uploader Web 应用上传新文件。

    1. 查找创建的路由。

      $ oc get route file-uploader -n my-shared-storage -o jsonpath --template="http://{.spec.host}{'\n'}"
      Copy to Clipboard Toggle word wrap

      输出示例:

      http://file-uploader-my-shared-storage.apps.cluster-ocs4-abdf.ocs4-abdf.sandbox744.opentlc.com
      Copy to Clipboard Toggle word wrap
    2. 使用上一步中的路由将浏览器指向 Web 应用。

      Web 应用会列出所有上传的文件,并可以上传新文件并下载现有数据。现在,并没有任何内容。

    3. 从本地计算机中选择一个任意文件,并将它上传到应用程序。

      1. 单击 Choose file 以选择任意文件。
      2. Upload

        图 5.1. 基于 PHP 的简单文件上传工具

    4. 单击 已上传文件列表,以查看所有当前上传的文件的列表。
注意

OpenShift Container Platform 镜像 registry、入口路由和监控服务不被区识别

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 状态,且不会在没有手动干预的情况下在活跃区中重新创建。

检查 OpenShift Container Platform 节点,其状态为 NotReady。可能会出现阻止节点与 OpenShift 控制平面通信的问题。但是,节点可能仍然在对持久卷(PV)执行 I/O 操作。

如果两个 pod 同时写入同一个 RWO 卷,则存在数据崩溃的风险。确保 NotReady 节点上的进程被终止或阻止,直到它们终止为止。

解决方案示例:

  • 使用带外管理系统在确认的情况下关闭节点,以确保进程终止。
  • 撤回节点在故障站点使用的网络路由与存储通信。

    注意

    在将服务恢复到失败的区域或节点前,请确认所有带有 PV 的 pod 已被成功终止。

要让 Terminating pod 在活跃区中重新创建,您可以强制删除 pod 或删除关联的 PV 上的终结器。完成这两个操作之一后,应用程序 Pod 应在 active 区域中重新创建,并成功挂载其 RWO 存储。

强制删除 pod

强制删除不会等待来自 kubelet 的确认,但不会等待 pod 已终止。

$ oc delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Copy to Clipboard Toggle word wrap
<PODNAME>
是 pod 的名称
<NAMESPACE>
是项目的命名空间
删除关联的 PV 上的终结器

找到由 Terminating pod 挂载的持久性卷声明(PVC)关联的 PV,并使用 oc patch 命令删除终结器。

$ oc patch -n openshift-storage pv/<PV_NAME> -p '{"metadata":{"finalizers":[]}}' --type=merge
Copy to Clipboard Toggle word wrap
<PV_NAME>

是 PV 的名称

查找关联的 PV 的一种简单方法是描述 Terminating pod。如果您看到多附件警告,在警告中应具有 PV 名称(例如: pvc-0595a8d2-683f-443b-aee0-6e547f5f5a7c)。

$ oc describe pod <PODNAME> --namespace <NAMESPACE>
Copy to Clipboard Toggle word wrap
<PODNAME>
是 pod 的名称
<NAMESPACE>

是项目的命名空间

输出示例:

[...]
Events:
  Type     Reason                  Age   From                     Message
  ----     ------                  ----  ----                     -------
  Normal   Scheduled               4m5s  default-scheduler        Successfully assigned openshift-storage/noobaa-db-pg-0 to perf1-mz8bt-worker-d2hdm
  Warning  FailedAttachVolume      4m5s  attachdetach-controller  Multi-Attach error for volume "pvc-0595a8d2-683f-443b-aee0-6e547f5f5a7c" Volume is already exclusively attached to one node and can't be attached to another
Copy to Clipboard Toggle word wrap

5.8.5. 恢复 StatefulSet pod

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

要让 StatefulSet 的 pod 部分在 6-8 分钟后在活跃区中重新创建,您需要强制删除具有与 RWO 卷的 pod 相同的要求(即,关闭或断开通信)的 pod。

第 6 章 监控灾难恢复健康状况

6.1. 为灾难恢复启用监控

使用这个流程为您的灾难恢复设置启用基本监控。

流程

  1. 在 Hub 集群中,打开一个终端窗口
  2. 将以下标签添加到 openshift-operator 命名空间。

    $ oc label namespace openshift-operators openshift.io/cluster-monitoring='true'
    Copy to Clipboard Toggle word wrap
注意

您必须始终为 Regional-DR 解决方案添加此标签。

6.2. 在 Hub 集群上启用灾难恢复仪表板

本节介绍了在 Hub 集群上为高级监控启用灾难恢复仪表板。

对于 Regional-DR,仪表板会显示 operator 健康、集群运行状况、指标、警报和应用程序计数的监控状态卡。

对于 Metro-DR,您可以将仪表板配置为仅监控帧设置健康和应用程序计数。

先决条件

  • 确保已安装以下内容

    • OpenShift Container Platform 版本 4.16 并具有管理员特权。
    • 启用控制台插件的 ODF Multicluster Orchestrator。
    • 来自 Operator Hub 的 Red Hat Advanced Cluster Management for Kubernetes 2.11 (RHACM)。有关如何安装的步骤,请参阅安装 RHACM
  • 确保已在 RHACM 上启用了可观察性。请参阅 启用可观察性指南

流程

  1. 在 Hub 集群中,打开终端窗口并执行以下步骤。
  2. 创建名为 observability-metrics-custom-allowlist.yaml 的 configmap 文件。

    您可以使用以下 YAML 列出 Hub 集群上的灾难恢复指标。详情请参阅 添加自定义指标。要了解有关 ramen 指标的更多信息,请参阅 灾难恢复指标

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: observability-metrics-custom-allowlist
      namespace: open-cluster-management-observability
    data:
      metrics_list.yaml: |
        names:
          - ceph_rbd_mirror_snapshot_sync_bytes
          - ceph_rbd_mirror_snapshot_snapshots
        matches:
          - __name__="csv_succeeded",exported_namespace="openshift-dr-system",name=~"odr-cluster-operator.*"
          - __name__="csv_succeeded",exported_namespace="openshift-operators",name=~"volsync.*"
    Copy to Clipboard Toggle word wrap
  3. open-cluster-management-observability 命名空间中运行以下命令:

    $ oc apply -n open-cluster-management-observability -f observability-metrics-custom-allowlist.yaml
    Copy to Clipboard Toggle word wrap
  4. 创建 observability-metrics-custom-allowlist yaml 后,RHACM 将开始从所有受管集群收集列出的 OpenShift Data Foundation 指标。

    要排除特定受管集群来收集可观察性数据,请在集群中添加以下集群标签 clusters: observability: disabled

6.3. 查看灾难恢复复制关系的健康状态

先决条件

确保您为监控启用了灾难恢复仪表板。具体步骤,请参阅在 Hub 集群上启用灾难恢复仪表板

流程

  1. 在 Hub 集群中,确保选择了 All Clusters 选项。
  2. 刷新控制台,使 DR 监控仪表板标签页可以访问。
  3. 进入 Data Services 并点 Data policies
  4. 在 Overview 选项卡中,您可以查看 operator、集群和应用程序的健康状态。绿色勾号表示操作器正在运行且可用。
  5. Disaster recovery 选项卡查看 DR 策略详情和连接的应用程序列表。

6.4. 灾难恢复指标

这些是 prometheus scrapped 的框架指标。

  • ramen_last_sync_timestamp_seconds
  • ramen_policy_schedule_interval_seconds
  • ramen_last_sync_duration_seconds
  • ramen_last_sync_data_bytes
  • ramen_workload_protection_status

从安装了 Red Hat Advanced Cluster Management for Kubernetes (RHACM operator)的 Hub 集群运行这些指标。

6.4.1. 最后同步时间戳(以秒为单位)

这是以秒为单位,可让每个应用程序最近成功同步所有 PVC 的时间(以秒为单位)。

指标名称
ramen_last_sync_timestamp_seconds
指标类型
量表
标签
  • objtype: 对象的类型,此处的 DRPC
  • ObjName: 对象的名称,这里是 DRPC-Name
  • ObjNamespace: DRPC 命名空间
  • policyName: DRPolicy 的名称
  • schedulingInterval :来自 DRPolicy 的调度间隔值
指标值
该值被设置为 Unix 秒,从 DRPC 状态获取 lastGroupSyncTime

6.4.2. 策略调度间隔(以秒为单位)

这提供了 DRPolicy 的调度间隔(以秒为单位)。

指标名称
ramen_policy_schedule_interval_seconds
指标类型
量表
标签
  • policyName: DRPolicy 的名称
指标值
这设置为从 DRPolicy 进行的调度间隔(以秒为单位)。

6.4.3. 最后同步持续时间(以秒为单位)

这代表了从每个应用程序所有 PVC 的最新成功同步的最长时间。

指标名称
ramen_last_sync_duration_seconds
指标类型
量表
标签
  • obj_type: 对象的 Type,此处为 DRPC
  • obj_name: 对象的名称,这里是 DRPC-Name
  • obj_namespace: DRPC 命名空间
  • scheduling_interval :来自 DRPolicy 的调度间隔值
指标值
该值取自 DRPC 状态的 lastGroupSyncDuration

6.4.4. 从最新同步传输的总字节数

这个值代表从每个应用程序的所有 PVC 的最新成功同步传输的总字节数。

指标名称
ramen_last_sync_data_bytes
指标类型
量表
标签
  • obj_type: 对象的 Type,此处为 DRPC
  • obj_name: 对象的名称,这里是 DRPC-Name
  • obj_namespace: DRPC 命名空间
  • scheduling_interval :来自 DRPolicy 的调度间隔值
指标值
该值取自 DRPC 状态中的 lastGroupSyncBytes

6.4.5. 工作负载保护状态

这个值为每个受 DR 保护的应用程序提供应用程序保护状态。

指标名称
ramen_workload_protection_status
指标类型
量表
标签
  • objtype: 对象的类型,此处的 DRPC
  • ObjName: 对象的名称,这里是 DRPC-Name
  • ObjNamespace: DRPC 命名空间
指标值
该值可以是 "1" 或 "0",其中 "1" 表示应用程序 DR 保护处于健康状态,"0"表示应用程序保护丢失,并可能取消保护。

6.5. 灾难恢复警报

本节提供了在灾难恢复环境中与 Red Hat OpenShift Data Foundation 关联的所有支持警报的列表。

记录规则

  • record: ramen_sync_duration_seconds

    表达式
    sum by (obj_name, obj_namespace, obj_type, job, policyname)(time() - (ramen_last_sync_timestamp_seconds > 0))
    Copy to Clipboard Toggle word wrap
    用途
    卷组最后一次同步时间和时间(以秒为单位)之间的时间间隔。
  • Record: ramen_rpo_difference

    表达式
    ramen_sync_duration_seconds{job="ramen-hub-operator-metrics-service"} / on(policyname, job) group_left() (ramen_policy_schedule_interval_seconds{job="ramen-hub-operator-metrics-service"})
    Copy to Clipboard Toggle word wrap
    用途
    预期同步延迟和卷复制组所使用的实际同步延迟之间的差别。
  • record: count_persistentvolumeclaim_total

    表达式
    count(kube_persistentvolumeclaim_info)
    Copy to Clipboard Toggle word wrap
    用途
    来自受管集群的所有 PVC 的总和。

警报

  • alert: VolumeSynchronizationDelay

    影响
    Critical
    用途
    卷复制组占用的实际同步延迟是延迟预期同步延迟。
    YAML
    alert: VolumeSynchronizationDelay
    expr: ramen_rpo_difference >= 3
    for: 5s
    labels:
      severity: critical
    annotations:
      description: "The syncing of volumes is exceeding three times the scheduled snapshot interval, or the volumes have been recently protected. (DRPC: {{ $labels.obj_name }}, Namespace: {{ $labels.obj_namespace }})"
      alert_type: "DisasterRecovery"
    Copy to Clipboard Toggle word wrap
  • alert: VolumeSynchronizationDelay

    影响
    Warning
    用途
    卷复制组占用的实际同步延迟是预期的同步延迟的两倍。
    YAML
    alert: VolumeSynchronizationDelay
    expr: ramen_rpo_difference > 2 and ramen_rpo_difference < 3
    for: 5s
    labels:
      severity: warning
    annotations:
      description: "The syncing of volumes is exceeding two times the scheduled snapshot interval, or the volumes have been recently protected. (DRPC: {{ $labels.obj_name }}, Namespace: {{ $labels.obj_namespace }})"
      alert_type: "DisasterRecovery"
    Copy to Clipboard Toggle word wrap
  • 警报: WorkloadUnprotected

    影响
    Warning
    用途
    应用程序保护状态降级超过 10 分钟
    YAML
    alert: WorkloadUnprotected
    expr: ramen_workload_protection_status == 0
    for: 10m
    labels:
      severity: warning
    annotations:
      description: "Workload is not protected for disaster recovery (DRPC: {{ $labels.obj_name }}, Namespace: {{ $labels.obj_namespace }})."
      alert_type: "DisasterRecovery"
    Copy to Clipboard Toggle word wrap

第 7 章 灾难恢复故障排除

7.1. 对 Metro-DR 进行故障排除

问题

在重新定位到首选集群时,DRPlacementControl 会一直报告 PROGRESSION 为 "MovingToSecondary"。

在以前的版本中,在 Kubernetes v1.23 之前,Kubernetes control plane 不会清理为 StatefulSets 创建的 PVC。此活动由集群管理员或管理 StatefulSets 的软件操作员保留。因此,当 Pod 被删除时,StatefulSet 的 PVC 会保持不变。这可防止 Ramen 将应用程序重新定位到首选集群。

解决方案
  1. 如果工作负载使用 StatefulSets,且重新定位会卡住 PROGRESSION 为 "MovingToSecondary",则运行:

    $ oc get pvc -n <namespace>
    Copy to Clipboard Toggle word wrap
  2. 对于属于该 StatefulSet 的命名空间的每个绑定的 PVC,请运行

    $ oc delete pvc <pvcname> -n namespace
    Copy to Clipboard Toggle word wrap

    删除所有 PVC 后,卷组复制组 (VRG) 过渡到 secondary,然后会被删除。

  3. 运行以下命令

    $ oc get drpc -n <namespace> -o wide
    Copy to Clipboard Toggle word wrap

    几分钟后,PROGRESSION 报告 "Completed" 并完成重新定位。

结果
工作负载重新定位到首选集群

BZ reference: [2118270]

问题
虽然只有单个应用程序被选择供 DR 策略使用,但同一命名空间中的所有应用程序都会受到保护。这会导致 PVC,与多个工作负载的 DRPlacementControl spec.pvcSelector 匹配;或者,如果所有工作负载中没有选择器,复制管理可能会多次管理每个 PVC,并根据单独的 DRPlacementControl 操作造成数据崩溃或无效操作。
解决方案
标签 PVC 属于唯一工作负载,并使用所选标签作为 DRPlacementControl spec.pvcSelector,以忽略哪个 DRPlacementControl 保护和管理命名空间中的哪些 PVC 子集。无法使用用户界面为 DRPlacementControl 指定 spec.pvcSelector 字段,因此必须使用命令行删除并创建此类应用程序的 DRPlacementControl。

BZ 参考:[2128860]

问题
当主集群停机并回到在线时,重新定位故障恢复 可能会处于 Initiating 状态。
解决方案

要避免这种情况,请关闭从旧的活跃 hub 到受管集群的所有访问。

另外,您可以在旧的活跃 hub 集群上缩减 ApplicationSet 控制器,然后再移动工作负载或处于清理阶段。

在旧的活跃 hub 中,使用以下命令缩减两个部署:

$ oc scale deploy -n openshift-gitops-operator openshift-gitops-operator-controller-manager --replicas=0

$ oc scale statefulset -n openshift-gitops openshift-gitops-application-controller --replicas=0
Copy to Clipboard Toggle word wrap

BZ 参考: [2243804]

7.2. 对 Regional-DR 进行故障排除

7.2.1. rbd-mirror 守护进程健康状态

问题

当 mirror 服务 ::get_mirror_service_status 调用 Ceph monitor 来获取 rbd-mirror 的服务状态,会有多种情况会报告 WARNING。

在网络连接网络连接后,rbd-mirror 守护进程健康状态在 警告 状态,同时两个受管集群间的连接都正常。

解决方案

在 toolbox 中运行以下命令并查找 leader:false

rbd mirror pool status --verbose ocs-storagecluster-cephblockpool | grep 'leader:'
Copy to Clipboard Toggle word wrap

如果您在输出中看到以下内容:

leader: false

这表示存在守护进程启动问题,最有可能的根本原因是由于问题可靠地连接到 secondary 集群。

临时解决方案:通过删除 pod 并验证它已重新调度到另一节点上,将 rbd-mirror pod 移到另一个节点。

leader: true 或没有输出

联系红帽支持

BZ 参考: [2118627]

问题

VolSync 源 pod 无法解析 VolSync 目标 pod 的主机名。VolSync Pod 的日志在延长时间内显示错误消息,类似于以下日志片断。

$ oc logs -n busybox-workloads-3-2 volsync-rsync-src-dd-io-pvc-1-p25rz
Copy to Clipboard Toggle word wrap

输出示例

VolSync rsync container version: ACM-0.6.0-ce9a280
Syncing data to volsync-rsync-dst-dd-io-pvc-1.busybox-workloads-3-2.svc.clusterset.local:22 ...
ssh: Could not resolve hostname volsync-rsync-dst-dd-io-pvc-1.busybox-workloads-3-2.svc.clusterset.local: Name or service not known
Copy to Clipboard Toggle word wrap
解决方案

在这两个节点上,重启 submariner-lighthouse-agent

$ oc delete pod -l app=submariner-lighthouse-agent -n submariner-operator
Copy to Clipboard Toggle word wrap
问题

当 hub 集群失败时,基于 ApplicationSet 的工作负载部署不会垃圾回收。它被恢复到备用 hub 集群,而工作负载已故障转移到存活的受管集群。工作负载从中失败的集群,重新加入新的恢复的待机 hub。

ApplicationSets 是 DR 保护的,带有区域 DRPolicy,因此开始触发 VolumeSynchronizationDelay 警报。进一步的 DR 保护工作负载无法故障转移到对等集群,或者重新定位到对等集群,因为数据在两个集群之间没有同步。

解决方案

临时解决方案要求 openshift-gitops operator 可以拥有在受管集群中孤立的工作负载资源,这些资源在重新加入 hub 后从新的恢复的 hub 执行。要达到此目的,可以执行以下步骤:

  1. 确定 openshift-gitops 命名空间中的 hub 集群上的 ArgoCD ApplicationSet 资源使用的放置。
  2. 在此字段中检查 ApplicationSet 的放置标签值: spec.generators.clusterDecisionResource.labelSelector.matchLabels

    这将是放置资源 < placement-name> 的名称

  3. 确保 ApplicationSet 引用的 Placement 有一个 PlacemenDecision

    $ oc get placementdecision -n openshift-gitops --selector cluster.open-cluster-management.io/placement=<placement-name>
    Copy to Clipboard Toggle word wrap

    这会导致单个 PlacementDecision 将工作负载放置在当前所需的故障切换集群中。

  4. 为 ApplicationSet 创建新的 PlacementDecision,指向应清理它的集群。

    例如:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: PlacementDecision
    metadata:
      labels:
        cluster.open-cluster-management.io/decision-group-index: "1" # Typically one higher than the same value in the esisting PlacementDecision determined at step (2)
        cluster.open-cluster-management.io/decision-group-name: ""
        cluster.open-cluster-management.io/placement: cephfs-appset-busybox10-placement
      name: <placemen-name>-decision-<n> # <n> should be one higher than the existing PlacementDecision as determined in step (2)
      namespace: openshift-gitops
    Copy to Clipboard Toggle word wrap
  5. 使用状态 子资源 更新新创建的 PlacementDecision

    decision-status.yaml:
    status:
      decisions:
      - clusterName: <managedcluster-name-to-clean-up> # This would be the cluster from where the workload was failed over, NOT the current workload cluster
        reason: FailoverCleanup
    Copy to Clipboard Toggle word wrap
    $ oc patch placementdecision -n openshift-gitops <placemen-name>-decision-<n> --patch-file=decision-status.yaml --subresource=status --type=merge
    Copy to Clipboard Toggle word wrap
  6. 监控并确保 ApplicationSet 的应用程序资源已放在所需的集群中

    $ oc get application -n openshift-gitops  <applicationset-name>-<managedcluster-name-to-clean-up>
    Copy to Clipboard Toggle word wrap

    在输出中,检查 SYNC STATUS 是否显示为 Synced,并且 HEALTH STATUS 显示为 Healthy

  7. 删除在第 3 步中创建的 PlacementDecision,以便 ArgoCD 可以垃圾回收 <managedcluster-name-to-clean-up> 上的工作负载资源

    $ oc delete placementdecision -n openshift-gitops <placemen-name>-decision-<n>
    Copy to Clipboard Toggle word wrap

ApplicationSets 是 DR 保护的,带有区域 DRPolicy 的 ApplicationSet 会停止触发 VolumeSynchronizationDelay 警报。

BZ 参考: [2268594]

问题

执行完区失败和恢复后,工作负载 pod 有时会处于 ContainerCreating 状态,并显示以下错误:

  • MountDevice 无法创建 newCsiDriverClient: 驱动程序名称 openshift-storage.rbd.csi.ceph.com,在注册的 CSI 驱动程序列表中找不到
  • <volume_name> MountDevice 失败:rpc error: code = Aborted desc = an operation with the given Volume ID <volume_id> already exists
  • <volume_name> MountVolume.SetUp 失败:rpc error: code = Internal desc = staging path <path> for volume <volume_id> is not a mountpoint
解决方案

如果工作负载 pod 遇到上述任何错误,请执行以下临时解决方案:

  • 对于 ceph-fs 工作负载,处于 ContainerCreating 中:

    1. 重启调度卡住 pod 的节点
    2. 删除这些卡住的 pod
    3. 验证新 pod 是否正在运行
  • 对于 ceph-rbd 工作负载,在 ContainerCreating 中,在一段时间后不会进行自助恢复

    1. 在调度卡住 pod 的节点中重启 csi-rbd 插件 pod
    2. 验证新 pod 是否正在运行
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat