构建混合云容灾系统

为了为当前在IDC或第三方公共云的Kubernetes集群中的业务提供同城灾备的高可用冗余能力,可以利用ACK One实现统一的流量、应用和集群管理,从而实现业务流量的多集群路由,并在灾难情况下自动平滑容灾。本文介绍如何通过ACK One快速构建混合云同城多活容灾系统。

混合云同城容灾系统架构

基于ACK One的注册集群、多集群舰队(GitOps可选)、ALB多集群网关构建的混合云场景的同城多活容灾系统架构如下图所示:

image
  1. 阿里云的云上资源都在同一个VPC中,在AZ 1创建ACK集群,在AZ 2中创建注册集群

  2. 将IDC或第三方云厂商的Kubernetes集群通过注册集群连接到阿里云,并使用专线打通其与云上VPC的网络,实现云上云下网络互通。

  3. 将ACK集群和注册集群关联到同一VPC下的ACK One Fleet实例,并通过ACK One GitOps向ACK集群和注册集群发布应用。

  4. ACK One Fleet实例中,通过AlbConfig创建ALB多集群网关,并将集群添加到网关,然后通过在Fleet中创建Ingress设置流量路由规则,来管理南北向流量以及实现同城容灾。

创建混合云同城容灾系统流程

步骤一:规划网络并创建集群

  1. 在相同VPC下创建ACK One舰队ACK集群注册集群。并确保ACK集群和注册集群在不同的可用区。

  2. 确保ACK集群和IDC或第三方公共云的Kubernetes集群的Node和Pod CIDR不相互重叠。关于舰队管理网络规划,请参见舰队管理网络规划

步骤二:连通云上云下网络

  1. 将IDC或第三方云厂商的Kubernetes集群接入注册集群。具体操作,请参见创建注册集群

    说明
  2. 将云下IDC网络与云上VPC网络进行连接。具体操作,请参见网络连接

  3. 采用专线连通云上云下网络。具体操作,请参见混合网络概述

  4. 关联注册集群和ACK集群到ACK One舰队具体操作,请参见管理关联集群

步骤三:使用GitOps或应用分发部署应用到多个集群

在混合云场景中,需要考虑IDC或第三方公共云的Kubernetes集群是使用Underlay还是Overlay容器网络。这两种容器网络的主要区别在于,访问Overlay网络中的Pod不仅需打通云上VPC与IDC节点之间的网络,还需要确保每个节点能够路由到本地Pod CIDR。ACK One ALB多集群网关支持这两种容器网络,区别在于Underlay网络可以使用ClusterIP type Service,Overlay网络则必须使用NodePort type Service。

本步骤以GitOps的多集群应用分发(ApplicationSet)web-demo为例,介绍两种类型的容器网络示例YAML。应用分发详细信息,请参见创建多集群应用

Underlay容器网络

使用以下ApplicationSet YAML部署web-demo应用,所有子集群中都使用ClusterIP服务。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: appset-web-demo-undelay
  namespace: argocd
spec:
  template:
    metadata:
      name: '{{.metadata.annotations.cluster_id}}-web-demo'
      namespace: argocd
    spec:
      destination:
        name: '{{.name}}'
        namespace: gateway-demo
      project: default
      source:
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        path: manifests/helm/web-demo
        targetRevision: main
        helm:
          valueFiles:
            - values.yaml
          parameters:
            - name: envCluster
              value: '{{.metadata.annotations.cluster_name}}'
      syncPolicy:
        automated: {}
        syncOptions:
          - CreateNamespace=true
  generators:
    - clusters:
        selector:
          matchExpressions:
            - values:
                - cluster
              key: argocd.argoproj.io/secret-type
              operator: In
            - values:
                - in-cluster
              key: name
              operator: NotIn
  goTemplateOptions:
    - missingkey=error
  syncPolicy:
    preserveResourcesOnDeletion: false
  goTemplate: true

Overlay容器网络

  1. 在ArgoCD UI的Settings > Clusters中给2个集群分别加上label cluster: ackcluster: idc

  2. 使用以下ApplicationSet YAML在2个集群中部署web-demo应用。在IDC中采用NodePort服务,在ACK中使用ClusterIP服务。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: appset-web-demo-overlay
  namespace: argocd
spec:
  template:
    metadata:
      name: '{{.metadata.annotations.cluster_id}}-web-demo-overlay'
      namespace: argocd
    spec:
      destination:
        name: '{{.name}}'
        namespace: gateway-demo
      project: default
      source:
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        path: manifests/helm/web-demo
        targetRevision: main
        helm:
          valueFiles:
            - values.yaml
          parameters:
            - name: isNodePort
              value: "{{.values.isNodePort}}"
            - name: envCluster
              value: '{{.metadata.annotations.cluster_name}}'
      syncPolicy:
        automated: {}
        syncOptions:
          - CreateNamespace=true
  generators:
    - clusters:
        selector:
          matchLabels:
            cluster: 'idc'
        # A key-value map for arbitrary parameters
        values:
          isNodePort: "true"
    - clusters:
        selector:
          matchLabels:
            cluster: 'ack'
        values:
          isNodePort: "false"
  goTemplateOptions:
    - missingkey=error
  syncPolicy:
    preserveResourcesOnDeletion: false
  goTemplate: true

步骤四:基于ALB多集群网关实现同城容灾

  • 在ACK One舰队中通过创建AlbConfig来创建ALB多集群网关,并将ACK集群和注册集群添加到网关。

  • 在ACK One舰队中创建路由/转发规则(Ingress)实现同城多活容灾。

具体操作,请参见构建同城容灾系统