目录
1. 背景
一直想写篇容灾相关的题目,原因是虽然在网上可以搜索到不少容器容灾方案,看起来都很高大上,读完一圈之后感觉讲的头头是道,但回到现实,如何自建容器容灾,又感觉无从下手。因此,本文介绍如何从零开始,搭建属于自己的一套容器容灾方案。
2. 基本功能
2.1 准备k8s集群和应用
至少准备2个集群,一个做为主集群,一个做为灾备集群。应用部署在主集群上。
2.2 同步K8S资源
2.2.1 同步方式的选取
-
通过CICD系统,在发布应用的时候在灾备集群上一起发布和更新
-
使用K8同步工具,例如velero进行定时/手动同步
-
使用多集群管理系统,例如kubefed等,同步到灾备集群
2.2.2 需要考虑的功能点
-
资源映射,灾备集群的资源并不是主集群简单的复制,而是可以自定义修改的,例如工作负载副本数,环境变量,ingress annotation,service 的loadbalancer, storageclass名称等。
-
资源选定,范围可以是工作空间、命名空间、资源组和单个资源名称。
-
支持定时同步或手动同步,以备不时之需
2.3 数据同步
2.3.1 实现方式
-
文件复制,通过复制工具,将pvc中的数据复制到灾备集群,常见的共有restic,rsync,rclone,juicesync等文件复制工具。
-
存储复制。利用存储的同步,包括异步或同步的方式。
-
共享存储。主从集群共享同一套高可用的文件系统或存储
2.3.2 考虑功能点
-
增量复制
-
数据一致性,尤其是业务级别中,多个工作负载数据的一致性
-
RPO:需要根据不同的同步方式,设置不同的RPO
-
支持定时同步或手动同步,以备不时之需
2.4 切换流程
2.4.1 操作
-
切换
应用从主集群切换到从集群,并暂停同步关系
-
回退
应用从从集群回退到主集群,并丢掉从集群的新增数据,重新建立主集群到从集群的同步关系
-
反向同步
建立从从集群到主集群的同步关系,将从集群新增数据同步到主集群。
2.4.2 步骤
每项操作中,应该包含的步骤为:关闭应用,卸载数据卷,挂在数据卷,启动应用。
2.4.3 考虑功能点
-
每个操作都应该有超时机制,并可以手动调整
-
每个操作都应该支持:取消、重试
2.5 其它
-
容灾实例应该需要支持暂停和启动
-
切换支持批量切换,在集群故障下,快速将所有容灾实例切换到灾备就集群
基于以上,就可以简单搭建出来一个基本的容灾系统了。
3 进阶功能
3.1 演练
项目 类型 | 前置条件 | 对业务影响 | 对灾备影响 | 真实性 | 目的 |
桌面演练 | 无 | 无 | 无 | 低 | 熟悉演练流程 |
沙箱演练 | 主从建立 | 无 | 无 | 中 | 验证应用和数据 |
实战演练 | 主从断开 | 无 | 有 | 中 | 验证应用可在灾备端拉起并可用 |
计划内切换 | 主从建立 | 有 | 有 | 高 | 验证业务流量可切换到灾备集群 |
故障切换 | 主从断开 | 有 | 有 | 高 | 验证灾难发生时,灾备集群接管流量 |
3.2 工作流
在切换步骤中,添加一些自定义的步骤,执行自定义的脚本,或者是需要暂停某个步骤,进行手工操作。
在切换步骤中,某些步骤失败可能是可以忽略的,因此可以指定跳过某些步骤。
3.3 业务单元
多个容灾实例之间,存在服务的依赖,组成一个完整的大型业务。因此需要编排切换顺序。业务单元可以组织这些容灾实例,完成业务级别的编排和切换能力。
以上是整体的架构和思路。其中每个模块的具体设计和实现,后续会持续更新。