全部產品
Search
文件中心

Server Load Balancer:基於ACK One ALB多叢集網關實現混合雲容災

更新時間:Dec 07, 2024

為了對當前在IDC或第三方公用雲的Kubernetes叢集中的業務提供同城災備的高可用冗餘能力,可以利用ACK One實現統一的流量、應用和叢集管理,從而實現業務流量的多叢集路由,並在災難情況下自動平滑容災。本文介紹如何通過ACK One快速構建混合雲同城多活容災系統。

混合雲同城容災系統架構

基於ACK One的註冊叢集、多叢集艦隊(GitOps可選)、ALB多叢集網關構建的混合雲情境的同城多活容災系統架構如下圖所示:

  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)實現同城多活容災。

具體操作,請參見構建同城容災系統