global 集群灾难恢复
本页是运行在不可变基础设施上的 global 集群的灾难恢复入口。部署时的灾难恢复配置是 global 集群安装操作步骤的一部分。
目录
部署操作步骤网络要求操作范围裸金属 DR 模型端点规则共享令牌要求Alauda Container Platform etcd Synchronizer 范围Failover 操作步骤Failover 后验证裸金属故障排查提供商说明另请参阅部署操作步骤
在安装指南中创建主 global 集群和备用 global 集群时,请使用 可选的灾难恢复部署。
该部署操作步骤是安装时 DR 配置的权威来源,包括:
- 主集群和备用集群使用相同的 Kubernetes API server 加密提供程序配置。
- etcd server 证书 SAN 列表同时包含主控制平面 VIP、备用控制平面 VIP 以及平台访问地址。
- Huawei DCS 部署通过
DCSCluster.spec.encryptionProviderConfigRef引用共享的加密提供程序 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引用共享的加密提供程序 Secret,并在两侧使用相同的 Kubernetes ServiceAccount 签名密钥。 - Huawei DCS、VMware vSphere 和 Huawei Cloud Stack 会在 installer 导入之前创建
dcs-import-extra-resourcesConfigMap,以便安装过程可以导入所引用的 credential Secret,以及在适用时导入提供商特定的基础设施资源。该名称保留dcs前缀是为了保持与历史 installer 的兼容性。 - 裸金属会在 installer 导入之前创建
dcs-import-extra-resourcesConfigMap,以便安装过程可以保留 handoff 所需的裸金属和 elemental 资源。 - 两个集群都安装完成后,在备用集群上安装 etcd Synchronizer。它从主集群读取 etcd 数据,并将其写入备用集群的本地 etcd。
网络要求
使用 DNS 名称的稳定平台访问地址是灾难恢复的先决条件。在正常运行期间,该域名仅解析到主 global 集群 VIP。备用 global 集群使用该域名访问主 global 集群上的平台服务。
在安装任一集群之前,请完成以下两项网络准备:
- 配置每个集群的负载均衡器,将其 VIP 上所需的 TCP 端口转发到该 VIP 后面的控制平面节点。仅当用户通过 HTTP 访问平台时,才配置端口
80。 - 在主集群与备用集群网络之间的双向方向上允许所需的 TCP 端口。将这些规则应用于防火墙、安全组、路由器 ACL 以及任何其他站点间网络控制。
网络策略必须是双向的,因为在 failover 之后集群角色会互换。在 failover 之前,有效的服务流量通常是从备用到主。failover 之后,原主集群会变成新的备用集群,并且必须通过相同的端口访问新的主集群。该要求并不表示 etcd 复制是双向的: etcd Synchronizer 仅运行在当前备用集群上,并将同步数据写入其本地 etcd。
操作范围
主集群和备用集群安装完成后,请将 DR 作为单独的生命周期流程进行运维。保持安装清单与安装指南一致,然后使用经过批准的运维 runbook 执行以下任务:
- 验证 etcd Synchronizer 的健康状态和复制堆积量。
- 验证备用集群是否可以解密在主集群中创建的 Kubernetes Secrets。
- 在计划内 failover 之前,验证主控制平面 VIP、备用控制平面 VIP 以及平台访问路径。
- 在计划内 failover 或 failback 之前,验证两个集群网络之间已双向放通所需端口。切换后,原备用集群会成为新的主集群,而原主集群会成为新的备用集群,因此服务流量方向会反转。
- 使用经过批准的操作步骤执行 failover 和 failback。
- 在 failover 后协调提供商特定资源。
灾难恢复切换和支持 DR 的 global 集群升级都会卸载 etcd Synchronizer。在执行该卸载之前,请确认备用 global 集群的数据与主集群一致。在不可变基础设施上,业务集群节点由 Cluster API Machine 对象提供支持,因此在不同步一致的情况下,如果 owner-reference 解析错误,可能会删除这些 Machine 对象并销毁其背后的虚拟机。如果一致性检查报告缺失或多余的 key,请不要卸载该 plugin;应先解决不一致问题或联系技术支持。有关详细的切换和升级操作步骤,请参见 Global Cluster Disaster Recovery 和 Upgrade the global cluster。
裸金属 DR 模型
裸金属 DR 会引入 VM 类提供商中不存在的主机级状态。global 集群不会创建物理机器;它管理生命周期较长的 MachineInventory 对象,并写入由每台主机上的 elemental-system-agent 消费的 plan Secret。由于这一点,备用 global 集群必须能够接受现有的 system-agent 令牌,并且必须接收业务集群 inventory 和 plan 状态,而不能覆盖其自身的 global inventory。
端点规则
为 global 主机和业务集群主机使用不同的 system-agent 端点:
默认情况下,这两个端点都是平台 ingress 路径,而不是直接的 kube-apiserver :6443 端点。对于 bootstrap KIND 阶段,global 主机注册使用 bootstrap 主机端点,通常为 https://<bootstrap-host-ip>:12443。handoff 只会将已安装的 global 主机切换到最终的 VIP 端点。
对于必须在不依赖自身 ingress 的情况下继续管理自身主机的 DR global 集群,可以在 Bare Metal provider AppRelease 上设置 handoffHook.directAPIServer: true 来直接启用 kube-apiserver 访问(这要求同时设置 handoffHook.controlPlaneVIP)。随后,handoff 会让 global 集群的机器直接指向 https://<current-global-control-plane-vip>:6443,不再经过 /kubernetes/global ingress 路径,并且 agent 会信任集群内 apiserver CA,而不是 platform-ingress 证书。该参数默认为 false(即上面的 ingress 端点);它仅适用于 global 集群机器,而业务集群机器始终保留 ingress 路径。
在 bootstrap KIND 环境中生成的 SeedImage 指向 bootstrap 注册端点。global 集群安装并完成 handoff 后,任何新的 global 主机都应在活动 global 集群上创建新的 MachineRegistration 和 SeedImage 资源。仅当故障切换前的业务 ISO 使用平台域名作为注册 URL,且匹配的非 global MachineRegistration 已同步到备用集群时,才可以在 failover 后复用该 ISO。
对于 handoff 后的 global 主机注册,请将 system-agent server URL 注解设置为当前活动 global 控制平面 VIP。elemental operator 在渲染 system-agent 端点时会追加 /kubernetes/global 路径。failover 前使用主 VIP,failover 后使用备用 VIP。
当 global 集群通过 handoffHook.directAPIServer: true 完成 handoff 时,应改为将新的 global 注册保持在同一个直接 apiserver 端点:设置 baremetal.cluster.io/system-agent-server-url: https://<current-global-control-plane-vip>:6443,并添加 baremetal.cluster.io/system-agent-direct: "true"。随后,elemental operator 会原样提供该 URL,而不会追加 /kubernetes/global。
共享令牌要求
现有主机会保留它们在 failover 之前收到的 baremetal-system-agent 令牌。要使该令牌在备用集群上可用:
- 主集群和备用集群必须使用相同的
/etc/kubernetes/pki/sa.key和/etc/kubernetes/pki/sa.pub。 - 主集群和备用集群必须使用相同的
service-account-issuer和api-audiences值,通常为https://kubernetes.default.svc.cluster.local。 baremetal-system-agent的ServiceAccount、token Secret、Role 和 RoleBinding 必须精确同步到备用集群。Role/baremetal-system-agent.rules[].resourceNames只能包含 plan Secret 名称。不要授予命名空间范围的 Secret 访问权限,也不要添加 registry、bootstrap、kubeconfig 或平台 credential Secret。
在 failover 前,请先在备用集群上验证该权限边界。
预期结果:仅允许对 plan Secret 执行 get 和 patch;会拒绝 global-registry-auth 和命名空间范围的 list secrets。
Alauda Container Platform etcd Synchronizer 范围
在备用集群上部署 etcd Synchronizer。在 failover 之前,同步方向是单向的:
同步允许备用集群继续协调现有 Bare Metal 集群的业务集群资源:
- 非
global的 CAPI 资源:Cluster、Machine、MachineDeployment、KubeadmControlPlane、bootstrap templates 以及相关 owner 资源。 - 非
global的 Bare Metal provider 资源:BaremetalCluster、BaremetalMachine、BaremetalMachineTemplate和MachineInventoryPool。 - 非
global的 elemental 资源:MachineInventory和MachineRegistration。 - plan Secret、bootstrap data Secret、业务 kubeconfig Secret 以及同步资源所需的业务 credential Secret。
- 目标侧必须存在的 provider 引用 Secret,包括在启用 Bare Metal DR 时由
BaremetalCluster.spec.encryptionProviderConfigRef引用的加密提供程序 Secret。 - 完整共享 auth bundle:
ServiceAccount/cpaas-system/baremetal-system-agent、Secret/cpaas-system/baremetal-system-agent-token、Role/cpaas-system/baremetal-system-agent和RoleBinding/cpaas-system/baremetal-system-agent。
不要同步以下内容:
SeedImage。- 备用
Cluster/cpaas-system/global。 - 备用
BaremetalCluster/cpaas-system/global。 - 属于备用
global集群的备用BaremetalMachine、MachineInventoryPool、MachineInventory和MachineRegistration对象。 - 主集群中不需要用于业务集群协调的 Secret。
当主集群和备用集群 apiserver 没有使用相同的 Kubernetes encryption-provider 配置时,不要对 /registry/secrets 下的每个 key 做 raw-sync。备用 apiserver 无法解密使用不同 key 写入的密文。应仅通过安全路径同步所需 Secret,使备用 apiserver 能使用备用加密密钥存储它们;或者对固定 auth bundle 使用经过批准的精确同步机制。
Failover 操作步骤
计划内或已声明的 failover 请按以下顺序执行:
-
阻断主
global写入路径。停止或隔离那些仍可能继续写入业务集群资源的控制器和平台入口点。尽可能在所属 CR 或平台资源层完成此操作;仅缩放 Deployment 可能会被其 owner 恢复。 -
等待 etcd Synchronizer 将主集群的最新数据同步到备用集群,然后停止它。不要在 failover 后让旧主数据覆盖新的备用写入。
-
如果你的 provider 使用同步门控(sync gate),请在同步停止后清除该 gate,以免备用控制器因为认为同步仍在进行而持续重新排队。
-
将平台域名切换到备用平台入口。
-
验证 DNS 和 ingress:
返回
401是可以接受的;这表明请求已到达平台 ingress。 -
确认备用集群已具备管理 Bare Metal 业务集群所需的 provider 组件:CAPI core、kubeadm provider、Bare Metal provider、elemental-operator、cluster-transformer 和 alive 相关交付组件。
-
确认现有业务主机已通过平台域名重新连接,并且能够 watch 或 patch 它们的 plan Secret。
Failover 后验证
在备用集群成为活动集群后,请按风险递增的顺序进行验证:
- 现有业务集群仍保持 Ready。
- 所有
BaremetalMachine对象仍绑定到预期的MachineInventory对象。 - plan Secret 可以更新,并且
MachineInventory.status.plan的反馈发生变化。 - worker 扩容会分配一个可用 inventory,并更新
Role/baremetal-system-agent.resourceNames以包含新的 plan Secret。 - worker 缩容会按设计执行一个干净的 plan,并释放 inventory。
- 控制平面替换会恢复所需的 KCP 副本数和 etcd 成员关系。
- 在备用集群上创建新的
MachineRegistration和SeedImage后,可以注册一台新主机。 - 只有当预 failover 业务 ISO 的注册 URL 使用平台域名时,它才可用。
裸金属故障排查
提供商说明
按照 可选的灾难恢复部署 中的 DCS 步骤执行。DCS 安装必须在两侧保持相同的加密提供程序 Secret 和 DCSCluster.spec.encryptionProviderConfigRef。不要为 DCS 将加密提供程序文件添加到 KubeadmControlPlane.spec.kubeadmConfigSpec.files。在两侧都创建 DCS 的 dcs-import-extra-resources ConfigMap,以便 installer 导入 DCSCluster.spec.credentialSecretRef.name 所引用的 Secret。DCS provider 资源通过内置流程迁移。
另请参阅
有关传统操作系统 global 集群灾难恢复,请参见 Global Cluster Disaster Recovery。
有关在不可变基础设施上安装和升级 global 集群,请参见: