You need to enable JavaScript to run this app.
导航

构建应用两地三中心容灾方案

最近更新时间2024.01.19 14:39:14

首次发布时间2023.11.06 21:28:01

分布式云原生平台可以帮助用户进行两地三中心的混合/多云 Kubernetes 集群,本文为您介绍如何使用分布式云原生平台构建应用两地三中心容灾方案的详细使用方法。

场景介绍

分布式云原生平台可以帮用户进行两地三中心的混合/多云 Kubernetes 集群统一管理、运维,以及多集群应用的跨集群部署、升级、差异化配置及故障迁移等。并且能够配合火山引擎云调度 GTM 实现应用在发生故障时在多个集群间的自动切流,最大限度的提升业务的可用性及连续性。

说明

关于数据层面的数据复制与同步方案,可联系火山引擎了解更多产品及解决方案。

方案架构

alt

网络规划

  1. 集群纳管:DCP 创建 1 个代理模式注册集群纳管集群 C;DCP 将已创建的 VKE 集群 A、B 一键注册纳管。
  2. 联邦集群:创建托管的联邦主控实例,并将集群 A、B、C 添加到主控实例中构建集群联邦。
集群类型地域VPCPod&Service CIDR
联邦主控实例集群联邦的主控实例北京VPC1
集群 A火山引擎 VKE 集群无特殊要求
集群 B火山引擎 VKE 集群
集群 C阿里云 ACK 集群杭州VPC2无特殊要求

背景信息

随着移动互联网的深入发展,用户增长达到一定规模后,不少企业都会面高并发业务和面临海量数据的挑战,传统的单机房在机器容量上存在瓶颈。在一些极端场景下,有可能所有服务器都出现故障,例如机房断电、机房火灾、地震等这些不可抗拒因素会导致系统所有服务器都故障从而导致业务整体瘫痪,而且即使有其他地区的备份,把备份业务系统全部恢复到能够正常提供业务,花费的时间也比较长。为了满足中心业务连续性,增强抗风险能力,多活作为一种可靠的高可用部署架构,成为各大互联网、金融行业公司的首要选择。

常见的多活方案有同城双活、两地三中心、三地五中心、异地多活等多种技术方案,不同多活方案技术要求、建设成本、运维成本都不一样,本场景以构建应用两地三中心容灾方案进行说明

两地三中心容灾是一种高可用性的架构设计,它通过在两个地理位置(如城市)上部署三个数据中心来实现容灾,即:生产中心、同城容灾中心、异地容灾中心。在一个城市部署 2 套环境做为生产中心和同城容灾中心,同时处理业务并通过高速链路实现数据同步,可切换运行。在另一城市部署 1 套环境做为异地容灾中心,用做数据备份。当生产中心和同城容灾中心同时故障时,异地容灾中心可切换处理业务。

前提条件

  1. 已经注册火山引擎账号,并开通分布式云原生平台服务。
  2. 拥有 TrafficRoute DNS 套件 产品权限。
  3. 已经在火山引擎创建 1 个 VKE 集群,已经在第三方云平台创建 1 个第三方容器集群(本场景以阿里云 ACK 为例)。

操作步骤

本场景从 0 到 1 为您详细介绍构建应用两地三中心容灾的操作步骤,可参考如下步骤依次执行。

步骤一:将容器集群注册/纳管到 DCP

将容器集群注册/纳管到分布式云原生平台统一管理,后续可直接添加到联邦主控实例作为成员集群,用于联邦制资源分发。本场景使用的参数配置如下:

集群名称云服务商注册地域注册方式
aliyun-hangzhou阿里云 ACK华北 2 (北京)代理连接
volc-beijing-1火山引擎 VKE华北 2 (北京)一键注册
volc-beijing-2火山引擎 VKE华北 2 (北京)一键注册
  1. 通过代理模式注册 ACK 集群:通过容器集群页面 创建集群 > 注册集群,使用 代理连接 方式的两步操作,将 ACK 集群注册到分布式云原生平台。

alt

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:注册现有集群(代理连接)

