为了为当前在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)实现同城多活容灾。
具体操作,请参见构建同城容灾系统。