基于 K8s 容器集群的容灾架构与方案

作者:庄宇

在设计系统架构时,我们必须假设任何组件和任何基础设施可能会在任何时间失效,例如:自然灾害,电力中断,网络中断,错误的系统变更等。为了应对挑战,我们必须设计合适的容灾架构。

本文介绍如何以 K8s 集群(包括:ACK 集群,他云集群和本地 IDC K8s 集群)为基础,结合阿里云云产品(网络,数据库,中间件,可观测),设计容灾架构,构建一个"韧性"系统。

容灾目标

Recovery time objective(RTO):

服务中断与服务恢复之间可接受的最大延迟时间。决定服务停机的可接受时长。

Recovery point objective(RPO):

自上一个数据恢复点以来可接受的最大时间量。决定可接受的数据丢失或重建。

对于 RTO 和 RPO,数值越低代表停机时间和数据丢失越少,但是越低的 RTO 和 RPO 会导致资源成本和运维复杂性越高。因此,您需要根据工作负载的重要性,指定适当的 RTO 和 RPO。

容灾策略

上图中,描述的常见的 3 种容灾策略:备份与恢复、主备、双活,不同的容灾策略对应了不同的收益和成本。您需要综合分析业务的重要性、风险、可投入的成本等,以选择适合的容灾策略。

备份与恢复(Backup-Restore)

在系统运行时,备份应用和数据,在灾难发生时,在另一个地点恢复应用和数据,并切换业务流量。由于数据无法实时备份,在恢复数据时会有一定的数据丢失,同时如果数据量较大,恢复数据时间可能较长。

主备(Active-Standby)

在主备模式中,主 Location 处理所有的业务流量,备用 location 可以启动较少的应用实例节省成本,并周期发送测试流量以验证系统有效性。在灾难发生时,做数据库主备切换,扩容应用实例数,并切换业务流量。

双活(Active-Active)

在双活模式中,2 个 Location 启动相同的应用实例数,同时处理业务流量。在灾难发生时,做数据库主备切换,并切换业务流量。

容灾范围

多可用区(Multi-AZ)

阿里云地域(Region) [ 11] 包含多个可用区(AZ),可用区(AZ)是电力和网络互相独立的物理区域,对停电,断网等局部中断的容灾场景,可以使用多个可用区(AZ)设计容灾策略。由于可用区间的网络延时较短,可以更容易实现数据部分的容灾方案,包括数据库、缓存和消息等。

多地域(Multi-Region)

为了应对更大范围的灾难故障事件,这些事件可能会影响同地域(Region)的多个可用区(AZ),您可以使用多个地域(Region)设计容灾策略。但由于地域间更大网络延时,容灾方案复杂度和实现成本较高。

在选择多可用区(AZ)或者多地域(Region)容灾方案时,需要重点考虑有状态应用和依赖的云产品(例如:数据库、缓存和消息)是否支持多地域或者多可用区容灾。

方案示例

备份与恢复(Backup & Restore)

公共云跨可用区和跨地域备份与恢复

  1. 通过 ACK One 备份中心 [3 ] ,可以备份 ACK 集群中的应用,包括无状态应用和有状态应用,对有状态应用,在备份应用 YAML 的同时可以备份相关 Storage 数据。

  2. ACK One 备份中心集成云产品云盘快照 [ 12] ,文件存储 NAS [13 ] ,对象存储 OSS [14 ] 和云备份 [15 ] ,分别支持应用 YAML,云盘 PV,文件系统 PV 的一键备份。

  3. 备份后,可以随时将应用和 Storage 数据,恢复到任意地域和可用区的 ACK 集群。

  4. 阿里云数据库服务的备份与恢复,可以参考相应数据产品的文档,例如:RDS MySQL 数据库备份恢复 [ 16] ,RDS 实例间数据迁移 [17 ]