配置项说明
集群名称可自定义集群名称(本场景命名为:aliyun-hangzhou),命名规范:长度 2-64 个字符;支持英文字母、汉字、数字和中划线(-)。
云服务商分布式云原生适配的第三方平台集群(本场景选择阿里云 ACK),要求选择与待接入集群匹配的云服务商,否则可能导致部分功能不可用。
接入地域容器集群接入分布式云原生平台后所属的地域(本场景选择华北 2 (北京))。
私有网络待接入容器集群使用的私有网络。本场景 VKE 集群、ACK 集群和主控实例使用相同的 VPC。
API Server 公网访问默认关闭(本场景调整为:开启),若开启此配置,系统将自动创建 EIP 并关联主控实例 API Server 负载均衡,即可通过公网连接管理容器集群。
  1. 一键注册火山引擎 VKE 集群:VKE 和 DCP 同属火山引擎,通过容器集群页面顶部的 注册接入,即可将 VKE 集群一键注册到分布式云原生平台,详细操作步骤和配置项说明参见:注册 VKE 集群

alt

步骤二:搭建联邦集群基础环境

  1. 创建主控实例:进入联邦主控实例页面,创建主控实例,用于实现联邦集群管理、应用调度分发功能。

alt

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建主控实例

配置项说明
实例名称自定义主控实例名称(本场景命名为:fed-poc),同一地域内不可重名。命名规则:长度 2~64 个字符,支持英文字母、汉字、数字和中划线(-)。
地域物理数据中心所在的地理区域(本场景选择华北 2 (北京)),资源创建后不支持更换地域。不同地域之间内网完全隔离,保证不同地域间最大程度的稳定性和容错性。
私有网络私有网络为云上资源构建隔离的、自主配置的虚拟网络环境,默认情况下,同一地域内同一私有网络下所有资源网络互通。本场景 VKE 集群、ACK 集群和主控实例使用相同的 VPC。

公网访问

默认关闭(本场景调整为:开启),若开启此配置,主控实例将支持通过公网访问并管理成员集群。

说明

开启后,若所选私有网络中已经创建 NAT 网关,将默认使用该网关;若所选私有网络中尚无 NAT 网关,将新建一个 NAT 网关并自动配置 SNAT 规则。

API Server 公网访问默认关闭(本场景调整为:开启),若开启此配置,系统将自动创建 EIP并关联主控实例 API Server 负载均衡,即可通过公网连接管理主控实例。
  1. 添加成员集群:进入联邦主控实例的成员集群页面,将火山引擎 VKE 集群和纳管的外部 ACK 集群添加到联邦集群。

当关联状态切换为已关联时,表示集群添加成功,详细操作步骤和配置项说明参见:添加成员集群

alt

alt

  1. 创建部署策略:进入联邦主控实例的部署策略页面,创建一个名称为 app-policy 的部署策略,用于多集群资源的跨集群分发策略配置。

alt

本场景涉及的关键配置如下,其他参数按需配置即可。详细操作步骤和配置项说明参见:创建部署策略(控制台)

配置项说明
副本模式调度默认开启(本场景关闭此配置,使用复制分发模式)。针对部分资源(例如:Deployment)启用权重分发副本调度模式,支持动态集群权重、静态集群权重。
集群选择方式选择部署策略最终调度的成员集群。本场景使用 指定集群 方式选择已经注册的 3 个目标成员集群。
  1. 创建差异化策略:进入联邦主控实例的差异化策略页面,使用如下配置,通过 Yaml 创建两个差异化策略。详细操作步骤和配置项说明参见:创建差异化策略(Yaml)
策略类型资源名称说明

差异化策略
OverridePolicy

dp-override

用于 Deployment(fed-dp)资源在多云集群中镜像地址差异化配置。

差异化策略
OverridePolicy

service-override

用于 LB 类型 Service(fed-service)资源在多云集群中 LB 规格差异化配置。

  • 以下为适配火山引擎 VKE、阿里云 ACK Deployment 的镜像地址差异化策略:
apiVersion: core.kubeadmiral.io/v1alpha1
kind: OverridePolicy
metadata:
  name: dp-override
  namespace: default
