为带有 Advanced Cluster Management 的 Regional-DR 配置 OpenShift Data Foundation
有关如何在两个不同地理位置配置 OpenShift Data Foundation 的说明,以提供具有灾难恢复功能的存储基础架构。
摘要
让开源更具包容性
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对文档提供反馈信息。请告诉我们如何让它更好。提供反馈:
关于特定内容的简单评论:
- 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
- 用鼠标指针高亮显示您想评论的文本部分。
- 点在高亮文本上弹出的 Add Feedback。
- 按照显示的步骤操作。
要提交更复杂的反馈,请创建一个 Bugzilla ticket:
- 进入 Bugzilla 网站。
- 在 Component 部分中,选择 文档。
- 在 Description 中输入您要提供的信息。包括文档相关部分的链接。
- 点 Submit Bug。
第 1 章 Regional-DR 介绍
灾难恢复是从自然或人为的灾难中恢复并继续业务关键应用程序的能力。它是任何主要组织的整体业务连续性战略,旨在在重大危险事件期间保持业务运营的连续性。
Regional-DR(区域 DR) 功能在地理分散的网站之间提供卷持久数据和元数据复制。在公共云中,它们类似于防止区域故障。区域 DR 可以在一个地理区域出现问题时确保业务的连续性(在可以接受一些可预测数量的数据丢失的情况下)。这通常通过 Recovery Point Objective (RPO) 和 Recovery Time Objective (RTO) 代表。
- RPO 是一种衡量持久性数据备份或快照的频率。实际上,RPO 表示在中断后将丢失或需要重新输入的数据量。
- RTO 是企业可以容忍的停机时间。RTO 回答了这个问题,"在收到业务中断通知后,我们的系统需要多久才能恢复?"
本指南旨在详细介绍配置基础架构以启用灾难恢复所需的步骤和命令。
1.1. 区域 DR 解决方案的组件
region-DR 由 Red Hat Advanced Cluster Management for Kubernetes(RHACM)和 OpenShift Data Foundation 组件组成,以便在 OpenShift Container Platform 集群中提供应用程序和数据移动性。
Red Hat Advanced Cluster Management for Kubernetes(RHACM)
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 池间自动对镜像(image)进行镜像
- 提供 csi-addons 以管理每个持久性卷声明镜像
OpenShift DR
OpenShift DR 是一个灾难恢复器,用于一组对等 OpenShift 集群内的有状态应用,这些集群使用 RHACM 进行部署和管理,并提供云原生接口来编排持久卷上应用状态的生命周期。它们是:
- 保护跨 OpenShift 集群的应用状态关系
- 在当前部署的集群不可用的情况下将应用程序的状态故障转移到对等集群
- 将应用的状态重新定位到之前部署的集群
OpenShift DR 被分成三个组件:
- ODF Multicluster Orchestrator: Installed on the multi-cluster control plane(RHACM Hub),创建一个 bootstrap 令牌,并在受管集群间交换这个令牌。
- OpenShift DR Hub Operator :在 hub 集群上安装,以管理应用程序的故障转移和重新定位。
- OpenShift DR Cluster Operator :安装在每个受管集群上,以管理应用程序的所有 PVC 的生命周期。
1.2. 区域DR 部署工作流
本节概述了在两个不同的 OpenShift Container Platform 集群中使用 OpenShift Data Foundation 版本 4.9 和 RHACM 版本 2.4 来配置和部署 Regional-DR 功能所需的步骤。除了两个受管集群外,还需要第三个 OpenShift Container Platform 集群来部署 Advanced Cluster Management hub 解决方案。
要配置基础架构,请按照给定的顺序执行以下步骤:
- 确保您满足每个区域DR 要求。请参阅启用区域DR 的要求。
- 通过在两个 OpenShift Data Foundation 受管集群之间创建镜像关系来配置多站点存储复制。请参阅配置多站点存储复制。
- 在每个受管集群中创建 VolumeReplicationClass 资源,以配置复制计划(例如:每 5 分钟在同级之间复制一次)。请参阅创建 VolumeReplicationClass 资源。
-
在每个受管集群上创建镜像 StorageClass 资源,支持新的
imageFeatures
以实现启用镜像(mirror)的块卷。请参阅创建镜像 StorageClass 资源。 - 在受管集群上安装 OpenShift DR Cluster Operator,并创建所需的对象存储桶、secret 和 configmap。请参阅在受管集群中安装 OpenShift DR Cluster Operator。
- 在 Hub 集群上安装 OpenShift DR Hub Operator,并创建所需的对象存储桶、secret 和 configmap。请参阅在 Hub 集群上安装 OpenShift DR Hub Operator。
- 在 hub 集群上创建 DRPolicy 资源,用于在受管集群间部署、故障转移和重新定位工作负载。请参阅在 Hub 集群上创建灾难恢复策略。
第 2 章 启用区域DR 的要求
您必须有三个在它们之间具有网络可访问性的 OpenShift 集群:
- 安装 Advanced Cluster Management for Kubernetes(RHACM operator)、ODF Multicluster Orchestrator 和 OpenShift DR Hub 控制器的 hub 集群。
- 安装 OpenShift Data Foundation、OpenShift DR 集群控制器和应用的主要受管集群。
- 安装 OpenShift Data Foundation、OpenShift DR 集群控制器和应用的辅助受管集群。
确保您已在 Hub 集群上安装了 RHACM 操作器和 MultiClusterHub,并使用您的 OpenShift 凭证登录到 RHACM 控制台。具体步骤请查看 RHACM 安装指南。
查找为 Advanced Cluster Manager 控制台创建的路由:
$ oc get route multicloud-console -n open-cluster-management -o jsonpath --template="https://{.spec.host}/multicloud/clusters{'\n'}"
输出示例:
https://multicloud-console.apps.perf3.example.com/multicloud/clusters
使用 OpenShift 凭据登录后,您应该会看到导入的本地集群。
确保您已使用 RHACM 控制台导入或创建了 主要受管集群和次要受管集群。
要使用 Submariner 附加组件连接受管 OpenShift 集群和服务网络,您需要对每个受管集群运行以下命令来验证两个集群是否具有非覆盖网络。
$ oc get networks.config.openshift.io cluster -o json | jq .spec
cluster1
的输出示例(如ocp4perf1
):{ "clusterNetwork": [ { "cidr": "10.5.0.0/16", "hostPrefix": 23 } ], "externalIP": { "policy": {} }, "networkType": "OpenShiftSDN", "serviceNetwork": [ "10.15.0.0/16" ] }
cluster2
的输出示例(如ocp4perf2
):{ "clusterNetwork": [ { "cidr": "10.6.0.0/16", "hostPrefix": 23 } ], "externalIP": { "policy": {} }, "networkType": "OpenShiftSDN", "serviceNetwork": [ "10.16.0.0/16" ] }
如需更多信息,请参阅 Submariner 附加组件文档。
-
确保受管集群可以使用
Submariner 附加组件
进行连接。在识别并确保集群和服务网络具有非覆盖范围后,使用 RHACM 控制台和集群集
为每个受管集群安装Submariner 附加组件
。具体步骤请参阅 Submariner 文档。 确保 OpenShift Data Foundation 4.9 或更高版本安装在每个受管集群上。
- 如需有关 OpenShift Data Foundation 部署的信息,请参阅基础架构特定的部署指南 (如 AWS、VMware、Bare metal、Azure)。
使用以下命令验证每个受管集群上是否成功部署:
$ oc get storagecluster -n openshift-storage ocs-storagecluster -o jsonpath='{.status.phase}{"\n"}'
如果状态结果在 Primary 受管集群和 secondary 受管集群上处于
Ready
状态,则继续在受管集群上启用镜像(mirror)。
第 3 章 配置多站点存储复制
镜像或复制以每个 CephBlockPool
为基础在对等受管集群中启用,然后可根据池中的特定镜像子集进行配置。rbd-mirror
守护进程负责将本地对等集群的镜像更新复制到远程集群中的同一镜像。
这些说明详细介绍了如何在两个 OpenShift Data Foundation 受管集群之间创建镜像关系。
3.1. 在受管集群中启用 OMAP 生成器和卷复制
在主受管集群和次受管集群上执行以下步骤,在 csi-rbdplugin-provisioner
Pod 中启用 OMAP 和 Volume-Replication CSI sidecar 容器。
流程
运行以下
patch
命令,将rook-ceph-operator-config
ConfigMap 中的CSI_ENABLE_OMAP_GENERATOR
的值设置为true
。$ oc patch cm rook-ceph-operator-config -n openshift-storage --type json --patch '[{ "op": "add", "path": "/data/CSI_ENABLE_OMAP_GENERATOR", "value": "true" }]'
输出示例:
configmap/rook-ceph-operator-config patched
运行以下
patch
命令,将rook-ceph-operator-config
ConfigMap 中的CSI_ENABLE_VOLUME_REPLICATION
的值设置为true
。$ oc patch cm rook-ceph-operator-config -n openshift-storage --type json --patch '[{ "op": "add", "path": "/data/CSI_ENABLE_VOLUME_REPLICATION", "value": "true" }]'
输出示例:
configmap/rook-ceph-operator-config patched
验证是否针对每个
csi-rbdplugin-provisioner
pod 添加了以下两个新的 CSI sidecar。$ for l in $(oc get pods -n openshift-storage -l app=csi-rbdplugin-provisioner -o jsonpath={.items[*].spec.containers[*].name}) ; do echo $l ; done | egrep "csi-omap-generator|volume-replication"
输出示例:
csi-omap-generator volume-replication csi-omap-generator volume-replication
注意新容器会重复,因为存在用于冗余的
twocsi-rbdplugin-provisioner
容器集。
3.2. 安装 OpenShift Data Foundation 多集群编排器
OpenShift Data Foundation Multicluster Orchestrator 是一个控制器,从 Hub 集群上的 OpenShift Container Platform OperatorHub 安装。这个多集群编排器控制器以及 MirrorPeer 自定义资源会创建一个 bootstrap 令牌,并在受管集群间交换这个令牌。
流程
- 导航到 Hub 集群上的 OperatorHub,并使用关键字过滤器搜索 ODF Multicluster Orchestrator。
- 点击 ODF Multicluster Orchestrator 标题。
保留所有默认设置并单击 Install。
operator 资源安装在
openshift-operators
中,并可用于所有命名空间。- 验证 ODF 多集群编排器 显示绿色勾号,代表安装成功。
3.3. 在 hub 集群中创建镜像对等
mirror Peer 是一个集群范围的资源,用于保存有关将具有对等对等关系的受管集群的信息。
先决条件
- 确保 Hub 集群上安装了 ODF 多集群编排器。
- 每个镜像对等点只能有两个集群。
-
确保每个集群都有唯一标识的集群名称,如
ocp4perf1
和ocp4perf2
。
流程
点击 ODF Multicluster Orchestrator 查看 Operator 详情。
您还可以在成功安装 Multicluster Orchestrator 后点 View Operator。
- 点击 Mirror Peer API Create 实例,然后选择 YAML 视图。
在 YAML 视图中创建 Mirror Peer。
在将 <cluster1> 和 <cluster2> 替换为 RHACM 控制台中受管集群的正确名称后,将以下 YAML 复制到一个名为
mirror-peer.yaml
的文件。apiVersion: multicluster.odf.openshift.io/v1alpha1 kind: MirrorPeer metadata: name: mirrorpeer-<cluster1>-<cluster2> spec: items: - clusterName: <cluster1> storageClusterRef: name: ocs-storagecluster namespace: openshift-storage - clusterName: <cluster2> storageClusterRef: name: ocs-storagecluster namespace: openshift-storage
注意不需要指定一个命名空间来创建此资源,因为 MirrorPeer 是一个集群范围的资源。
-
将唯一
mirror-peer.yaml
文件的内容复制到 YAML 视图中。您必须完全替换原始的内容。 - 点 YAML 视图屏幕底部的 Create。
验证您是否可以看到 Phase 的状态为
ExchangedSecret
。注意在某些部署中,验证的输出也可以是
ExchangingSecret
,这也是可接受的结果。
3.4. 在受管集群上启用镜像
要启用镜像功能,您必须为每个受管集群启用存储集群的镜像设置。这是使用 CLI 和 oc patch
命令的手动步骤。
您必须在启用了 StorageCluster 镜像后,在主受管集群和次受管集群上运行 oc patch storagecluster
命令,以及后续验证命令。
流程
使用存储集群名称启用集群级别镜像标记。
$ oc patch storagecluster $(oc get storagecluster -n openshift-storage -o=jsonpath='{.items[0].metadata.name}') -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/mirroring", "value": {"enabled": true} }]'
输出示例:
storagecluster.ocs.openshift.io/ocs-storagecluster patched
验证默认 Ceph 块池上是否启用了镜像功能。
$ oc get cephblockpool -n openshift-storage -o=jsonpath='{.items[?(@.metadata.ownerReferences[*].kind=="StorageCluster")].spec.mirroring.enabled}{"\n"}'
输出示例:
true
验证
rbd-mirror
容器集是否已启动并在运行。$ oc get pods -o name -l app=rook-ceph-rbd-mirror -n openshift-storage
输出示例:
pod/rook-ceph-rbd-mirror-a-6486c7d875-56v2v
验证
守护进程
健康状态。$ oc get cephblockpool ocs-storagecluster-cephblockpool -n openshift-storage -o jsonpath='{.status.mirroringStatus.summary}{"\n"}'
输出示例:
{"daemon_health":"OK","health":"OK","image_health":"OK","states":{}}
守护进程
健康和健康字段可能需要 10 分钟时间才会从 Warning
更改为 OK
。如果大约 10 分钟内状态未更改为 OK
,则使用 RHACM 控制台验证 Submariner 附加组件连接是否仍处于 Healthy
状态。
第 4 章 创建 VolumeReplicationClass 资源
VolumeReplicationClass
用于指定要复制的每个卷的 mirroringMode
,以及将卷或镜像从本地集群复制到远程集群的频率(例如,每 5 分钟一次)。
此资源必须在主受管集群和次受管集群上创建。
流程
将以下 YAML 保存到名为
rbd-volumereplicationclass.yaml
的文件。apiVersion: replication.storage.openshift.io/v1alpha1 kind: VolumeReplicationClass metadata: name: odf-rbd-volumereplicationclass spec: provisioner: openshift-storage.rbd.csi.ceph.com parameters: mirroringMode: snapshot schedulingInterval: "5m" # <-- Must be the same as scheduling interval in the DRPolicy replication.storage.openshift.io/replication-secret-name: rook-csi-rbd-provisioner replication.storage.openshift.io/replication-secret-namespace: openshift-storage
在两个受管集群中创建文件。
$ oc create -f rbd-volumereplicationclass.yaml
输出示例:
volumereplicationclass.replication.storage.openshift.io/odf-rbd-volumereplicationclass created
第 5 章 创建镜像 StorageClass 资源
启用镜像(mirror)
的块卷必须使用新的 StorageClass 来创建,该 StorageClass 需要额外 imageFeatures
才能在受管集群间启用更快的镜像复制。新功能包括 exclusive-lock、object-map 和 fast-diff。默认 OpenShift Data Foundation StorageClass ocs-storagecluster-ceph-rbd
不包括这些功能。
此资源必须在主受管集群和次受管集群上创建。
流程
将以下 YAML 保存到文件
ocs-storagecluster-ceph-rbdmirror.yaml
。allowVolumeExpansion: true apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ocs-storagecluster-ceph-rbdmirror parameters: clusterID: openshift-storage csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner csi.storage.k8s.io/controller-expand-secret-namespace: openshift-storage csi.storage.k8s.io/fstype: ext4 csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node csi.storage.k8s.io/node-stage-secret-namespace: openshift-storage csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner csi.storage.k8s.io/provisioner-secret-namespace: openshift-storage imageFeatures: layering,exclusive-lock,object-map,fast-diff imageFormat: "2" pool: ocs-storagecluster-cephblockpool provisioner: openshift-storage.rbd.csi.ceph.com reclaimPolicy: Delete volumeBindingMode: Immediate
在两个受管集群中创建文件。
$ oc create -f ocs-storagecluster-ceph-rbdmirror.yaml
输出示例:
storageclass.storage.k8s.io/ocs-storagecluster-ceph-rbdmirror created
第 6 章 在受管集群中安装 OpenShift DR Cluster Operator
流程
- 在每个受管集群上,导航到 OperatorHub 并为 OpenShift DR Cluster Operator 过滤。
按照屏幕说明,将操作器安装到
openshift-dr-system
项目中。注意OpenShift DR Cluster Operator
必须同时安装在主受管集群和次受管集群上。在 s3 端点之间配置 SSL 访问,以便可以使用安全传输协议和 Hub 集群中的安全传输协议将元数据存储在 MCG 对象存储桶中的备用集群中,以验证对对象存储桶的访问。
注意如果所有 OpenShift 集群都为您的环境使用签名的可信证书集进行部署,则可以跳过本节。
提取主受管集群 的 ingress 证书,并将输出保存到
primary.crt
。$ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > primary.crt
提取次受管集群 的 ingress 证书,并将输出保存到
second.crt
。$ oc get cm default-ingress-cert -n openshift-config-managed -o jsonpath="{['data']['ca-bundle\.crt']}" > secondary.crt
创建新 ConfigMap 以存放远程集群的证书捆绑包,其文件名为
cm-clusters-crt.yaml
,位于 主受管集群、 次受管集群和 Hub 集群上。注意如本示例文件所示,每个集群可能有超过三个证书。
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
在 主受管集群、次受管集群 和 Hub 集群上运行以下命令,以创建该文件。
$ oc create -f cm-clusters-crt.yaml
输出示例:
configmap/user-ca-bundle created
重要要使 Hub 集群 使用 DRPolicy 资源验证对象存储桶的访问权限,必须在 Hub 集群上创建相同的 ConfigMap
cm-clusters-crt.yaml
。修改默认的 Proxy 集群资源。
将以下内容复制并保存到新的 YAML 文件
proxy-ca.yaml
中。apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: trustedCA: name: user-ca-bundle
将这个新文件应用到 主受管集群、次受管集群和 Hub集群上的默认代理资源。
$ oc apply -f proxy-ca.yaml
输出示例:
proxy.config.openshift.io/cluster configured
检索多云对象网关(MCG)密钥和外部 S3 端点。
检查 MCG 是否安装在主受管集群和次受管集群 上,以及 Phase 是否处于
Ready
状态。$ oc get noobaa -n openshift-storage
输出示例:
NAME MGMT-ENDPOINTS S3-ENDPOINTS IMAGE PHASE AGE noobaa ["https://10.70.56.161:30145"] ["https://10.70.56.84:31721"] quay.io/rhceph-dev/mcg-core@sha256:c4b8857ee9832e6efc5a8597a08b81730b774b2c12a31a436e0c3fadff48e73d Ready 27h
将以下 YAML 文件复制到名为
odrbucket.yaml
的文件。apiVersion: objectbucket.io/v1alpha1 kind: ObjectBucketClaim metadata: name: odrbucket namespace: openshift-dr-system spec: generateBucketName: "odrbucket" storageClassName: openshift-storage.noobaa.io
在主受管集群和次受管集群上创建 MCG bucket
odrbucket
。$ oc create -f odrbucket.yaml
输出示例:
objectbucketclaim.objectbucket.io/odrbucket created
使用以下命令,提取每个受管集群的
odrbucket
OBC 访问密钥作为其 base-64 编码 值。$ oc get secret odrbucket -n openshift-dr-system -o jsonpath='{.data.AWS_ACCESS_KEY_ID}{"\n"}'
输出示例:
cFpIYTZWN1NhemJjbEUyWlpwN1E=
使用以下命令,提取每个受管集群的
odrbucket
OBC secret 密钥作为其 base-64 编码 值。$ oc get secret odrbucket -n openshift-dr-system -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}{"\n"}'
输出示例:
V1hUSnMzZUoxMHRRTXdGMU9jQXRmUlAyMmd5bGwwYjNvMHprZVhtNw==
为受管集群创建 S3 Secret。
现在,已经提取了必要的 MCG 信息,必须在主受管集群和次受管集群上创建新的 Secret。这些新的 Secret 存储两个受管集群的 MCG 访问和 secret 密钥。
注意OpenShift DR 需要一个或多个 S3 存储来存储受管集群中工作负载的相关集群数据,并在故障转移或重新定位操作期间编配工作负载的恢复。这些说明适用于使用多云网关(MCG)创建所需的对象存储桶。安装 OpenShift Data Foundation 后,MCG 应已被安装。
将主受管集群的以下 S3 secret YAML 格式复制到名为
odr-s3secret-primary.yaml
的文件。apiVersion: v1 data: AWS_ACCESS_KEY_ID: <primary cluster base-64 encoded access key> AWS_SECRET_ACCESS_KEY: <primary cluster base-64 encoded secret access key> kind: Secret metadata: name: odr-s3secret-primary namespace: openshift-dr-system
将 <primary cluster base-64 编码的 access key > ; 和 <primary cluster base-64 编码的 secret access key > 替换为前面步骤中检索的实际值。
在主受管集群和次受管集群上创建此 secret。
$ oc create -f odr-s3secret-primary.yaml
输出示例:
secret/odr-s3secret-primary created
将次受管集群的以下 S3 secret YAML 格式复制到名为
odr-s3secret-secondary.yaml
的文件。apiVersion: v1 data: AWS_ACCESS_KEY_ID: <secondary cluster base-64 encoded access key> AWS_SECRET_ACCESS_KEY: <secondary cluster base-64 encoded secret access key> kind: Secret metadata: name: odr-s3secret-secondary namespace: openshift-dr-system
使用在第 4 步中获取的实际值替换 <secondary cluster base-64 encoded access key> 和 <secondary cluster base-64 encoded secret access key>。
在主受管集群和次受管集群上创建此 secret。
$ oc create -f odr-s3secret-secondary.yaml
输出示例:
secret/odr-s3secret-secondary created
重要access 和 secret key 的值必须采用 base-64 编码。在前面的步骤中检索了密钥的编码值。
在每个受管集群上配置 OpenShift DR Cluster Operator ConfigMap。
使用以下命令,搜索外部 S3 端点 s3CompatibleEndpoint 或路由来为每个受管集群上的 MCG 进行 MCG。
$ oc get route s3 -n openshift-storage -o jsonpath --template="https://{.spec.host}{'\n'}"
输出示例:
https://s3-openshift-storage.apps.perf1.example.com
重要唯一的 s3CompatibleEndpoint 路由或
s3-openshift-storage.apps.<primary clusterID>.<baseDomain>
和s3-openshift-storage.apps.<secondary clusterID>.<baseDomain>
必须分别为主受管集群和次受管集群获取。搜索
odrbucket
OBC bucket 名称。$ oc get configmap odrbucket -n openshift-dr-system -o jsonpath='{.data.BUCKET_NAME}{"\n"}'
输出示例:
odrbucket-2f2d44e4-59cb-4577-b303-7219be809dcd
重要唯一的 s3Bucket 名称 odrbucket-<your value1> 和 odrbucket-<your value2> 必须分别在主受管集群和次受管集群上获得。
修改 ConfigMap
ramen-dr-cluster-operator-config
以添加新内容。$ oc edit configmap ramen-dr-cluster-operator-config -n openshift-dr-system
从
s3StoreProfiles
开始,将以下新内容添加到 主受管集群和次受管集群的 ConfigMap 中。[...] data: ramen_manager_config.yaml: | apiVersion: ramendr.openshift.io/v1alpha1 kind: RamenConfig [...] ramenControllerType: "dr-cluster" ### Start of new content to be added s3StoreProfiles: - s3ProfileName: s3-primary s3CompatibleEndpoint: https://s3-openshift-storage.apps.<primary clusterID>.<baseDomain> s3Region: primary s3Bucket: odrbucket-<your value1> s3SecretRef: name: odr-s3secret-primary namespace: openshift-dr-system - s3ProfileName: s3-secondary s3CompatibleEndpoint: https://s3-openshift-storage.apps.<secondary clusterID>.<baseDomain> s3Region: secondary s3Bucket: odrbucket-<your value2> s3SecretRef: name: odr-s3secret-secondary namespace: openshift-dr-system [...]
第 7 章 在 Hub 集群上安装 OpenShift DR Hub Operator
先决条件
- 确保 access 和 secret key 的值采用 base-64 编码。键的编码值在上一节中检索,生成的 Secret 与受管集群上已创建的 Secret 完全相同。
流程
- 在 Hub 集群中,导航到 OperatorHub 并使用 OpenShift DR Hub Operator 的搜索过滤器。
-
按照屏幕说明,将操作器安装到
openshift-dr-system
项目中。 使用 主受管集群的以下 S3 secret YAML 格式,为 Hub 集群创建 S3 secret。
apiVersion: v1 data: AWS_ACCESS_KEY_ID: <primary cluster base-64 encoded access key> AWS_SECRET_ACCESS_KEY: <primary cluster base-64 encoded secret access key> kind: Secret metadata: name: odr-s3secret-primary namespace: openshift-dr-system
运行以下命令,在 Hub 集群上创建此机密。
$ oc create -f odr-s3secret-primary.yaml
输出示例:
secret/odr-s3secret-primary created
为 secondary 受管集群 使用以下 S3 secret YAML 格式创建 S3 secret。
apiVersion: v1 data: AWS_ACCESS_KEY_ID: <secondary cluster base-64 encoded access key> AWS_SECRET_ACCESS_KEY: <secondary cluster base-64 encoded secret access key> kind: Secret metadata: name: odr-s3secret-secondary namespace: openshift-dr-system
运行以下命令,在 Hub 集群上创建此机密。
$ oc create -f odr-s3secret-secondary.yaml
输出示例:
secret/odr-s3secret-secondary created
为 OpenShift DR Hub Operator 配置 ConfigMap。
成功创建 Operator 后,将创建一个名为
ramen-hub-operator-config
的新 ConfigMap。运行以下命令来编辑文件。
$ oc edit configmap ramen-hub-operator-config -n openshift-dr-system
从
s3StoreProfiles
开始,将以下内容添加到 Hub 集群上的 ConfigMap 中。[...] apiVersion: v1 data: ramen_manager_config.yaml: | apiVersion: ramendr.openshift.io/v1alpha1 kind: RamenConfig [...] ramenControllerType: "dr-hub" ### Start of new content to be added s3StoreProfiles: - s3ProfileName: s3-primary s3CompatibleEndpoint: https://s3-openshift-storage.apps.<primary clusterID>.<baseDomain> s3Region: primary s3Bucket: odrbucket-<your value1> s3SecretRef: name: odr-s3secret-primary namespace: openshift-dr-system - s3ProfileName: s3-secondary s3CompatibleEndpoint: https://s3-openshift-storage.apps.<secondary clusterID>.<baseDomain> s3Region: secondary s3Bucket: odrbucket-<your value2> s3SecretRef: name: odr-s3secret-secondary namespace: openshift-dr-system [...]
注意确保将 <primary clusterID>, <secondary clusterID>, baseDomain, odrbucket-<your value1>, 和 odrbucket-<your value2> 变量替换为与受管集群上
ramen-cluster-operator-config
ConfigMap 所使用的值完全相同的值。
第 8 章 在 Hub 集群上创建灾难恢复策略
OpenShift DR 使用 RHACM hub 集群上的 Disaster Recovery Policy(DRPolicy)资源(集群范围)来部署、故障转移和重新定位受管集群中的工作负载。
先决条件
- 确保存在两个集群,它们对等进行存储级别复制,并且启用了 CSI 卷复制。
- 确保有一个调度间隔,决定按照什么频率执行数据复制,它也充当使用 DRPolicy 的工作负载的粗粒度恢复点目标(RPO)。
- 确保为策略中的每个集群分配 S3 配置文件名称,该名称使用 OpenShift DR 集群和 hub 操作器的 ConfigMap 配置。
步骤
-
在 Hub 集群中,导航到
openshift-dr-system
项目中的 Installed Operators,然后点击 OpenShift DR Hub Operator。您应该会看到两个可用的 API,DRPolicy 和 DRPlacementControl。 - 为 DRPolicy 点 Create instance 并点击 YAML 视图。
在将 <cluster1> 和 <cluster2> 替换为 RHACM 中的受管集群的正确名称后,复制并保存到名为
drpolicy.yaml
的文件。apiVersion: ramendr.openshift.io/v1alpha1 kind: DRPolicy metadata: name: odr-policy-5m spec: drClusterSet: - name: <cluster1> s3ProfileName: s3-primary - name: <cluster2> s3ProfileName: s3-secondary schedulingInterval: 5m
注意不需要指定一个命名空间来创建此资源,因为 DRPolicy 是一个集群范围的资源。
-
将唯一
drpolicy.yaml
文件的内容复制到 YAML 视图中。您必须完全替换原始的内容。 在 YAML 视图屏幕上点 Create。
重要DRPolicy 调度间隔必须与创建 VolumeReplicationClass 资源部分中配置的间隔匹配。
运行以下命令验证 DRPolicy 是否已成功创建:
$ oc get drpolicy odr-policy-5m -n openshift-dr-system -o jsonpath='{.status.conditions[].reason}{"\n"}'
输出示例:
Succeeded
第 9 章 创建示例应用程序
您需要一个示例应用程序来测试从主受管集群到次受管集群的故障转移,然后再次测试。使用名为 busybox
的示例应用作为示例。
步骤
在 Hub 集群上为
busybox
示例应用程序创建一个命名空间或项目。$ oc new-project busybox-sample
注意如果需要,可以使用除
busybox-sample
以外的不同项目名称。在通过 Advanced Cluster Manager 控制台部署示例应用程序时,确保使用与此步骤中创建相同的项目名称。创建 DRPlacementControl 资源
DRPlacementControl 是一个 API,在 Hub 集群上安装 OpenShift DR Hub Operator 后可用。它基本上是一个 Advanced Cluster Manager PlacementRule 协调器,它根据作为 DRPolicy 一部分的集群中的数据可用性来编排放置决策。
-
在 Hub 集群中,导航到
busybox-sample
项目中的 Installed Operators,再单击 OpenShift DR Hub Operator。您应该会看到两个可用的 API,DRPolicy 和 DRPlacementControl。 -
为 DRPlacementControl 创建一个实例,然后进入 YAML 视图。确保已选中
busybox-sample
项目。 在将 <cluster1> 替换为 Advanced Cluster Manager 中的受管集群的正确名称后,将以下 YAML 复制到名为
busybox-drpc.yaml
的文件。apiVersion: ramendr.openshift.io/v1alpha1 kind: DRPlacementControl metadata: labels: app: busybox-sample name: busybox-drpc spec: drPolicyRef: name: odr-policy-5m placementRef: kind: PlacementRule name: busybox-placement preferredCluster: <cluster1> pvcSelector: matchLabels: appname: busybox
-
将唯一
busybox-drpc.yaml
文件的内容复制到 YAML 视图(完全替换原始内容)。 在 YAML 视图屏幕上点 Create。
您还可以使用以下 CLI 命令创建此资源:
$ oc create -f busybox-drpc.yaml -n busybox-sample
输出示例:
drplacementcontrol.ramendr.openshift.io/busybox-drpc created
重要此资源必须在
busybox-sample
命名空间(或您之前创建的任何命名空间)中创建。
-
在 Hub 集群中,导航到
创建 Placement Rule 资源,以定义可以部署资源模板的目标集群。使用放置规则促进应用程序的多集群部署。
将以下 YAML 复制到名为
busybox-placementrule.yaml
的文件中。apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: labels: app: busybox-sample name: busybox-placement spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterReplicas: 1 schedulerName: ramen
为
busybox-sample
应用创建 Placement Rule 资源。$ oc create -f busybox-placementrule.yaml -n busybox-sample
输出示例:
placementrule.apps.open-cluster-management.io/busybox-placement created
重要此资源必须在
busybox-sample
命名空间(或您之前创建的任何命名空间)中创建。
使用 RHACM 控制台创建示例应用程序
如果尚未登录,请使用您的 OpenShift 凭据登录 RHACM 控制台。
$ oc get route multicloud-console -n open-cluster-management -o jsonpath --template="https://{.spec.host}/multicloud/applications{'\n'}"
输出示例:
https://multicloud-console.apps.perf3.example.com/multicloud/applications
- 导航到 Applications,再单击 Create application。
- 选择类型 Subscription。
-
输入应用程序 Name (如
busybox
)和 Namespace (如busybox-sample
)。 -
在 Repository location for resources 部分中,选择 Repository type
Git
。 输入示例应用程序的 Git 存储库 URL、github Branch 和 Path,在其中创建资源
busybox
Pod 和 PVC。使用示例应用程序存储库作为
https://github.com/RamenDR/ocm-ramen-samples
,其中 Branch 是main
,Path 是busybox-odr
。重要在继续操作前,确保创建了新的 StorageClass
ocs-storagecluster-ceph-rbdmirror
,如 [创建 Mirror StorageClass 资源] 部分所述。使用以下命令验证是否已创建:
oc get storageclass | grep rbdmirror | awk '{print $1}'
输出示例:
ocs-storagecluster-ceph-rbdmirror
- 将表单向下滚动到 Select clusters to deploy 部分,然后点击 Select an existing placement configuration。
-
从下拉列表中选择 现有 Placement Rule (如
busybox-placement
)。 点击 Save。
创建应用程序时,会显示应用程序详情页面。您可以向下滚动到 Resource topology 部分。拓扑中应当对元素和应用程序进行绿色检查标记。
注意要查看更多信息,请点击任何拓扑元素,拓扑视图右侧会显示一个窗口。
验证示例应用部署和复制。
现在
busybox
应用程序已部署到首选的集群(在 DRPlacementControl 中指定),可以验证部署。登录您的受管集群,其中
busybox
由 RHACM 部署。$ oc get pods,pvc -n busybox-sample
输出示例:
NAME READY STATUS RESTARTS AGE pod/busybox 1/1 Running 0 6m NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/busybox-pvc Bound pvc-a56c138a-a1a9-4465-927f-af02afbbff37 1Gi RWO ocs-storagecluster-ceph-rbd 6m
验证是否也为
busybox
PVC 创建了复制资源。$ oc get volumereplication,volumereplicationgroup -n busybox-sample
输出示例:
NAME AGE VOLUMEREPLICATIONCLASS PVCNAME DESIREDSTATE CURRENTSTATE volumereplication.replication.storage.openshift.io/busybox-pvc 6m odf-rbd-volumereplicationclass busybox-pvc primary Primary NAME AGE volumereplicationgroup.ramendr.openshift.io/busybox-drpc 6m
通过对主受管集群和次受管集群运行以下命令,验证
busybox
卷是否已复制到备用集群。$ oc get cephblockpool ocs-storagecluster-cephblockpool -n openshift-storage -o jsonpath='{.status.mirroringStatus.summary}{"\n"}'
输出示例:
{"daemon_health":"OK","health":"OK","image_health":"OK","states":{"replaying":2}}
注意两个受管集群都应该具有完全相同的输出,新的状态为
"states":{"replaying":2}'
。
9.1. 删除示例应用程序
您可以使用 RHACM 控制台删除示例 application busybox
。
流程
- 在 RHACM 控制台上,前往 Applications。
-
搜索要删除的示例应用程序(例如
busybox
)。 - 点击您要删除的应用程序旁边的 Action Menu (⋮)。
点击 Delete application。
选择了 Delete 应用时,将显示一个新屏幕,询问是否还应删除与应用相关的资源。
- 选中 Remove application 相关资源复选框,以删除 Subscription 和 PlacementRule。
- 单击 Delete。这将删除主受管集群(或应用程序所运行的任何群集)上的 busybox 应用程序。
除了使用 RHACM 控制台删除资源外,在删除
busybox
应用后,还必须立即删除DRPlacementControl
。-
登录 Hub 集群的 OpenShift Web 控制台,再导航到 project
busybox-sample
的 Installed Operators。 - 单击 OpenShift DR Hub Operator,然后单击 DRPlacementControl 选项卡。
-
点击您要删除的
busybox
应用程序 DRPlacementControl 旁边的 Action Menu (⋮)。 - 单击 Delete DRPlacementControl。
- 单击 Delete。
-
登录 Hub 集群的 OpenShift Web 控制台,再导航到 project
此过程可用于使用 DRPlacementControl
资源删除任何应用。也可以使用 CLI,将 DRPlacementControl
资源删除到应用命名空间中。
第 10 章 受管集群之间的应用程序故障切换
本节介绍如何故障转移 busybox 示例应用程序。区域DR 的故障转移方法基于应用程序。以这种方式保护的每个应用都必须具有对应的 DRPlacementControl
资源,并在应用程序命名空间
中创建 PlacementRule
资源,如 Create Sample Application for DR 测试部分所示。
步骤
- 在 Hub 集群中,导航到 Installed Operators,然后点 Openshift DR Hub Operator。
- 单击 DRPlacementControl 选项卡。
-
单击 DRPC
busybox-drpc
,然后单击 YAML 视图。 添加
action
和failoverCluster
详情,如下方屏幕截图所示。failoverCluster
应该是第二个受管集群的 ACM 集群名称。DRPlacementControl 添加 Failover 操作
- 点击 Save。
验证 application
busybox
是否现在在次受管集群中运行,即 YAML 文件中指定的故障转移集群ocp4perf2
。$ oc get pods,pvc -n busybox-sample
输出示例:
NAME READY STATUS RESTARTS AGE pod/busybox 1/1 Running 0 35s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/busybox-pvc Bound pvc-79f2a74d-6e2c-48fb-9ed9-666b74cfa1bb 5Gi RWO ocs-storagecluster-ceph-rbd 35s
验证
busybox
不再在主受管集群上运行。$ oc get pods,pvc -n busybox-sample
输出示例:
No resources found in busybox-sample namespace.
请注意发行说明的已知区域DR 问题,如已知问题部分所述。
如果您需要开发人员预览功能的帮助,请联络 ocs-devpreview@redhat.com 邮件列表和红帽开发团队成员将根据其可用性和工作计划尽快为您提供协助。
第 11 章 在受管集群间重新定位应用程序
重定位操作与故障转移非常相似。重新定位基于应用,并使用 DRPlacementControl 来触发重定位。重定位的主要区别在于,会发出 重新同步
以确保第二受管集群上保存的任何新应用程序数据都会立即出现,而不会等待镜像调度间隔复制到主要受管集群。
步骤
- 在 Hub 集群中,导航到 Installed Operators,然后点 Openshift DR Hub Operator。
- 单击 DRPlacementControl 选项卡。
-
单击 DRPC
busybox-drpc
,然后单击 YAML 视图。 将操作改为
Relocate
DRPlacementControl 修改重新分配的操作
- 点击 Save。
验证 application
busybox
现在是否在主要受管集群中运行,故障切换集群ocp4perf2
是否在 YAML 文件中指定的。$ oc get pods,pvc -n busybox-sample
输出示例:
NAME READY STATUS RESTARTS AGE pod/busybox 1/1 Running 0 60s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/busybox-pvc Bound pvc-79f2a74d-6e2c-48fb-9ed9-666b74cfa1bb 5Gi RWO ocs-storagecluster-ceph-rbd 61s
验证
busybox
是否在第二个受管集群中运行。busybox 应用程序不应在此受管集群上运行。$ oc get pods,pvc -n busybox-sample
输出示例:
No resources found in busybox-sample namespace.
请注意发行说明的已知区域DR 问题,如已知问题部分所述。
如果您需要开发人员预览功能的帮助,请联络 ocs-devpreview@redhat.com 邮件列表和红帽开发团队成员将根据其可用性和工作计划尽快为您提供协助。