Global 集群灾难恢复

此页面是 global 集群的灾难恢复入口,该集群的节点运行 Alauda OS。部署时的灾难恢复配置属于 global 集群安装操作步骤的一部分。

部署操作步骤

创建主集群和备用 global 集群时,请在安装指南中使用可选灾难恢复部署。

该部署操作步骤是安装时 DR 配置的权威来源,包括:

  • 每一侧都从各自的 bootstrap 节点进行安装:每个提供商总共使用两个 bootstrap 节点。
  • 主集群和备用集群使用相同的 Kubernetes API server 加密提供商配置。
  • 每个集群的 KubeadmControlPlane etcd server 证书 SAN 列表包含该集群自己的控制平面 VIP、Platform Access Address 和 etcd.kube-system;主集群和备用集群的列表不同(请参阅将 DR etcd Server 证书 SAN 添加到 KubeadmControlPlane)。此列表与平台 console.cert SAN 列表相互独立。
  • Huawei DCS 部署从 DCSCluster.spec.encryptionProviderConfigRef 引用共享的加密提供商 Secret。该 Secret 必须存在于每个最终的 global 集群中,而不仅仅是安装它的 bootstrap 集群。
  • VMware vSphere 部署通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 写入相同的 /etc/kubernetes/encryption-provider.conf 文件。
  • Huawei Cloud Stack 部署通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 写入相同的 /etc/kubernetes/encryption-provider.conf 文件。
  • Bare Metal 部署从 BaremetalCluster.spec.encryptionProviderConfigRef 引用共享的加密提供商 Secret,并在两侧使用相同的 Kubernetes ServiceAccount 签名密钥。
  • Huawei DCS、VMware vSphere 和 Huawei Cloud Stack 会在 installer 导入前创建 dcs-import-extra-resources ConfigMap,以便安装过程能够导入被引用的凭证 Secret,以及适用时提供商特定的基础设施资源。该名称保留 dcs 前缀,以保持历史 installer 兼容性。
  • Bare Metal 会在 installer 导入前创建 dcs-import-extra-resources ConfigMap,以便安装过程能够保留交接所需的持久化裸金属和 elemental owner 资源。它不会导入 Global plan Secret 或 kubeadm bootstrap data Secret;在所有目标 Global MachineInventory 对象存在后,新的交接会创建初始 Global plan Secret。
  • 两个集群安装成功后,备用集群会使用指向当前活动主集群的连接值安装 global-etcd-sync。

两个集群均安装完成后,请在两个 global 集群上安装基础设施提供商和 Cluster Bootstrap Provider,以便备用集群能够在故障转移后协调业务集群。请参阅 Huawei DCS、VMware vSphere、Huawei Cloud Stack 或 Bare Metal。

网络要求

灾难恢复的前提条件是使用 DNS 名称的稳定 Platform Access Address。在正常运行期间,该域名仅解析到主 global 集群 VIP。备用 global 集群使用该域名访问主 global 集群上的平台服务。

安装任一集群之前,请完成以下两项网络准备工作:

  • 配置每个集群的负载均衡器,将其 VIP 上所需的 TCP 端口转发到该 VIP 后方的控制平面节点。仅当用户通过 HTTP 访问平台时,才配置端口 80。
  • 在主集群和备用集群网络之间双向开放所需的 TCP 端口。将规则应用于防火墙、安全组、路由器 ACL 以及其他任何站点间网络控制措施。
TCP 端口服务所需原因
443 平台 HTTPS备用集群使用 Platform Access Address 访问活动平台。 Global Cluster Disaster Recovery 使用此地址,日志和监控组件也会向此地址发送告警回调。
80 平台 HTTP仅当用户通过 HTTP 访问平台时才需要。其他情况下,连通性要求与端口 443 相同。
6443Kubernetes API server安装或重新安装 Global Cluster Disaster Recovery 时,备用集群会连接活动集群的 API server,以获取同步所需的 etcd CA 材料。
11443内置镜像仓库备用集群从通过 Platform Access Address 配置的镜像仓库拉取平台和插件镜像。此要求仅适用于平台内置的 Registry。
2379etcd备用集群上的 Global Cluster Disaster Recovery 从主集群读取 etcd 数据,并将其写入本地备用 etcd。

网络策略必须是双向的,因为故障转移后集群角色会互换。故障转移前,有效服务流量通常从备用集群流向主集群。故障转移后,原主集群成为新的备用集群,必须通过相同端口访问新的主集群。这项要求并不意味着 etcd 复制是双向的: Global Cluster Disaster Recovery 仅在当前备用集群上运行,并将同步的数据写入其本地 etcd。