spec:
  overrideRules:
    - targetClusters:
        #clusters:
          #- ClusterID-01 # 替换为您的成员集群 ID,与 clusterSelector 取交集
        clusterSelector:
          cluster.dcp.volcengine.com/cluster-provider: Vke # 表示匹配云服务商为火山引擎VKE集群
      overriders:
        jsonpatch:
          - path: "/spec/template/spec/containers/0/image"
            operator: replace
            value: "nginx"  # 替换为您的镜像仓库地址
    - targetClusters:
        #clusters:
          #- ClusterID-01 # 替换为您的成员集群 ID,与 clusterSelector 取交集
        clusterSelector:
          cluster.dcp.volcengine.com/cluster-provider: Ack # 表示匹配云服务商为阿里云ACK集群
      overriders:
        jsonpatch:
          - path: "/spec/template/spec/containers/0/image"
            operator: replace
            value: "nginx" # 替换为您的镜像仓库地址
  • 以下为适配火山引擎 VKE、阿里云 ACK LB 类型 Service 的差异化策略:
apiVersion: core.kubeadmiral.io/v1alpha1
kind: OverridePolicy
metadata:
  name: service-override
  namespace: default
spec:
  overrideRules:
  - overriders:
      jsonpatch:
      - operator: add
        path: /metadata/annotations/service.beta.kubernetes.io~1volcengine-loadbalancer-address-type
        value: PUBLIC
      - operator: add
        path: /metadata/annotations/service.beta.kubernetes.io~1volcengine-loadbalancer-spec
        value: small_1
    targetClusters:
        #clusters:
          #- ClusterID-01 # 替换为您的成员集群 ID,与 clusterSelector 取交集
        clusterSelector:
          cluster.dcp.volcengine.com/cluster-provider: Vke # 表示匹配云服务商为火山引擎VKE集群
  - overriders:
      jsonpatch:
      - operator: add
        path: /metadata/annotations/service.beta.kubernetes.io~1alibaba-cloud-loadbalancer-spec
        value: slb.s1.small
    targetClusters:
        #clusters:
          #- ClusterID-01 # 替换为您的成员集群 ID,与 clusterSelector 取交集
        clusterSelector:
          cluster.dcp.volcengine.com/cluster-provider: Ack # 表示匹配云服务商为阿里云ACK集群

步骤三:部署多集群应用

  1. 登录 分布式云原生控制台,在左侧导航栏选择 联邦主控实例,进入主控实例管理页面。
  2. 在主控实例列表,单击目标主控实例名称,进入主控实例配置页面。
  3. 在左侧导航栏选择 工作负载 > 无状态负载,进入无状态负载管理页面。
  4. 单击 使用 Yaml 创建资源,将准备好的 Yaml 内容粘贴到输入框,完成后单击 下一步:部署配置

资源清单及 Yaml 定义如下:

资源类型资源名称说明
Deploymentfed-dp无状态负载。
ConfigMapfed-cm被 fed-dp(Deployment)挂载的 ConfigMap。
Servicefed-service与 fed-dp(Deployment)关联的 LB 类型 Service。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fed-dp
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: fed-dp
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: fed-dp
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /v1
          name: v1
          readOnly: true
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: fed-cm
        name: v1
---
apiVersion: v1
data:
  k1: v1
kind: ConfigMap
metadata:
  name: fed-cm
  namespace: default
---
apiVersion: v1
kind: Service
metadata:
  name: fed-service
  namespace: default
spec:
  ports:
    - name: test
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: fed-dp
  sessionAffinity: None
  type: LoadBalancer
  1. 在部署配置步骤中选择创建的部署策略,并为 Deployment、Service 资源关联差异化策略,完成后单击 确定,即可开始创建无状态负载并实现多集群分发。

alt

资源创建成功后, 可在联邦主控实例详情中分别查看联邦 Deployment、Service 资源,已经成功分发到多个集群中,并且差异化策略已生效,LB Service 根据差异化 annotation 生成了对应的公网访问地址。

