global 集群灾难恢复

本页是运行在不可变基础设施上的 global 集群的灾难恢复入口。部署时的灾难恢复配置是 global 集群安装操作步骤的一部分。

部署操作步骤

在安装指南中创建主 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-resources ConfigMap,以便安装过程可以导入所引用的 credential Secret,以及在适用时导入提供商特定的基础设施资源。该名称保留 dcs 前缀是为了保持与历史 installer 的兼容性。
  • 裸金属会在 installer 导入之前创建 dcs-import-extra-resources ConfigMap,以便安装过程可以保留 handoff 所需的裸金属和 elemental 资源。
  • 两个集群都安装完成后,在备用集群上安装 etcd Synchronizer。它从主集群读取 etcd 数据,并将其写入备用集群的本地 etcd。

网络要求

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

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

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

网络策略必须是双向的,因为在 failover 之后集群角色会互换。在 failover 之前,有效的服务流量通常是从备用到主。failover 之后,原主集群会变成新的备用集群,并且必须通过相同的端口访问新的主集群。该要求并不表示 etcd 复制是双向的: etcd Synchronizer 仅运行在当前备用集群上,并将同步数据写入其本地 etcd。

操作范围

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

  • 验证 etcd Synchronizer 的健康状态和复制堆积量。
  • 验证备用集群是否可以解密在主集群中创建的 Kubernetes Secrets。
  • 在计划内 failover 之前,验证主控制平面 VIP、备用控制平面 VIP 以及平台访问路径。
  • 在计划内 failover 或 failback 之前,验证两个集群网络之间已双向放通所需端口。切换后,原备用集群会成为新的主集群,而原主集群会成为新的备用集群,因此服务流量方向会反转。
  • 使用经过批准的操作步骤执行 failover 和 failback。
  • 在 failover 后协调提供商特定资源。
在卸载 Alauda Container Platform etcd Synchronizer 之前验证一致性

灾难恢复切换和支持 DR 的 global 集群升级都会卸载 etcd Synchronizer。在执行该卸载之前,请确认备用 global 集群的数据与主集群一致。在不可变基础设施上,业务集群节点由 Cluster API Machine 对象提供支持,因此在不同步一致的情况下,如果 owner-reference 解析错误,可能会删除这些 Machine 对象并销毁其背后的虚拟机。如果一致性检查报告缺失或多余的 key,请不要卸载该 plugin;应先解决不一致问题或联系技术支持。有关详细的切换和升级操作步骤,请参见 Global Cluster Disaster RecoveryUpgrade the global cluster

裸金属 DR 模型

裸金属 DR 会引入 VM 类提供商中不存在的主机级状态。global 集群不会创建物理机器;它管理生命周期较长的 MachineInventory 对象,并写入由每台主机上的 elemental-system-agent 消费的 plan Secret。由于这一点,备用 global 集群必须能够接受现有的 system-agent 令牌,并且必须接收业务集群 inventory 和 plan 状态,而不能覆盖其自身的 global inventory。

端点规则

global 主机和业务集群主机使用不同的 system-agent 端点:

机器类型端点
属于活动 global 集群的机器https://<current-global-control-plane-vip>/kubernetes/global
属于非 global 业务集群的机器https://<platform-domain>/kubernetes/global

默认情况下,这两个端点都是平台 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 路径。

请勿在 Handoff 后重复使用 Bootstrap ISO

在 bootstrap KIND 环境中生成的 SeedImage 指向 bootstrap 注册端点。global 集群安装并完成 handoff 后,任何新的 global 主机都应在活动 global 集群上创建新的 MachineRegistrationSeedImage 资源。仅当故障切换前的业务 ISO 使用平台域名作为注册 URL,且匹配的非 global MachineRegistration 已同步到备用集群时,才可以在 failover 后复用该 ISO。

对于 handoff 后的 global 主机注册,请将 system-agent server URL 注解设置为当前活动 global 控制平面 VIP。elemental operator 在渲染 system-agent 端点时会追加 /kubernetes/global 路径。failover 前使用主 VIP,failover 后使用备用 VIP。

apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: global-<purpose>
  namespace: cpaas-system
  annotations:
    baremetal.cluster.io/system-agent-server-url: https://<current-global-control-plane-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-issuerapi-audiences 值,通常为 https://kubernetes.default.svc.cluster.local
  • baremetal-system-agentServiceAccount、token Secret、Role 和 RoleBinding 必须精确同步到备用集群。
  • Role/baremetal-system-agent.rules[].resourceNames 只能包含 plan Secret 名称。不要授予命名空间范围的 Secret 访问权限,也不要添加 registry、bootstrap、kubeconfig 或平台 credential Secret。

在 failover 前,请先在备用集群上验证该权限边界。

TOKEN=$(kubectl -n cpaas-system get secret baremetal-system-agent-token -o jsonpath='{.data.token}' | base64 -d)

