Global 集群灾难恢复

本页面是运行在 Immutable Infrastructure 上的 global 集群的灾难恢复入口。部署时的灾难恢复配置属于 global 集群安装操作步骤的一部分。

部署操作步骤

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

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

  • 主集群和备用集群使用相同的 Kubernetes API server 加密 provider 配置。
  • KubeadmControlPlane etcd server 证书 SAN 列表包含主集群和备用集群控制平面 VIP,以及 Platform Access Address。此列表与平台 console.cert SAN 列表分开。
  • Huawei DCS 部署从 DCSCluster.spec.encryptionProviderConfigRef 引用共享的加密 provider 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 引用共享的加密 provider Secret,并在两端使用相同的 Kubernetes ServiceAccount 签名密钥。
  • Huawei DCS、VMware vSphere 和 Huawei Cloud Stack 在 installer 导入之前创建 dcs-import-extra-resources ConfigMap,以便安装过程能够导入所引用的凭证 Secret,以及适用时的 provider 特定基础设施资源。出于历史 installer 兼容性考虑,其名称保留 dcs 前缀。
  • 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,其连接值指向当前活动的主集群。

网络要求

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

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

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

网络策略必须是双向的,因为故障切换后集群角色会发生反转。故障切换前,实际的服务流量通常是从备用集群流向主集群。故障切换后,原主集群会成为新的备用集群,并且必须通过相同的端口访问新的主集群。此要求并不意味着 etcd 复制是双向的: etcd Synchronizer 仅在当前备用集群上运行,并将同步数据写入其本地 etcd。

可观测性部署

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

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

有关同步范围和排除范围,请参阅 Global Cluster Disaster Recovery

运维范围

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

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

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

裸金属灾难恢复模型

本节介绍 ACP 4.4.0 及更高版本的裸金属灾难恢复操作步骤。该操作步骤适用于全新安装主集群和备用集群的场景;请使用可选灾难恢复部署创建这两个集群。

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

端点和身份

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

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

在两个 Bare Metal provider 版本中设置 elemental.systemAgent.splitAuthEnabled: true。活动 Global 使用 sharedAuthReadOnly: false;备用集群接收数据时使用 sharedAuthReadOnly: true。保留标准的 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

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

同步规则

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

创建权重为 100baremetal-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 inventory/registration 过滤、SeedImage、Global 本地 system-agent bundle、monitor 以及本地 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}'

被拒绝的源不会生效。允许 mirror 写入前,请先修复该问题。

插件 chart 负责标准 CAPI、Bare Metal、Elemental、Global 资源、system-agent、SeedImage、registry 和 monitor 规则。此 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. 运行 monitor 检查,并要求缺失键和多余键均为零。
  6. 将规则快照和 monitor 结果作为验收门禁的一部分;仅凭 AppRelease 状态不足以完成验收。

故障切换

  1. 隔离主集群,使其无法写入业务资源。
  2. 等待 monitor 显示无差异,然后从旧备用集群中卸载 etcd-sync。移除其 ModuleInfo 才能卸载插件;仅将 Deployment 缩容至零并不足够(请参阅下方警告)。
  3. 将平台域名切换到备用集群控制平面入口。
  4. 验证备用集群 API 和平台端点。
  5. 确认业务主机通过平台域名重新连接,并可以更新计划反馈。
  6. 在新备用集群(已隔离的原主集群)上安装 etcd-sync 插件,使用反向的活动/备用值以及相同的 baremetal-dr-rules ConfigMap。请注意,活动集群令牌现在必须来自新的活动集群,并且推送插件包时使用的是平台域名当前指向的集群的 Registry 凭证。
卸载 mirror,不要仅将其缩容

启动时,etcd-sync 会解析平台域名,并检查该域名所指向的集群是否未安装 etcd-sync。这可以防止 mirror 同时在两侧运行。如果第 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 同时针对同一业务 inventory 运行。

验收

故障切换后,请验证:

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

故障排除

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

提供商说明

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。

另请参阅

有关传统操作系统 global 集群的灾难恢复,请参阅 Global Cluster Disaster Recovery

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