global 集群灾难恢复

灾难恢复路径

本页介绍在 传统操作系统 上运行的 global 集群的灾难恢复。Immutable Infrastructure 上的 global 集群灾难恢复正在开发中;请参见 Immutable Infrastructure 上的 global 集群灾难恢复

概述

此解决方案面向 global 集群的灾难恢复场景而设计。global 集群作为平台的控制平面,负责管理其他集群。为确保在 global 集群故障时平台服务能够持续可用,此方案部署两个 global 集群:主集群和备用集群。

灾难恢复机制基于将 Primary Cluster 的 etcd 数据实时同步到 Standby Cluster。如果 Primary Cluster 因故障而不可用,服务可以快速切换到 Standby Cluster。

支持的灾难场景

  • Primary Cluster 发生不可恢复的系统级故障,导致其无法运行;
  • 承载 Primary Cluster 的物理机或虚拟机故障,导致其无法访问;
  • Primary Cluster 所在位置发生网络故障,导致服务中断;

不支持的灾难场景

  • global 集群内部部署的应用发生故障;
  • 由存储系统故障导致的数据丢失(超出 etcd 同步范围);

Primary ClusterStandby Cluster 的角色是相对的:当前为平台提供服务的集群是 Primary Cluster(DNS 指向它),而备用集群是 Standby Cluster。发生故障切换后,这两个角色会互换。

注意事项

  • 此方案仅同步 global 集群的 etcd 数据,不包含 registry、chartmuseum 或其他组件中的数据;

  • 为便于排障和管理,建议以类似 standby-global-m1 的风格命名节点,以表明该节点属于哪个集群(Primary 或 Standby)。

  • 不支持集群内应用数据的灾难恢复;

  • 两个集群之间需要保持稳定的网络连通性,以确保 etcd 同步可靠;

  • 如果集群基于异构架构(例如 x86 和 ARM),请使用双架构安装包;

  • 以下 namespace 不参与 etcd 同步。如果在这些 namespace 中创建了资源,用户必须手动备份:

    cpaas-system
    cert-manager
    default
    global-credentials
    cpaas-system-global-credentials
    kube-ovn
    kube-public
    kube-system
    nsx-system
    cpaas-solution
    kube-node-lease
    kubevirt
    nativestor-system
    operators
  • 如果两个集群都配置为使用内置镜像仓库,则容器镜像必须分别上传到每个集群;

  • 如果 Primary Cluster 部署了 DevOps Eventing v3(knative-operator)及其实例,则备用集群中也必须预先部署相同组件。

流程概览

  1. 准备一个统一的域名用于平台访问;
  2. 将域名指向 Primary Cluster 的 VIP,并安装 Primary Cluster
  3. 临时将 DNS 解析切换到备用 VIP,以安装 Standby Cluster;
  4. Primary Cluster 的 ETCD 加密密钥复制到之后将作为 Standby Cluster 控制平面节点的节点上;
  5. 安装并启用 etcd 同步插件;
  6. 验证同步状态并执行定期检查;
  7. 发生故障时,将 DNS 切换到备用集群以完成灾难恢复。

所需资源

  • 一个统一的域名,作为 Platform Access Address,以及用于在该域名上提供 HTTPS 服务的 TLS 证书和私钥;

  • 每个集群各自一个专用虚拟 IP 地址——一个用于 Primary Cluster,另一个用于 Standby Cluster;

    • 预先配置负载均衡器,将端口 804436443237911443 上的 TCP 流量转发到对应 VIP 后面的控制平面节点。

操作步骤

步骤 1:安装 Primary Cluster

DR(灾难恢复环境)安装注意事项

在安装 DR 环境的主集群时,

  • 首先,记录按照安装 Web UI 指南所设置的所有参数。安装备用集群时,必须保持其中一些选项一致。
  • 必须预先配置一个 User-provisioned Load Balancer,以便将发送到虚拟 IP 的流量进行路由。Self-built VIP 选项不可用。
  • Platform Access Address 字段必须是域名,而 Cluster Endpoint 必须是虚拟 IP 地址。
  • 两个集群都必须配置为使用 An Existing Certificate(且必须是同一份证书);如有必要,请申请有效证书。Self-signed Certificate 选项不可用。
  • Image Repository 设置为 Platform Deployment 时,UsernamePassword 字段都不能为空IP/Domain 字段必须设置为用作 Platform Access Address 的域名。
  • Platform Access AddressHTTP PortHTTPS Port 字段必须分别为 80443
  • 当进入安装指南第二页(Step: Advanced)时,Other Platform Access Addresses 字段必须包含当前集群的虚拟 IP。

请参考以下文档完成安装:

步骤 2:安装 Standby Cluster

  1. 临时将域名指向备用集群的 VIP;

  2. 登录 Primary Cluster 的第一个控制平面节点,并将 etcd 加密配置复制到所有备用集群控制平面节点:

    # Assume the primary cluster control plane nodes are 1.1.1.1, 2.2.2.2 & 3.3.3.3
    # and the standby cluster control plane nodes are 4.4.4.4, 5.5.5.5 & 6.6.6.6
    for i in 4.4.4.4 5.5.5.5 6.6.6.6  # Replace with standby cluster control plane node IPs
    do
      ssh "<user>@$i" "sudo mkdir -p /etc/kubernetes/"
      scp /etc/kubernetes/encryption-provider.conf "<user>@$i:/tmp/encryption-provider.conf"
      ssh "<user>@$i" "sudo install -o root -g root -m 600 /tmp/encryption-provider.conf /etc/kubernetes/encryption-provider.conf && rm -f /tmp/encryption-provider.conf"
    done
  3. 以与主集群相同的方式安装备用集群

安装备用集群的注意事项

在安装 DR 环境的备用集群时, 以下选项必须与 Primary Cluster 保持一致:

  • Platform Access Address 字段。
  • Certificate 的所有字段。
  • Image Repository 的所有字段
  • 重要:确保镜像仓库凭据和 管理员用户与 Primary Cluster 上设置的一致。

并且请务必遵循步骤 1 中的 DR(灾难恢复环境)安装注意事项

请参考以下文档完成安装:

步骤 3:启用 etcd 同步

  1. 在适用情况下,配置负载均衡器将端口 2379 转发到对应集群的控制平面节点。仅支持 TCP 模式;不支持在 L7 上转发。

    INFO

    通过负载均衡器进行端口转发并非必需。 如果备用集群可以直接访问活动的 global 集群,请通过 Active Global Cluster ETCD Endpoints 指定 etcd 地址。

  2. 使用其 VIP 访问 备用 global 集群 Web 控制台,并切换到 Administrator 视图。

  3. 导航到 Marketplace > Cluster Plugins,选择 global 集群。

  4. 找到 etcd Synchronizer,单击 Install,并配置以下参数:

    4.3.1+
    4.3.0

    前提条件(仅 4.3.1+): 在备用 global 集群上创建 etcd-sync-active-cluster-token Secret。首先,从活动 global 集群获取用于访问活动 global 集群 API server 的 bearer token。然后复制命令输出,并在创建 Secret 时使用它。该 Secret 会将令牌存储在 data key token 下。

    # Run this command on the active cluster.
    kubectl -n cpaas-system get secret k8sadmin -o jsonpath='{.data.token}' | base64 -d

    复制输出值,然后在备用集群上运行此命令:

    ACTIVE_CLUSTER_TOKEN='<paste-the-token-from-the-active-cluster>'
    kubectl -n cpaas-system create secret generic etcd-sync-active-cluster-token \
      --from-literal=token="${ACTIVE_CLUSTER_TOKEN}" \
      --dry-run=client -o yaml | kubectl apply -f -
    • Active Global Cluster VIP 设置为活动 global 集群的 VIP。
    • 如果没有通过负载均衡器转发端口 2379,请正确配置 Active Global Cluster ETCD Endpoints
    • Standby Cluster ETCD Endpoints 设置为备用集群的 etcd 地址。除非本地 etcd 服务通过不同的端点暴露,否则请使用默认值。
    • Active Global Cluster Token Secret 设置为 etcd-sync-active-cluster-token
    • 使用 Data Check Interval 的默认值。
    • 除非用于排障,否则请保持 Print detail logs 处于禁用状态。

    安装过程中,系统会在 etcd-sync Deployment 启动之前先运行 etcd-sync-bootstrap Job。只有在该 Job 准备好 remote-etcd-caremote-etcd-issuerremote-etcd-client 之后,插件安装才会继续。

    验证 bootstrap Job 和运行时资源:

    kubectl get job -n cpaas-system etcd-sync-bootstrap
    kubectl logs -n cpaas-system job/etcd-sync-bootstrap
    kubectl get secret -n cpaas-system remote-etcd-ca
    kubectl get issuer -n cpaas-system remote-etcd-issuer
    kubectl get certificate -n cpaas-system remote-etcd-client
    kubectl get secret -n cpaas-system remote-etcd-client

请等待 kubectl get lease -n cpaas-system etcd-sync-mirror -o jsonpath='{.spec.holderIdentity}' 返回非空值后再继续。

验证同步 Pod 是否已在备用集群上运行,并识别当前 leader:

kubectl get po -n cpaas-system -l app=etcd-sync
kubectl get lease -n cpaas-system etcd-sync-mirror
leader_pod=$(kubectl get lease -n cpaas-system etcd-sync-mirror -o jsonpath='{.spec.holderIdentity}')
kubectl logs -n cpaas-system "$leader_pod" | grep -E "Acquired leader lease|Start Sync update"