可观测性部署

灾难恢复仅复制 global 集群的 etcd 数据,cpaas-system 等命名空间不在复制范围内。因此,监控和日志数据永远不会复制到备用集群。在安装任一集群之前,请规划可观测性部署。

  • 每个 global 集群收集、存储和查询自身的指标与日志。主集群和备用集群不会使用彼此的监控或日志存储,因此备用集群在故障转移后可以立即监控自身。
  • 业务集群的监控和日志不得写入任一 global 集群。请在专用业务集群中汇总业务集群的指标和日志,并在该集群上运行 VictoriaMetrics Center 和日志存储,然后将每个业务集群的采集智能体指向该集群。
  • 如果某个网络区域无法访问该汇总集群,请为该区域提供单独的汇总集群,而不要回退到 global 集群。
  • 存储在 global 集群中的业务集群可观测性数据会在该集群的角色发生变化时变得不可用,因为这些数据不会被复制,另一个 global 集群也无法提供这些数据。

有关与非 Alauda OS 路径共用的同步范围和排除范围,请参阅 Global Cluster Disaster Recovery。

操作范围

安装主集群和备用集群后,请将灾难恢复作为独立的生命周期流程进行操作。使安装清单与安装指南保持一致,然后使用经过批准的操作运行手册执行以下任务:

  • 验证 Global Cluster Disaster Recovery 的运行状况和复制堆积量。
  • 验证备用集群能否解密在主集群上创建的 Kubernetes Secrets。
  • 在计划内故障转移之前,验证主集群和备用集群的控制平面 VIP 以及平台访问路径。
  • 在计划内故障转移或故障恢复之前,验证两个集群网络之间所需的端口是否已双向放行。切换后,原备用集群会成为新的主集群,原主集群会成为新的备用集群,因此服务流量的方向会反转。
  • 使用经过批准的操作步骤执行故障转移和故障恢复。
  • 故障转移后协调特定于 provider 的资源。
卸载 Alauda Container Platform Global Cluster Disaster Recovery 前验证一致性

灾难恢复切换和支持灾难恢复的 global 集群升级都会卸载 Global Cluster Disaster Recovery。在卸载之前,请确认备用 global 集群数据与主集群一致。在 Alauda OS 集群上,业务集群节点由 Cluster API Machine 对象提供支持,因此,不一致同步后错误的所有者引用解析可能会删除这些 Machine 对象,并销毁其后端虚拟机。如果一致性检查报告缺失或多余的键,请勿卸载插件;先解决不一致问题,或联系技术支持。有关与非 Alauda OS 路径共用的详细切换和升级操作步骤,请参阅 Global Cluster Disaster Recovery 和 Upgrade in a DR Environment。

故障转移

以下序列与 provider 无关:它由平台域和 etcd-sync 生命周期驱动,而不是由任何 provider API 驱动。特定于 provider 的 同步源和故障转移后检查请参阅 Provider Notes;对于 Bare Metal,请参阅 Bare Metal DR Model 部分。

  1. 隔离主集群,使其无法写入业务资源。
  2. 等待监控器显示无差异,然后从旧备用集群卸载 etcd-sync。移除其 ModuleInfo 才会卸载插件;仅将 Deployment 缩容到零还不够(请参阅下面的警告)。对于 Bare Metal,随后在旧备用集群的 Bare Metal provider 的 ModuleInfo 中设置 elemental.systemAgent.sharedAuthReadOnly: false;该集群会成为活动集群,然后等待 elemental-operator Deployment 不再包含 --system-agent-shared-auth-read-only 参数(使用 kubectl -n cpaas-system get deploy elemental-operator -o yaml | grep -- --system-agent-shared-auth-read-only 检查)。在此之前,新的工作节点无法获取其计划。
  3. 将平台域切换到备用集群的控制平面入口。
  4. 验证备用集群 API 和平台端点。
  5. 确认业务主机通过平台域重新连接,并能够更新计划反馈。
  6. 对于 Bare Metal,先在新备用集群的 provider ModuleInfo 中设置 elemental.systemAgent.sharedAuthReadOnly: true,并使用相同的命令确认 elemental-operator Deployment 包含 --system-agent-shared-auth-read-only 参数。然后,在新的备用集群(被隔离的原主集群)上安装 etcd-sync 插件,并使用反转后的活动/备用值;对于 Bare Metal,还要使用相同的 baremetal-dr-rules ConfigMap。请注意,活动集群令牌现在必须来自新的活动集群,并且推送插件包时使用的是平台域当前指向的集群的 Registry 凭证。
