為了對當前在IDC或第三方公用雲的Kubernetes叢集中的業務提供同城災備的高可用冗餘能力,可以利用ACK One實現統一的流量、應用和叢集管理,從而實現業務流量的多叢集路由,並在災難情況下自動平滑容災。本文介紹如何通過ACK One快速構建混合雲同城多活容災系統。
混合雲同城容災系統架構
基於ACK One的註冊叢集、多叢集艦隊(GitOps可選)、ALB多叢集網關構建的混合雲情境的同城多活容災系統架構如下圖所示:
阿里雲的雲上資源都在同一個VPC中,在AZ 1建立ACK叢集,在AZ 2中建立註冊叢集。
將IDC或第三方雲廠商的Kubernetes叢集通過註冊叢集串連到阿里雲,並使用專線打通其與雲上VPC的網路,實現雲上雲下網路互連。
將ACK叢集和註冊叢集關聯到同一VPC下的ACK One Fleet執行個體,並通過ACK One GitOps向ACK叢集和註冊叢集發布應用。
在ACK One Fleet執行個體中,通過AlbConfig建立ALB多叢集網關,並將叢集添加到網關,然後通過在Fleet中建立Ingress設定流量路由規則,來管理南北向流量以及實現同城容災。
建立混合雲同城容災系統流程
步驟一:規劃網路並建立叢集
步驟二:連通雲上雲下網路
將IDC或第三方雲廠商的Kubernetes叢集接入註冊叢集。具體操作,請參見建立註冊叢集。
說明如果您的註冊叢集需要將工作負載彈性地遷移到雲上,請參見構建混合彈性容器叢集(彈性ECS)和通過虛擬節點將Pod調度到ECI上運行。
如需應對大量突發情況,可對ECI進行高可用配置,請參見建立多可用性區域的ECI Pod。
將雲下IDC網路與雲上VPC網路進行串連。具體操作,請參見網路連接。
採用專線連通雲上雲下網路。具體操作,請參見混合網路概述。
關聯註冊叢集和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容器網路
在ArgoCD UI的
中給2個叢集分別加上labelcluster: ack
和cluster: idc
。使用以下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)實現同城多活容災。
具體操作,請參見構建同城容災系統。