如果需要重新同步具有 ownerReference 依赖的资源,请在出现 Start Sync update 之后重新创建当前 leader Pod:

leader_pod=$(kubectl get lease -n cpaas-system etcd-sync-mirror -o jsonpath='{.spec.holderIdentity}')
kubectl delete po -n cpaas-system "$leader_pod"

检查同步状态:

mirror_svc=$(kubectl get svc -n cpaas-system etcd-sync-monitor -o jsonpath='{.spec.clusterIP}')
ipv6_regex="^[0-9a-fA-F:]+$"
if [[ $mirror_svc =~ $ipv6_regex ]]; then
  mirror_host="[$mirror_svc]"
else
  mirror_host="$mirror_svc"
fi
curl -g "http://${mirror_host}/check"

输出解读:

  • LOCAL ETCD missed keys:键存在于主 global 集群中,但在备用集群中缺失。通常在重启当前 etcd-sync leader Pod 后即可解决。
  • LOCAL ETCD surplus keys:键存在于备用 global 集群中,但在主集群中不存在。请先与运维团队一起审查这些键,然后再删除它们。

如果安装了以下组件,请重启其服务:

  • Log Storage for Elasticsearch:

    kubectl delete po -n cpaas-system -l service_name=cpaas-elasticsearch
  • Monitoring for VictoriaMetrics:

    kubectl delete po -n cpaas-system -l 'service_name in (alertmanager,vmselect,vminsert)'

灾难恢复流程

在卸载 etcd 同步插件之前验证主/备一致性

此操作会卸载 etcd 同步插件。在卸载之前,请确认备用集群的数据与主集群一致。如果在备用集群缺少主集群拥有的数据时卸载插件,可能会导致 owner reference 解析错误,并且业务集群节点的 Machine 对象——包括 immutable-OS 集群(在这种情况下会销毁其背后的虚拟机)——可能被删除。如果一致性检查报告存在缺失或多余键,请不要卸载插件;应先解决不一致问题,或联系技术支持。

  1. 如有必要,在备用集群上重启 Elasticsearch:

    # Copy installer/res/packaged-scripts/for-upgrade/ensure-asm-template.sh to /root:
    # DO NOT skip this step
    
    # switch to the root user if necessary
    sudo -i
    
    # check whether the Log Storage for Elasticsearch is installed on global cluster
    _es_pods=$(kubectl get po -n cpaas-system | grep cpaas-elasticsearch | awk '{print $1}')
    if [[ -n "${_es_pods}" ]]; then
        # In case the script returned the 401 error, restart Elasticsearch
        # then execute the script to check the cluster again
        bash /root/ensure-asm-template.sh
    
        # Restart Elasticsearch
        xargs -r -t -- kubectl delete po -n cpaas-system <<< "${_es_pods}"
    fi
  2. 验证备用集群中的数据一致性(与 步骤 3 中的检查相同)。如果检查报告存在缺失或多余键,则说明备用集群与主集群不一致:不要继续下一步。请先解决不一致问题,或联系技术支持。同时,在 两个 集群上确认没有处于非运行状态的 Machine 节点,并在继续之前先解决这些问题:

    kubectl get machines.platform.tkestack.io
  3. 卸载 etcd 同步插件;

  4. 移除两个 VIP 上的 2379 端口转发;

  5. 将平台域名的 DNS 切换到备用 VIP,此时该 VIP 将成为 Primary Cluster;

  6. 验证 DNS 解析:

    kubectl exec -it -n cpaas-system deployments/sentry -- nslookup <platform access domain>
    # If not resolved correctly, restart coredns Pods and retry until success
  7. 清除浏览器缓存并访问平台页面,确认其反映的是先前的备用集群;

  8. 重启以下服务(如果已安装):

    • Log Storage for Elasticsearch:

      kubectl delete po -n cpaas-system -l service_name=cpaas-elasticsearch
    • Monitoring for VictoriaMetrics:

      kubectl delete po -n cpaas-system -l 'service_name in (alertmanager,vmselect,vminsert)'
    • cluster-transformer:

      kubectl delete po -n cpaas-system -l service_name=cluster-transformer
  9. 如果业务集群将监控数据发送到 Primary,请在业务集群中重启 warlock:

    kubectl delete po -n cpaas-system -l service_name=warlock
  10. 在原始 Primary Cluster 上,重复 启用 etcd 同步 的步骤,将其转换为新的备用集群。

例行检查

定期检查备用集群上的同步状态:

curl $(kubectl get svc -n cpaas-system etcd-sync-monitor -o jsonpath='{.spec.clusterIP}')/check

如果有任何键缺失或多余,请按照输出中的说明进行处理。

上架软件包

有关 violet push 子命令的详细信息,请参阅 上架软件包