卸载镜像,不要仅将其缩容

启动时,etcd-sync 会解析平台域,并检查该域所指向的集群是否未安装 etcd-sync。这可以防止镜像同时在两侧运行。如果步骤 2 仅将 Deployment 缩容到零,ModuleInfo 仍会存在,新的备用集群会拒绝启动,并显示:

check failed, error: moduleinfo <name> is found, it shouldn't happen,
  please remove it or check the DNS resolution of platformURL: <platform-domain>

尽管提示文本如此表述,但这是安全检查按预期工作,而不是缺陷。在新的活动集群上删除 ModuleInfo 后,新的备用集群便会正常启动。

保持被隔离的集群处于隔离状态,直到单独规划故障恢复。切勿让两个 provider 同时针对同一业务清单运行。

切换后,在新的活动集群上验证每个业务 Cluster 和 Machine 对象均完好无损——在 Alauda OS 集群上,这些对象代表真实机器,因此在切换过程中丢失资源会导致节点被删除。

裸金属 DR 模型

本节介绍 ACP 4.4.0 及更高版本的裸金属 DR 操作步骤。涵盖全新主集群/备用集群安装;使用可选灾难恢复部署创建两个集群。

Bare Metal 将物理主机及其计划 Secret 保存在 MachineInventory 对象中。因此,DR 会将 Global 主机与业务主机分开。

端点和身份

主机端点身份同步
本地 Cluster/global 主机https://<local-control-plane-vip>:6443baremetal-global-system-agent仅本地
非 global 业务主机https://<platform-domain>/kubernetes/globalbaremetal-system-agent主集群到备用集群

Global 行专用于 DR 以及下文所述的交接后 Global 注册。业务行是标准的 Bare Metal 注册路径;有关业务集群路径分阶段的网络要求(包括 DNS、NTP、Registry 和集群内部流量),请参阅网络连接。

在两侧的 Bare Metal provider 上设置 elemental.systemAgent.splitAuthEnabled: true。活动 Global 使用 sharedAuthReadOnly: false;备用集群接收数据时使用 sharedAuthReadOnly: true。按照添加 provider 特定的 DR 字段中的说明,在每一侧的 bootstrap release 上设置这些值,并在每个最终的 global 集群的 provider ModuleInfo 中再次设置,同时设置 elemental.tls.caCertSecretKey;请参阅安装集群插件。保留标准的 ServiceAccount、Secret、Role 和 RoleBinding 名称。切勿授予命名空间范围的 Secret 访问权限。

交接后,每个 Global 注册都必须使用本地 API server:

metadata:
  annotations:
    baremetal.cluster.io/system-agent-auth-scope: global
    baremetal.cluster.io/system-agent-server-url: https://<local-control-plane-vip>:6443
    baremetal.cluster.io/system-agent-endpoint-mode: direct-apiserver

业务注册使用平台域。交接后不要重复使用 bootstrap Global ISO;请在活动 Global 上创建新的 Global 注册和 SeedImage。仅当业务 ISO 的注册 URL 使用平台域时,该 ISO 才可继续重复使用。

同步规则

etcd-sync 在备用集群上运行,并读取主集群。支持 DR 的 v4.4 chart 已提供标准的 Bare Metal 前缀和 Global 资源排除项,并接受来自带标签 ConfigMap 的其他规则。自定义规则源必须存在于两个 Global 集群上,以便在角色切换后可用。

使用权重 100 创建 baremetal-dr-rules:

apiVersion: v1
kind: ConfigMap
metadata:
  name: baremetal-dr-rules
  namespace: cpaas-system
  labels:
    etcd-sync.cpaas.io/enabled: "true"
  annotations:
    etcd-sync.cpaas.io/weight: "100"
data:
  ignore-equal.txt: |
    # Add one line for every Global plan Secret on both sides.
    /registry/secrets/cpaas-system/<primary-global-plan-secret>
    /registry/secrets/cpaas-system/<standby-global-plan-secret>

内置 chart 规则已经涵盖 Bare Metal 资源前缀、Global 清单/注册筛选、SeedImage、Global 本地 system-agent bundle、监控器以及本地 Registry 凭证。不要在此 ConfigMap 中重复添加这些条目。开始同步前,已安装的 chart 必须包含这些内置规则。

将计划占位符替换为实际值:

  • 从 MachineInventory.status.plan.secretRef.name 读取计划名称。
  • 为两侧的每个 Global 计划 Secret 添加一行。
  • 每当添加或替换 Global 计划 Secret 时,更新两侧的 ConfigMap。