混合云备份与恢复

  1. 通过 ACK One 注册集群 [ 4] ,可以将 IDC 自建或者非阿里云 K8s 集群,接入到阿里云 ACK 控制台。

  2. 接入 ACK One 注册集群后,通过 ACK One 备份中心,可以备份 IDC 自建和非阿里云 K8s 集群中的应用,包括无状态应用和有状态应用,对有状态应用,在备份应用 YAML 的同时可以备份相关 Storage 数据。

  3. 备份后,可以随时将应用(Deployment/Statefulset)和数据(PV/PVC),恢复到任意地域和可用区的 ACK 集群。

总结

备份恢复方案实施成本较低,但 RTO 和 RPO 相对较长,取决于数据量的大小和应用的复杂度。备份中心能够提供的全量备份+增量备份能力,减少 RTO 和 RPO 时间。

备份恢复作为容灾的兜底方案,重要性高,在系统运维的过程中,要保证备份的及时性和可恢复性。

另外,许多用户选择通过备份恢复功能实现应用的跨集群迁移,场景如下:

  1. 业务上云,将本地 IDC 集群中的应用,迁移到阿里云 ACK 集群中,参考 IDC 应用上云迁移 [ 18]

  2. 集群版本较老,版本升级有稳定性风险,可以先创建新版本集群,通过备份恢复将应用迁移到新版本集群运行,参考跨版本集群迁移 [ 19]

  3. 用户在收敛云账号或者组织调整时,需要跨账号集群接入 [ 20] 和跨集群迁移应用 [21 ]

多集群 Service

在应用迁移的过程中,由于应用的数量较多,需要分批迁移,同时应用间存在调用关系。此时,在网络打通的前提下,可以使用 ACK One 舰队多集群 Service [ 5] ,实现应用 Kubernetes Service 跨集群访问。如下图所示,ACK One 舰队多集群 Service,可以将 Cluster1 的 Applcation2 的 Kubernetes Service(包含 endpoints)注入到 Cluster2,Cluster2 上的 Application1 可以访问 Cluster1 上的 Application2。

在专线拉通的前提下,通过 ACK One 注册集群,IDC 和非阿里云的 K8s 集群也可以是用 ACK One 舰队多集群 Service。

单地域多可用区容灾

基于 DNS 流量分发

  1. 通过 ACK One GitOps 应用分发 [6 ] ,在 2 个 ACK 集群中部署应用,实现基于 Git 仓库的持续一致性部署。

  2. 通过全局流量管理(GTM) [22 ] 做 DNS 解析实现负载分发,并监控系统运行健康状态,自动触发容灾切换。

  3. 每个 AZ 内,通过 ACK Ingress [ 7] 实现 7 层流量管理。

  4. 备集群和主集群的应用版本相同,但备集群节点较少,应用副本较少,节省成本。

  5. 在主系统不可用时,全局流量管理(GTM)会将服务域名 DNS 解析到备用系统,完成主备切换。

  6. 由于流量的增长,备集群中 ACK HPA [8 ] 会扩容应用副本,进而触发 ACK Cluster Autocaler [9 ] 扩容集群节点。

  7. 阿里云中间件(消息,缓存)的跨可用区容灾,可参考相关文档,例如:云消息队列 RocketMQ 版实例规格 [ 23] ,云消息队列 Kafka 版实例规格 [ 24] ,云原生内存数据库 Tair 容灾方案 [ 25]

  8. 阿里云数据库服务的跨可用区容灾,可参考相关文档,例如:RDS MySQL 数据库搭建高可用架构 [ 26]

🔔 注意:

  1. 本方案基于 DNS 流量转发,由于 DNS 缓存,在灾难事件发生时,部分业务依然路由到主系统,造成一定的业务损失。

  2. 需要在 2 个集群中分别配置维护 7 层 ingress 规则,成本高。系统正常运行状态:

灾难事件发生,AZ 不可用时,系统主备切换,GTM 将流量切换到 AZ2,ACK Cluste2 的应用实例自动扩展,中间件和数据库多可用区高可用切换。