alt

alt

说明

此步骤需要记录 LB Service 公网访问入口,将在后续的全局流量策略配置中用到。

  • volc-beijing-1 集群:XXX.XXX.35.152
  • volc-beijing-2 集群:XXX.XXX.69.29
  • aliyun-hangzhou 集群:XXX.XXX.19.34

步骤四:配置全局流量策略

  1. 登录 TrafficRoute 套件,在左侧导航栏选择 云解析 DNS > 公网域名管理
  2. 单击 添加域名,根据提示配置参数,添加已经注册的公网域名。

alt

  1. 单击目标公网域名名称,进入域名详情中,在记录管理子页面单击 创建云调度 GTM 实例,为该域名创建云调度 GTM 实例。

alt

  1. 实例创建完成后,在左侧导航栏选择 云调度 GTM > 实例管理,单击目标实例右侧操作列的 配置,可进行实例配置。

说明

以下对本场景使用到的关键参数进行介绍,其他参数按需配置即可,详细介绍参见:配置 GTM 实例

  • 基本信息:策略类型选择地理位置策略,并开启健康检查。

alt

  • 添加地址池:将以上应用部署过程中,3 个集群中 LB Service 公网 IP 添加到以下地址池。beijing-pool 配置 volc-beijing-1、volc-beijing-2 集群中的服务地址;hangzhou-pool 配置 aliyun-hangzhou 集群中的服务地址。

alt

  • 健康检查:配置健康检查协议 TCP,端口为应用端口 80。

alt

  • 路由模式:开启负载均衡模式,用于在相同地址池中多个地址的流量权重设置。

alt

  1. 云调度 GTM 实例初始配置完成后,需要为该实例添加路由规则及健康检查,路由规则中添加两个地址池,第一个是 beijing-pool(默认生效),第二是个 hangzhou-pool(beijing-pool 不可用时生效)。

alt

alt

alt

  1. 路由规则配置完成后,开启实例调度即可展示当前生效/备用地址池及具体的 IP 地址。

alt

结果验证

应用全局访问验证

执行以下命令,根据域名 app.volcdemo.cn 多次解析的 IP 地址可见,正常情况下,所有流量都由北京 Region 的 2 个 VKE 集群上的应用承载,每个集群各处理 50% 流量。

for i in `seq 100`; do dig @ns1.volcdns.com app.volcdemo.cn +short; done | sort | uniq -c
  46 XXX.XXX.35.152
  54 XXX.XXX.69.29

应用故障切流验证

  • 同城故障切流:通过将 volc-beijing-1 集群中的节点全部下线,制造该集群应用故障场景。

下线 volc-beijing-1 集群中的节点,此时,联邦集群中查看分发到该集群中可用副本为 0,且在 GTM 实例策略管理模块可以看到 volc-beijing-1 集群中的 LB Service 地址已经不健康。

alt

alt

alt

执行以下命令,根据域名 app.volcdemo.cn 多次解析的 IP 地址可见,北京 Region 其中一个集群(volc-beijing-1)应用异常情况,所有流量都由北京 Region 的另外一个集群(volc-beijing-2)应用承载。

for i in `seq 100`; do dig @ns1.volcdns.com app.volcdemo.cn +short; done | sort | uniq -c
 100 XXX.XXX.69.29
  • 异地故障切流:通过将 volc-beijing-1、volc-beijing-2 集群中的节点全部下线,制造北京 Region 应用故障场景。

下线 volc-beijing-2 集群中的节点,此时,联邦集群中查看分发到该集群中可用副本为 0,且在 GTM 实例策略管理模块可以看到 volc-beijing-2 集群中的 LB Service 地址也已经不健康。

alt

alt

alt

执行以下命令,根据域名 app.volcdemo.cn 多次解析的 IP 地址可见,北京 Region 所有集群应用都异常情况下,所有流量都由杭州 Region 的集群(aliyun-hangzhou)应用承载。

for i in `seq 100`; do dig @ns1.volcdns.com app.volcdemo.cn +short; done | sort | uniq -c
 100 XXX.XXX.19.34