首次同步前,要求规则源注解为 etcd-sync.cpaas.io/status: accepted,并确认 etcd-sync-rule-snapshot 包含该源:

kubectl --kubeconfig <standby-kubeconfig> -n cpaas-system \
  get configmap baremetal-dr-rules \
  -o jsonpath='{.metadata.annotations.etcd-sync\.cpaas\.io/status}{"\n"}'
kubectl --kubeconfig <standby-kubeconfig> -n cpaas-system \
  get configmap etcd-sync-rule-snapshot \
  -o jsonpath='{.data.snapshot\.json}'

被拒绝的源不会生效。在允许镜像写入之前修复该问题。

插件 chart 负责标准的 CAPI、Bare Metal、Elemental、Global 资源、system-agent、SeedImage、Registry 和监控规则。此 ConfigMap 仅添加渲染 chart 时无法获知的运行时 Global 计划 Secret 密钥。

dcs-import-extra-resources 是安装时的交接输入。它必须包含持久化的 provider 资源,以及 DCS 和 Bare Metal 所引用的加密 Secret,但它不是 etcd 同步规则源。

启动和验证

  1. 仅在当前备用集群上安装 global-etcd-sync。
  2. 将 active_cluster_vip 设置为主集群 VIP。
  3. 将 active_cluster_token_secret_ref 设置为备用集群本地的 Secret,其中包含主集群令牌。
  4. 等待 AppRelease 和两个 Deployment 均变为 Ready。
  5. 运行监控器检查,并要求缺失密钥数和多余密钥数均为零。
  6. 将规则快照和监控器结果作为验收门禁的一部分;仅凭 AppRelease 状态不足以完成验收。

验收

故障切换后,验证:

  • 业务 Cluster 和 Machine 对象保持健康。
  • 每个 BaremetalMachine 仍引用预期的 MachineInventory。
  • 业务计划达到 Applied,且其反馈已更新。
  • 工作节点扩容会创建计划并更新共享 Role。
  • 工作节点缩容完成其清理计划并释放清单。
  • URL 使用平台域的业务 ISO 可以注册新主机。
  • Global 主机仍使用本地 VIP、本地令牌和本地计划 Secret。

故障排除

症状首要检查
规则源为 rejected规则数据密钥、语法以及 message 注解
Global 计划被覆盖ignore-equal.txt 中缺少其确切的 Secret 密钥;停止同步并更新两个规则 ConfigMap
Global 清单被删除已安装的 chart 缺少其内置 Global 排除项;停止同步,并在恢复本地对象前验证渲染后的 chart
业务主机获得 401 或 403签名密钥、issuer/audience、共享令牌 Secret 以及 Role resourceNames
监控器报告存在差异活动/备用方向、规则快照和隔离状态

Provider Notes

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

按照可选灾难恢复部署中的 DCS 步骤操作。两侧的 DCS 安装必须使用相同的加密提供程序 Secret 和 DCSCluster.spec.encryptionProviderConfigRef。对于 DCS,不要将加密提供程序文件添加到 KubeadmControlPlane.spec.kubeadmConfigSpec.files。在两侧创建 DCS dcs-import-extra-resources ConfigMap,以便安装程序导入 DCSCluster.spec.credentialSecretRef.name 引用的 Secret 和 DCSCluster.spec.encryptionProviderConfigRef.name 引用的 Secret。DCS 提供程序资源由内置流程迁移,但该流程不会复制任一 Secret。

每个最终的 global 集群中都必须存在加密提供程序 Secret。如果它仅保留在引导集群中,安装仍会完成,且这对集群看起来健康,但引导集群消失后,后续每次控制平面计算机创建都会失败——新的 Machine 会停留在 Provisioning 中,并且提供程序会记录 get encryption provider config secret ... not found。在停用任一引导集群之前,验证两侧均存在该 Secret。

对于计划内切换,请运行故障切换序列。baremetal-dr-rules ConfigMap 和注册检查仅适用于 Bare Metal;其他步骤均按原样适用于 DCS。切换后,在新的活动集群上验证业务 Cluster、Machine 和 DCSMachine 对象完整,且没有虚拟机被删除:故障切换期间,安装指南命名约定中的 global- 名称前缀用于标识属于 global 对的资源,因此两侧的每个 DCS 资源都必须带有该前缀。同时确认 DCS 凭证 Secret 和加密提供程序 Secret 存在于当前活动的一侧。

另请参阅

有关在非 Alauda OS 上对 global 集群进行灾难恢复,请参阅Global Cluster Disaster Recovery。

有关在 Alauda OS 上安装和升级 global 集群,请参阅: