原标题:亚马逊云科技AI平台部署,让有状态服务跨云迁移到Amazon EKS
亚马逊云科技的Kubernetes和云原生技术在过去几年中经历了惊人的增长,企业采用Kubernetes的主要原因是它可以快速扩展,提高资源利用率,并且可迁移性优势明显。从本地部署Kubernetes向公有云托管Kubernetes环境迁移和跨云进行Kubernetes迁移的趋势正在加速,因为云上托管的Kubernetes服务的维护更加简单,可用性和可靠性更高。
有状态服务迁移的需求
Kubernetes平台上运行的应用一般是无状态(Stateless)应用为主,但是有状态(Stateful)应用也不少见,各种数据库就是最常见的有状态应用,另外就是一些应用有数据持久化到磁盘的需求。而无状态应用则与有状态应用相对应,常见的无状态应用包括各种页面前端、Httpd、Nginx中间件等。
无状态服务在迁移的过程中一般使用yaml文件手工重新部署或利用CICD平台进行自动部署,不用过多考虑将原有Kubernetes平台上的应用数据恢复到新集群中。但是一些有持久化数据的服务在迁移时要将原有数据也迁移到新集群中,这些服务通常采用Deployment+PVC或StatefulSet的方式进行部署,这时选择什么样的迁移方式显得很重要。对于类似数据库这样实时性要求高的,一般建议采用专业工具来进行在线迁移,如:Amazon DMS;如果是对实时性要求没有非常高要求的情况下,可以采用一些开源的数据迁移工具来进行,本文就是针对这种场景,推荐大家使用Velero这个工具协助大家迁移有持久化数据的服务。
什么是有状态服务
有状态应用(Stateful Application)通常是指有持久化存储需求的各种应用。有状态在Kubernetes中的定义是:StatefulSet是用来管理有状态应用的工作负载API对象。StatefulSet用来管理某些Pod集合的部署和扩缩,并为这些Pod提供持久存储和持久标识符。
为什么有状态服务难迁移
有状态应用在容器平台迁移时面临一个问题:在应用需要数据不丢失的情况下,必须要能做到持久化数据与容器一同进行迁移,否则原有数据将会丢失或无法访问。另外从技术角度讲,在跨平台迁移时因为底层存储驱动大多不一样,导致无法直接将数据迁移到另外的平台。目前,通用迁移方案大多依赖于有状态服务自身提供的备份和恢复机制来实现,然而在迁移操作过程中存在需要人工参与、操作时间过长等问题。
迁移方案
架构图
方案说明
在源Kubernetes集群所在云虚拟机上安装Velero CLI
在源Kubernetes集群上安装并启动Velero server
通过Velero CLI创建源Kubernetes集群上的有状态应用备份文件并存储到Cloud Object Storage中
使用命令行工具将Cloud Object Storage中的备份文件同步到Amazon S3
在Amazon EC2上同样安装Velero CLI
在Amazon EKS上安装并启动Velero server
使用Velero CLI将Amazon S3桶中的备份文件恢复到Amazon EKS集群上
Velero工具说明
Velero(之前的版本叫做Heptio Ark),一个开源工具,可以对Kubernetes集群进行安全备份和恢复,迁移Kubernetes集群资源和持久卷,对于应用部署类型,无论Deployment还是StatefulSet都可以支持。
在Kubenetes集群中部署Velero,可以实现以下功能:
备份集群资源,丢失时恢复
将集群资源迁移到其他集群
将生产集群资源复制到开发和测试集群
下图为Velero的工作流程图:
迁移原理
Velero使用名为restic的免费开源备份工具备份和恢复Kubernetes卷。Velero引入了三个CRD(Custom Resource Definitions)和关联的Controllers。
ResticRepository用来管理Velero的restic存储库的生命周期,当请求备份时,Velero会为每个namespace创建一个restic库,用于存储备份数据。PodVolumeBackup用于pod中卷的静态备份,主Velero备份进程在找到带注释的pod时会为其创建备份,集群中的每个node上都会运行一个备份controller用来处理该节点上的pod的PodVolumeBackup。PodVolumeRestore是用于卷的静态恢复的controller,Velero执行restic restore命令来恢复pod volume数据。
在跨云迁移Kubernetes集群中的有状态服务时,由于经常使用的Kubernetes源集群的CSI (Cloud Storage Interface)不同于目标集群的CSI,会导致无法直接使用Snapshot来进行备份、恢复,这是在跨云迁移时的一个难题(不同云平台之间的CSI Driver并不相同)。
所以使用Snapshot并不能完成有状态服务的迁移,在这里我们使用Velero的File System Backup功能来实现。Velero不支持容器中hostpath的备份,所以请注意Velero支持的场景和功能是否满足需求。如果在迁移需求中需要进行增量数据迁移,此时建议使用应用自带的迁移方法,如可使用Amazon DMS去满足数据库的全量+增量数据迁移。
下面是备份恢复过程中的相关概念:
Kubernetes Volume
Container中的文件在磁盘上是临时存放的,这给Container中运行的较重要的应用程序带来一些问题。问题之一是当容器崩溃时文件丢失。第二个问题是在同一Pod中运行多个容器并共享文件时,如果kubelet重新启动容器,但容器会以干净的状态重启,此时无法共享数据。Kubernetes卷(Volume)这一抽象概念能够解决这两个问题。
Snapshot
在Kubernetes 中,VolumeSnapshot表示存储系统上卷的快照。
File System Backup
Velero支持从卷的文件系统备份和恢复附加到Pod的Kubernetes卷,称为文件系统备份(简称FSB)或Pod卷备份。
投稿邮箱:chuanbeiol@163.com 详情请访问川北在线:http://www.guangyuanol.cn/