作者:蔡靖
对于当前业务运行在 IDC 内的 Kubernetes 集群中,希望通过云计算为云下业务提供同城灾备的高可用冗余能力,可利用阿里云分布式云容器平台 ACK One [ 1] 来提供统一得流量、应用和集群管理,实现业务流量的多集群路由和灾难情况下的流量的自动平滑容灾。本文主要介绍通过 ACK One 快速构建混合云同城容灾系统。
搭建混合云容灾系统一般需要五个步骤:
- 使用ACK One 注册集群管理 IDC / 第三方公共云 K8s 集群
- 实现云下网络与云上 VPC 的互联互通
- 创建ACK One 舰队并关联集群
- 使用ACK One GitOps发布应用到多个集群(可选)
- 使用ACK One 多集群网关管理多集群流量
分布式云容器平台 ACK One
分布式云容器平台 ACK One(Distributed Cloud Container Platform for Kubernetes)是阿里云面向混合云、多集群、分布式计算、容灾等场景推出的企业级云原生平台。ACK One 可以连接并管理您任何地域、任何基础设施上的 Kubernetes 集群,并提供一致的管理和社区兼容的 API,支持对计算、网络、存储、安全、监控、日志、作业、应用、流量等进行统一运维管控。
ACK One 注册集群 [ 2] 可以帮助您将云下 Kubernetes 集群接入云端,快速搭建混合云集群,可以将本服务器托管网地数据中心 Kubernetes 集群或其他云厂商 Kubernetes 集群接入阿里云容器服务管理平台,进行统一管理。在混合云场景下,承担了至关重要的作用。
ACK One 舰队 [ 3] (Fleet)是 ACK One 管理多集群提供的统一入口,为开发者提供多集群 GitOps 应用分发、流量管理、统一运维等能力。其基于成熟的开源社区项目Argo CD [ 4] 和Open Cluster Management [ 5] 构建,保证了产品的开放性。每个舰队实例则由 ACK 托管,您可以省去大量的运维工作,专注应用开发。
ACK One 多集群网关 [ 6] (ACK One Multi-cluster Gateways)是 ACK One 为多云、多集群环境提供的云原生网关,统一管理一个地域的多个集群的七层南北流量。ACK One 通过托管MSE Ingress [ 7] ,以 Ingress API 来定义流量路由规则,支持跨多集群的多种能力:HTTP Routing(包括基于 Header 将流量路由到指定集群)、traffic splitting、 health-based 自动平滑容灾、traffic mirroring、基于副本数负载均衡流量等。
ACK One GitOps [ 8] 是 ACK One 在 Fleet 实例中托管了 ArgoCD,同时集成 ACK One 的多集群、阿里云的 RAM SSO 等能力,实现多集群服务器托管网下简单、安全的多集群 GitOps 持续交付。
混合云同城容灾系统架构
基于 ACK One 的注册集群、多集群舰队(GitOps 可选)、多集群网关构建的混合云场景的应用的同城多活容灾系统如上图所示:
- 阿里云上资源都在 1 个 VPC 中(如图中 VPC 1),在 AZ1 创建 ACK 集群,在 AZ2 中创建注册集群;
- 将 IDC 或第三方公共云 K8s 集群,通过注册集群注册到阿里云;并使用专线打通 IDC 与云上 VPC 的网络,实现云上云下网络互通互联;
- 关联 ACK 集群和注册集群到同 VPC(VPC 1)下的 ACK One Fleet 实例,并通过 ACK One GitOps 向 ACK 集群和注册集群发布应用;
- 在 ACK One Fleet 中,通过 MseIngressConfig 创建 MSE 网关,并添加集群到网关,然后通过在 Fleet 中创建 Ingress 设置流量路由规则,来管理南北向流量(包括实现同城容灾)。
- 本文章针对应用的多集群部署和业务流量的高可用方案,不涉及数据库和中间件,相关方案请参考阿里云数据库与中间件文档,例如:数据库同步同步方案:https://help.aliyun.com/zh/rds/apsaradb-rds-for-mysql/overview-of-data-synchronization
构建混合云同城容灾系统
首先需要对混合云网络进行规划:ACK One Fleet、ACK 集群、注册集群在相同 VPC 下,ACK 集群和注册集群在不同 AZ。舰队管理网络规划请参见舰队管理网络规划 [ 9] 。
之后依据以下几步可以构建混合云同城容灾系统:
- 使用注册集群管理 IDC / 第三方公共云 K8s 集群
- 实现云下网络与云上 VPC 的互联互通
- 创建舰队并关联集群
- 使用 GitOps 发布应用到多个集群(可选)
- 使用多集群网关管理多集群流量
1. 使用注册集群管理 IDC / 第三方公共云 K8s 集群
本步骤需要将您的 IDC / 第三方公共云 K8s集群注册到阿里云上。您需要在 ACK/ACK One 创建一个注册集群,并通过集群连接信息中提供的集群导入代理配置 yaml,将您云下 K8s集群接入注册集群,请详见通过注册集群统一管理任意环境下的 Kubernetes 集群 [ 10] 。
如果您的云下集群还需要将工作负载弹性到云上,可以参见构建混合弹性容器集群(弹性 ECS) [1****1] 和构建混合弹性集群(ECI) [ 12] 。如需应对大量突发情况,可对 ECI 进行高可用配置,请参见创建多可用区的 ECI Pod [ 13] 。
IDC / 第三方公共云 K8s集群成功接入后,注册集群的状态会变成 “运行中” 。
2. 实现云下网络与云上 VPC 的互联互通
构建混合云同城容灾系统,需要通过多集群网关对云上云下的应用 Pod 进行统一流量管理,所以需要连通 IDC 网络与多集群网关所在 VPC(默认同 ACK One Fleet 相同 VPC)。将 IDC 网络与云上 VPC 网络连接的方案可参见VPC 与本地 IDC 链接 [ 14] 。建议采用专线,连通云上云下网络,请详见混合网络概述 [ 15] ,主要流程步骤简介如下:
a. 将云下网络通过物理专线接入阿里云。阿里云提供的专线接入方案,请参见物理专线连接 [ 16] 。
b. 创建专线连接本地数据中心边缘网络设备与云上网关设备边界路由器。
c. 将云上边界路由器与云上专有网络 VPC 加入同一个云企业网。
d. 配置云上边界路由器和本地数据中心BGP网络。
e. 云上云下连通性测试。
f. 配置云下网络到云上云产品内网IP地址段的路由。
3. 创建舰队并关联集群
在ACK One 控制台 [ 17] 创建舰队,并关联已成功导入的注册集群和您新建的 ACK 集群。如下所示:
4. 使用 GitOps 发布应用到多个集群(可选)
本步骤主要是在您的 ACK 集群和云下集群部署您的应用,您可以选择使用 GitOps 来管理您的多集群应用,详细操作可参考使用 GitOps 部署 web-demo 应用到多个集群 [ 18] 。
发布成功后,可在 GitOps 控制台查看您的应用和资源的状态,确保两个集群中应用在相同 namespace(多集群网关要求 service 相同 name、相同 namespace)。以下是 web-demo 在 ACK 集群中的状态:
5. 使用多集群网关管理多集群流量
最后依据以下几步,使用多集群网关来管理多集群流量,实现应用同城容灾,请详见基于多集群网关实现同城容灾方案 [ 19] 。
- 在 ACK One Fleet 中开启多集群网关能力;
- 在 Fleet 中通过创建 MseIngressConfig 来创建网关,并添加 ACK 集群和注册集群到网关;
- 在 Fleet 中创建路由规则(Ingress)实现同城容灾。同城容灾对应的 Ingress 如下所示(namespace 与所发布的应用的 namespace 一致):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-demo
namespace: web-demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /svc1
pathType: Exact
backend:
service:
name: service1
port:
number: 80
总结
ACK One 提供了完整的多集群管理能力,从集群接入,到应用分发,再到流量管理,支持一站式的应用的管理。对于混合云场景,注册集群还支持以 Serverless 方式(如 ECI)按需调度云上算力,从而快速应对服务的大规模突发,并无需您运维节点,聚焦应用本身;GitOps 可方便管理云上云下集群应用,并可构建自动化的 CI/CD 流水线,便利应用升级运维;多集群网关则提供强大的流量管理能力,对南北向多集群流量进行统一管理,减少单独管理多个集群的成本,降低架构复杂性,提升流量管理效率。
欢迎加入 ACK One 客户交流钉钉群与我们进行交流。(钉钉群号:35688562)
相关链接:
[1]分布式云容器平台 ACK One
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/product-overview/ack-one-overview?spm=a2c4g.11186623.0.0.534659e41FBHfX
[2]ACK One 注册集群
https://help.aliyun.com/zh/ack/overview-9?spm=a2c4g.11186623.0.0.2e9c6fdcz1OREh
[3]ACK One 舰队
https://help.aliyun.com/zh/ack/fleet-management-overview?spm=a2c4g.11186623.0.0.42b359e4CgVm5w
[4]Argo CD
https://argoproj.github.io/cd/
[5]Open Cluster Management
https://open-cluster-management.io/
[6]ACK One 多集群网关
https://help.aliyun.com/zh/ack/multi-cluster-gateway-overview
[7]MSE Ingress
https://help.aliyun.com/zh/mse/user-guide/overview-of-mse-ingress-gateways#task-2193958
[8]ACK One GitOps
https://help.aliyun.com/zh/ack/gitops-overview?spm=a2c4g.11186623.0.0.1f6759e4A2m8gU
[9]舰队管理网络规划
https://help.aliyun.com/zh/ack/fleet-management-network-planning?spm=a2c4g.11186623.0.0.1b1e5f8bDveDi5
[10]通过注册集群统一管理任意环境下的 Kubernetes 集群
https://help.aliyun.com/zh/ack/use-registered-clusters-to-centrally-manage-external-kubernetes-clusters?spm=a2c4g.11186623.0.0.6710398eTddS7f
[11]构建混合弹性容器集群(弹性 ECS)
https://help.aliyun.com/zh/ack/build-a-hybrid-cloud-cluster-and-add-ecs-instances-to-the-cluster#task-2249354
[12]构建混合弹性集群(ECI)
https://help.aliyun.com/zh/ack/scale-out-elastic-container-instances#task-2489901
[13]创建多可用区的 ECI Pod
https://help.aliyun.com/zh/ack/serverless-kubernetes/user-guide/create-ecis-across-zones
[14]VPC 与本地 IDC 链接
https://help.aliyun.com/zh/vpc/user-guide/network-connection-overview?spm=a2c4g.11186623.0.0.3a557755mYSyRf#section-fdz-nsk-w2b
[15]混合网络概述
https://help.aliyun.com/zh/ack/overview-of-hybrid-networks?spm=a2c4g.11186623.0.0.64fb2fdaU19Ju1
[16]物理专线连接
https://help.aliyun.com/zh/express-connect/user-guide/physical-connection/
[17]ACK One 控制台
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2Fone%3Fspm%3Da2c4g.11186623.0.0.234c3163R6h8Fu
[18]使用 GitOps 部署 web-demo 应用到多个集群
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/use-cases/zone-disaster-recovery-based-on-multi-cluster-gateway?spm=a2c4g.11186623.0.0.2dc35f8b7vZoiw#34a9f1707ex8d
[19]基于多集群网关实现同城容灾方案
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/use-cases/zone-disaster-recovery-based-on-multi-cluster-gateway?spm=a2c4g.11186623.0.0.2c573e36yWmacA
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
背景 c++层数据都是二进制,需要转换成arrayBuffer透传到ets层给业务使用,但是鸿蒙的使用下面两个api创建出来的二进制数组数据都是错误的。 接口 napi_create_arraybuffer: 这个接口只能创建空的二进制数组,没办法把char的…