基于 ACK One 多集群网关

  1. 通过 ACK One GitOps 应用分发,在 2 个 ACK 集群中部署应用,实现基于 Git 仓库的持续一致性部署。

  2. 通过 ACK One 多集群网关 [ 10] ,定义标准 K8s Ingress 规则(YAML 格式),实现 7 层流量治理,实现流量的主备模式分发。多集群网关为跨可用区高可用。

  3. 备集群和主集群的应用版本相同,但备集群节点较少,应用副本较少,节省成本。可以发送特定 http header 的测试流量,多集群网关转发到备集群以验证工作状态。

  4. 在主系统不可用时,ACK One 多集群网关会自动将业务流量备用系统,完成主备切换。

  5. 由于流量的增长,备集群中 ACK HPA 会扩容应用副本,进而触发 ACK Cluster Autocaler 扩容集群节点。

  6. 阿里云数据库服务的跨可用区容灾,可参考相关文档,例如:RDS MySQL 数据库搭建高可用架构。

🔔 注意:

  1. 本方案为 HTTP 七层流量转发,配合 7 层健康检查,主备切换时相比 DNS 方案,大幅减低业务流量损失。

  2. 网关侧统一支持基于 Ingress 规则的流量治理,相比 DNS 方案,合并了四层负载均衡 SLB 和七层 Ingress 网关,降低系统复杂度和维护成本。

系统正常运行状态:

灾难事件发生,AZ 不可用时,系统主备切换,多集群网关(MSE 云原生网关)自动将流量切换到 AZ2 的 ACK Cluste2 中, 应用实例自动扩展。

跨可用区双活

以上 2 个方案以主备模式为例,描述了系统架构。同样的架构,基于 DNS 流量分发和 ACK One 多集群网关也支持双活场景,可以配置流量分发比例(例如:50% : 50%),支持自动 failover 切换。在双活的场景下,每个集群中的应用副本数,需要根据流量分发比例确定,集群中需要配置弹性伸缩,以支持流量切换情况下的流量增长。

总结

单地域多可用区方案实现的成本较低,可以利用云产品(包括:网关,容器,中间件,数据库)多可用区部署和多可用区高可用,快速实现容灾,对业务改造较小。但此方案仅可应对单个可用区的灾难和故障,无法应对地域级的灾难故障。

单地域云+IDC 容灾方案

方案架构与单地域多可用区容灾方案类似,要点如下:

  1. 云上 VPC 与 IDC 建立专线连接,打通管控与数据通道。

  2. 通过 ACK One 注册集群接入 IDC 集群,使用阿里云强大可观测和安全能力,统一管理 IDC 集群和 ACK 集群。

  3. 通过 ACK One GitOps 应用分发,在 2 个集群中部署应用,实现基于 Git 仓库的持续一致性部署。

基于 DNS 流量分发(单地域云上和云下双活)

基于 ACK One 多集群网关(单地域云上和云下双活)

多地域容灾

如果业务规模大重要性高,服务的用户数量多范围广,单地域的容灾方案就无法满足业务高可用要求,这时需要多地域容灾方案。在多个地域独立部署业务系统,保证每个地域的业务系统具有单独闭环提供完整的服务能力。

  1. 通过全局流量管理(GTM)实现用户就近接入相应地域。

  2. 通过 ACK One GitOps 应用分发,在 2 个 ACK 集群中部署应用,实现基于 Git 仓库的持续一致性部署。

  3. 缓存多地域高可用方案,可以参考阿里云产品相关文档,例如:Tair 全球多话 [ 27]

  4. 数据库跨地域高可用方案,可以参考阿里数据库云产品相关文档,例如:云原生数据库 PolarDB MySQL 全球数据库 [ 28]

  5. 地域内,可以采用单地域多可用区容灾方案。

单元化多活部署

区别与前一方案,多地域单元化多活部署,需要设计分片规则对应用和数据进行分片,使得单元提供面向部分数据分片的完整服务能力,实现业务安全故障隔离,水平扩展,服务庞大的用户群体。一般分为中心单元(拥有所有用户数据)和多个子单元(分片后详细数据)。此种方式需要业务系统支持,自定义分流规则,数据拆分,单元间配合等,复杂度高。

总结

各种灾难事件会影响您业务的可用性,通过使用阿里云的相关云产品的容灾能力,可以减轻或者消除这些影响。首先,需要了解业务可用性需求,从而选择一个适当的容灾策略,然后,使用阿里云相关云产品,包括:容器(容器服务 Kubernetes 版 ACK [ 1] 和分布式云容器平台 ACK One [ 2] )、消息、缓存、数据库等,设计容灾架构,快速达到您业务可用性要求的恢复时间目标 RTO 和恢复点目标 RPO。

相关链接:

[1] 容器服务 Kubernetes 版 ACK

help.aliyun.com/zh/ack/

[2] 分布式云容器平台 ACK One

help.aliyun.com/zh/ack/dist...

[3] ACK One 备份中心

help.aliyun.com/zh/ack/dist...

[4] ACK One 注册集群

help.aliyun.com/zh/ack/dist...

[5] ACK One 舰队多集群 Service

help.aliyun.com/zh/ack/dist...

[6] ACK One GitOps 应用分发

help.aliyun.com/zh/ack/dist...

[7] ACK Ingress

help.aliyun.com/zh/ack/ack-...

[8] ACK HPA

help.aliyun.com/zh/ack/ack-...

[9] ACK Cluster Autocaler

help.aliyun.com/zh/ack/ack-...

[10] ACK One 多集群网关

help.aliyun.com/zh/ack/dist...

[11] 地域(Region)

help.aliyun.com/document_de...

[12] 云盘快照

help.aliyun.com/zh/ecs/user...

[13] 文件存储 NAS

help.aliyun.com/zh/nas/prod...

[14] 对象存储 OSS

help.aliyun.com/zh/oss/prod...

[15] 云备份

help.aliyun.com/zh/cloud-ba...

[16] RDS MySQL 数据库备份恢复

help.aliyun.com/zh/flink/de...

[17] RDS 实例间数据迁移

help.aliyun.com/zh/rds/apsa...

[18] IDC 应用上云迁移

help.aliyun.com/zh/ack/dist...

[19] 跨版本集群迁移

help.aliyun.com/zh/ack/dist...

[20] 跨账号集群接入

help.aliyun.com/zh/ack/dist...

[21] 跨集群迁移应用

help.aliyun.com/zh/ack/dist...

[22] 全局流量管理(GTM)

help.aliyun.com/document_de...

[23] 云消息队列 RocketMQ 版实例规格

help.aliyun.com/zh/apsaramq...

[24] 云消息队列 Kafka 版实例规格

help.aliyun.com/zh/apsaramq...

[25] 云原生内存数据库 Tair 容灾方案

help.aliyun.com/zh/tair/pro...

[26] RDS MySQL 数据库搭建高可用架构

help.aliyun.com/zh/rds/apsa...

[27] Tair 全球多话

help.aliyun.com/zh/tair/use...

[28] 云原生数据库 PolarDB MySQL 全球数据库

help.aliyun.com/zh/polardb/...

相关推荐
颜淡慕潇2 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
lmxnsI2 小时前
docker使用笔记
笔记·docker·容器
didiplus4 小时前
Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
云原生·容器·kubernetes
玄德公笔记4 小时前
docker-compose搭建sfpt服务器
服务器·docker·容器·sftp·docker-compose
小钟不想敲代码6 小时前
Docker部署Sentinel
docker·容器·sentinel
上海运维Q先生6 小时前
面试题整理17----K8s中request和limit资源限制是如何实现的
服务器·云原生·kubernetes
胖毁青春,瘦解百病7 小时前
Docker镜像源设置不生效问题排查
docker·容器
会飞的土拨鼠呀7 小时前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes
Carry_NJ10 小时前
docker-compose样例
运维·docker·容器
勇-子10 小时前
K8s 常用资源介绍
云原生·容器·kubernetes