Global 集群灾难恢复

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

INFO

从 ACP 4.5 开始, etcd Synchronizer 更名为 Global Cluster Disaster Recovery。在更名之前发布的插件包上传后,平台中仍会显示 etcd Synchronizer。

部署操作步骤

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

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

  • 每一侧均从各自的引导节点安装:每个 provider 上总共需要两个引导节点。
  • 主集群和备用集群使用相同的 Kubernetes API server 加密 provider 配置。
  • KubeadmControlPlane etcd server 证书 SAN 列表包含主集群和备用集群控制平面 VIP,以及 Platform Access Address。此列表与平台的 console.cert SAN 列表分开。
  • Huawei DCS 部署从 DCSCluster.spec.encryptionProviderConfigRef 引用共享的加密 provider Secret。该 Secret 必须存在于每个最终的 global 集群中,而不能只存在于安装该 Secret 的引导集群中。
  • VMware vSphere 部署通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 写入相同的 /etc/kubernetes/encryption-provider.conf 文件。
  • Huawei Cloud Stack 部署通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 写入相同的 /etc/kubernetes/encryption-provider.conf 文件。
  • 裸金属部署从 BaremetalCluster.spec.encryptionProviderConfigRef 引用共享的加密 provider Secret,并在两侧使用相同的 Kubernetes ServiceAccount 签名密钥。
  • Huawei DCS、VMware vSphere 和 Huawei Cloud Stack 在导入 installer 之前创建 dcs-import-extra-resources ConfigMap,以便安装过程导入所引用的凭证 Secret,以及适用情况下的 provider 专属基础设施资源。为兼容历史 installer,名称保留 dcs 前缀。
  • 裸金属部署在导入 installer 之前创建 dcs-import-extra-resources ConfigMap,以便安装过程保留交接所需的持久化裸金属和 elemental 所有者资源。它不会导入 Global plan Secret 或 kubeadm 引导数据 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 访问 active 平台。 etcd Synchronizer 使用此地址,日志记录和监控组件也会向该地址发送告警回调。
80 平台 HTTP仅当用户通过 HTTP 访问平台时需要。其他情况下的连接要求与端口 443 相同。
6443Kubernetes API server在安装或重新安装 etcd Synchronizer 期间,备用集群连接 active 集群的 API server,以获取同步所需的 etcd CA 材料。
11443内置镜像仓库备用集群从通过 Platform Access Address 配置的仓库中拉取平台和插件镜像。
2379etcd备用集群上的 etcd Synchronizer 从主集群读取 etcd 数据,并将其写入本地备用 etcd。

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

可观测性部署位置

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

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

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

运维范围

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

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

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

故障转移

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

  1. 隔离主集群,使其无法写入业务资源。
  2. 等待监控器显示不存在差异,然后从旧备用集群卸载 etcd-sync。移除其 ModuleInfo 才会卸载插件;仅将 Deployments 扩缩容到零并不足够(请参阅下面的警告)。对于 Bare Metal,接着在旧备用集群(该集群将成为活动集群)的 Bare Metal 提供商 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 上,先在新备用集群的提供商 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 仅将 Deployments 扩缩容到零,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 后,新备用集群即可正常启动。

请保持已隔离的集群与环境隔离,直到单独规划故障恢复。切勿让两个提供商同时针对同一业务清单运行。

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

裸金属 DR 模型

本节介绍适用于 ACP 4.4.0 及更高版本的 Bare Metal 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 提供商上设置 elemental.systemAgent.splitAuthEnabled: true。活动 Global 使用 sharedAuthReadOnly: false;备用集群接收数据时使用 sharedAuthReadOnly: true。在安装期间,在两端的引导 AppRelease 中设置这些值;之后还要按照在 global 集群上安装 Cluster API 提供商所述,在每个最终 global 集群的提供商 ModuleInfo 中再次设置这些值。保留标准的 ServiceAccount、Secret、Role 和 RoleBinding 名称。切勿授予对整个命名空间的 Secret 访问权限。

切换后,每个 Global 注册都必须使用本地 API 服务器:

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 在备用集群上运行,并读取主集群。支持 DR 的 v4.4 chart 已提供标准 Bare Metal 前缀和 Global 资源排除规则,并支持通过带标签的 ConfigMap 添加额外规则。自定义规则源必须存在于两个 Global 集群上,以便角色切换后仍可使用。

创建 baremetal-dr-rules,并将权重设为 100:

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 仅添加运行时的 Global 计划 Secret 键;渲染 chart 时无法预先知道这些键。

dcs-import-extra-resources 是安装时的切换输入。它必须包含持久的提供商资源;对于 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签名密钥、颁发者/受众、共享令牌 Secret,以及 Role resourceNames
监控器报告存在差异活动/备用方向、规则快照和隔离状态

供应商说明

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

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

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

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

另请参阅

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

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