Global 集群灾难恢复

概述

此解决方案适用于涉及 global 集群的灾难恢复场景。global 集群作为平台的控制平面,负责管理其他集群。为了在 global 集群发生故障时确保平台服务持续可用,此解决方案会部署两个 global 集群:主集群和备用集群。

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

NOTE

从 ACP 4.5 开始, etcd Synchronizer 更名为 Global Cluster Disaster Recovery。从 Customer Portal 下载插件时,请搜索 Global Cluster Disaster Recovery。更名前发布的插件包上传后,在平台中仍显示为 etcd Synchronizer。

支持的灾难场景

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

不支持的灾难场景

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

主集群和备用集群的角色是相对的:当前为平台提供服务的集群是主集群(DNS 指向该集群),而备用集群则是备用集群。故障切换后,这两个角色将互换。

注意事项

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

  • 为便于故障排查和管理,建议按照类似 standby-global-m1 的格式命名节点,以标明节点所属的集群(主集群或备用集群)。

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

  • 两个集群之间必须保持稳定的网络连接,以确保 etcd 可靠同步;

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

  • 以下命名空间不会进行 etcd 同步。如果在这些命名空间中创建了资源,用户必须手动备份:

    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
  • 如果两个集群都设置为使用内置镜像仓库,则必须分别向每个集群上传容器镜像;

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

流程概览

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

所需资源

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

  • 每个集群各需要一个专用虚拟 IP 地址——一个用于 主集群,另一个用于备用集群;

    • 预先配置负载均衡器,将端口 80、443、6443、2379 和 11443 上的 TCP 流量路由到相应 VIP 后的控制平面节点。

操作步骤

步骤 1:安装主集群

NOTES OF DR (Disaster Recovery Environment) INSTALLING

安装 DR Environment 的主集群时,

  • 首先,记录按照安装 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 时,Username 和 Password 字段都不能为空;IP/Domain 字段必须设置为用作 Platform Access Address 的域名。
  • Platform Access Address 的 HTTP Port 和 HTTPS Port 字段都必须为 80 和 443。
  • 进入安装指南的第二页(步骤:Advanced)时,Other Platform Access Addresses 字段必须包含当前集群的虚拟 IP。

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

步骤 2:安装备用集群

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

  2. 登录 主集群 的第一个控制平面节点,并将 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. 按照与主集群相同的方式安装备用集群

NOTES FOR INSTALLING STANDBY CLUSTER

安装 DR Environment 的备用集群时, 以下选项必须设置为与 主集群 相同:

  • Platform Access Address 字段。
  • Certificate 的所有字段。
  • Image Repository 的所有字段。
  • 重要提示:确保镜像仓库的凭据以及 管理员用户的凭据与 主集群 中设置的凭据一致。

并务必确保已按照步骤 1 中的 NOTES OF DR (Disaster Recovery Environment) INSTALLING 执行。

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

步骤 3:启用 etcd 同步

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

    INFO

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

  2. 使用其 VIP 访问 备用 global 集群 Web Console,并切换到 Administrator 视图;

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

  4. 找到 Global Cluster Disaster Recovery(对于重命名之前发布的软件包,显示为 etcd Synchronizer),点击 Install,配置参数:

    • 如果未通过负载均衡器转发端口 2379,则必须正确配置 Active Global Cluster ETCD Endpoints;
    • 使用 Data Check Interval 的默认值;
    • 除非进行故障排查,否则保持禁用 Print detail logs 开关。

验证同步 Pod 是否在备用集群上运行:

kubectl get po -n cpaas-system -l app=etcd-sync
kubectl logs -n cpaas-system $(kubectl get po -n cpaas-system -l app=etcd-sync --no-headers | head -1) | grep -i "Start Sync update"

出现“Start Sync update”后,重新创建其中一个 Pod,以重新触发具有 ownerReference 依赖关系的资源同步:

kubectl delete po -n cpaas-system $(kubectl get po -n cpaas-system -l app=etcd-sync --no-headers | head -1)

检查同步状态:

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
  export mirror_new_svc="[$mirror_svc]"
else
  export mirror_new_svc=$mirror_svc
fi
curl $mirror_new_svc/check

输出说明:

  • LOCAL ETCD missed keys:主集群中存在但备用集群中缺失的键。通常由同步期间资源顺序导致的 GC 引起。重启一个 etcd-sync Pod 即可修复;
  • LOCAL ETCD surplus keys:仅存在于备用集群中的额外键。从备用集群删除这些键之前,请与运维团队确认。

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

  • Log Storage for Elasticsearch:

    kubectl delete po -n cpaas-system -l service_name=cpaas-elasticsearch
  • Advanced Monitoring(之前称为 Monitoring for VictoriaMetrics):

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

灾难恢复流程

卸载 etcd 同步插件前验证主集群/备用集群的一致性

此操作步骤将卸载 etcd 同步插件。卸载前,请确认备用集群中的数据与主集群一致。如果备用集群缺少主集群中存在的数据时卸载插件,可能导致所有者引用解析不正确,并可能删除业务集群节点 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 现在成为主集群;

  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
    • Advanced Monitoring(之前称为 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. 如果业务集群将监控数据发送到主集群,请在业务集群中重启 warlock:

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

日常检查

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

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

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

上架软件包

WARNING

使用 violet 将软件包上架到备用集群时,必须指定参数 --dest-repo <VIP addr of standby cluster>。
否则,软件包将被上架到主集群的镜像仓库,导致备用集群无法安装或升级扩展。

另请注意,必须提供备用集群镜像仓库的身份验证信息或 --no-auth 参数。

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