kubectl --token="${TOKEN}" -n cpaas-system auth can-i get secret <plan-secret-name>
kubectl --token="${TOKEN}" -n cpaas-system auth can-i patch secret <plan-secret-name>
kubectl --token="${TOKEN}" -n cpaas-system auth can-i get secret global-registry-auth
kubectl --token="${TOKEN}" -n cpaas-system auth can-i list secrets

预期结果:仅允许对 plan Secret 执行 getpatch;会拒绝 global-registry-auth 和命名空间范围的 list secrets

Alauda Container Platform etcd Synchronizer 范围

在备用集群上部署 etcd Synchronizer。在 failover 之前,同步方向是单向的:

source: primary global etcd
target: standby global etcd

同步允许备用集群继续协调现有 Bare Metal 集群的业务集群资源:

  • global 的 CAPI 资源:ClusterMachineMachineDeploymentKubeadmControlPlane、bootstrap templates 以及相关 owner 资源。
  • global 的 Bare Metal provider 资源:BaremetalClusterBaremetalMachineBaremetalMachineTemplateMachineInventoryPool
  • global 的 elemental 资源:MachineInventoryMachineRegistration
  • 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-agentSecret/cpaas-system/baremetal-system-agent-tokenRole/cpaas-system/baremetal-system-agentRoleBinding/cpaas-system/baremetal-system-agent

不要同步以下内容:

  • SeedImage
  • 备用 Cluster/cpaas-system/global
  • 备用 BaremetalCluster/cpaas-system/global
  • 属于备用 global 集群的备用 BaremetalMachineMachineInventoryPoolMachineInventoryMachineRegistration 对象。
  • 主集群中不需要用于业务集群协调的 Secret。
Secret 加密边界

当主集群和备用集群 apiserver 没有使用相同的 Kubernetes encryption-provider 配置时,不要对 /registry/secrets 下的每个 key 做 raw-sync。备用 apiserver 无法解密使用不同 key 写入的密文。应仅通过安全路径同步所需 Secret,使备用 apiserver 能使用备用加密密钥存储它们;或者对固定 auth bundle 使用经过批准的精确同步机制。

Failover 操作步骤

计划内或已声明的 failover 请按以下顺序执行:

  1. 阻断主 global 写入路径。停止或隔离那些仍可能继续写入业务集群资源的控制器和平台入口点。尽可能在所属 CR 或平台资源层完成此操作;仅缩放 Deployment 可能会被其 owner 恢复。

  2. 等待 etcd Synchronizer 将主集群的最新数据同步到备用集群,然后停止它。不要在 failover 后让旧主数据覆盖新的备用写入。

  3. 如果你的 provider 使用同步门控(sync gate),请在同步停止后清除该 gate,以免备用控制器因为认为同步仍在进行而持续重新排队。

  4. 将平台域名切换到备用平台入口。

  5. 验证 DNS 和 ingress:

    dig +short <platform-domain>
    curl -kI https://<platform-domain>/kubernetes/global/version
    curl -kI https://<standby-control-plane-vip>/kubernetes/global/version

    返回 401 是可以接受的;这表明请求已到达平台 ingress。

  6. 确认备用集群已具备管理 Bare Metal 业务集群所需的 provider 组件:CAPI core、kubeadm provider、Bare Metal provider、elemental-operator、cluster-transformer 和 alive 相关交付组件。

  7. 确认现有业务主机已通过平台域名重新连接,并且能够 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 成员关系。
  • 在备用集群上创建新的 MachineRegistrationSeedImage 后,可以注册一台新主机。
  • 只有当预 failover 业务 ISO 的注册 URL 使用平台域名时,它才可用。

裸金属故障排查

症状可能原因首先检查
handoff 目标列表为空在 installer API 调用之前缺少或未完整创建 dcs-import-extra-resourceskubectl -n cpaas-system get cm dcs-import-extra-resources -o yaml;检查 baremetal-system-agent-handoff Job 日志
failover 后现有主机返回 401ForbiddenServiceAccount 签名密钥、issuer、audience、token Secret 或 Role 的 resourceNames 不匹配sha256sum /etc/kubernetes/pki/sa.key /etc/kubernetes/pki/sa.pub;使用该 token 执行 kubectl auth can-i
DNS 切换后现有主机 TLS 校验失败平台证书链或 SAN 未覆盖平台域名以及两个 VIP检查 cpaas-system/dex.tls、证书 SAN,以及 curl -kI https://<vip>/kubernetes/global/version
备用 global 资源被主集群资源替换 etcd Synchronizer 的 ignore 规则未排除 global 资源检查 synchronizer 的 ignore ConfigMap,并在恢复备用资源之前停止同步
新主机无法使用旧 ISO 注册ISO 注册 URL 指向 bootstrap 或仅主机 IP,或者 MachineRegistration 未同步检查 MachineRegistration 状态,并在需要时在活动备用集群上重新生成 ISO

提供商说明

Huawei DCS
VMware vSphere
Huawei Cloud Stack
裸金属

按照 可选的灾难恢复部署 中的 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 集群,请参见: