原標題:亞馬遜云科技AI平臺部署,讓有狀態(tài)服務跨云遷移到Amazon EKS
亞馬遜云科技的Kubernetes和云原生技術(shù)在過去幾年中經(jīng)歷了驚人的增長,企業(yè)采用Kubernetes的主要原因是它可以快速擴展,提高資源利用率,并且可遷移性優(yōu)勢明顯。從本地部署Kubernetes向公有云托管Kubernetes環(huán)境遷移和跨云進行Kubernetes遷移的趨勢正在加速,因為云上托管的Kubernetes服務的維護更加簡單,可用性和可靠性更高。
有狀態(tài)服務遷移的需求
Kubernetes平臺上運行的應用一般是無狀態(tài)(Stateless)應用為主,但是有狀態(tài)(Stateful)應用也不少見,各種數(shù)據(jù)庫就是最常見的有狀態(tài)應用,另外就是一些應用有數(shù)據(jù)持久化到磁盤的需求。而無狀態(tài)應用則與有狀態(tài)應用相對應,常見的無狀態(tài)應用包括各種頁面前端、Httpd、Nginx中間件等。
無狀態(tài)服務在遷移的過程中一般使用yaml文件手工重新部署或利用CICD平臺進行自動部署,不用過多考慮將原有Kubernetes平臺上的應用數(shù)據(jù)恢復到新集群中。但是一些有持久化數(shù)據(jù)的服務在遷移時要將原有數(shù)據(jù)也遷移到新集群中,這些服務通常采用Deployment+PVC或StatefulSet的方式進行部署,這時選擇什么樣的遷移方式顯得很重要。對于類似數(shù)據(jù)庫這樣實時性要求高的,一般建議采用專業(yè)工具來進行在線遷移,如:Amazon DMS;如果是對實時性要求沒有非常高要求的情況下,可以采用一些開源的數(shù)據(jù)遷移工具來進行,本文就是針對這種場景,推薦大家使用Velero這個工具協(xié)助大家遷移有持久化數(shù)據(jù)的服務。
什么是有狀態(tài)服務
有狀態(tài)應用(Stateful Application)通常是指有持久化存儲需求的各種應用。有狀態(tài)在Kubernetes中的定義是:StatefulSet是用來管理有狀態(tài)應用的工作負載API對象。StatefulSet用來管理某些Pod集合的部署和擴縮,并為這些Pod提供持久存儲和持久標識符。
為什么有狀態(tài)服務難遷移
有狀態(tài)應用在容器平臺遷移時面臨一個問題:在應用需要數(shù)據(jù)不丟失的情況下,必須要能做到持久化數(shù)據(jù)與容器一同進行遷移,否則原有數(shù)據(jù)將會丟失或無法訪問。另外從技術(shù)角度講,在跨平臺遷移時因為底層存儲驅(qū)動大多不一樣,導致無法直接將數(shù)據(jù)遷移到另外的平臺。目前,通用遷移方案大多依賴于有狀態(tài)服務自身提供的備份和恢復機制來實現(xiàn),然而在遷移操作過程中存在需要人工參與、操作時間過長等問題。
遷移方案
架構(gòu)圖
方案說明
在源Kubernetes集群所在云虛擬機上安裝Velero CLI
在源Kubernetes集群上安裝并啟動Velero server
通過Velero CLI創(chuàng)建源Kubernetes集群上的有狀態(tài)應用備份文件并存儲到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,可以實現(xiàn)以下功能:
備份集群資源,丟失時恢復
將集群資源遷移到其他集群
將生產(chǎn)集群資源復制到開發(fā)和測試集群
下圖為Velero的工作流程圖:
遷移原理
Velero使用名為restic的免費開源備份工具備份和恢復Kubernetes卷。Velero引入了三個CRD(Custom Resource Definitions)和關(guān)聯(lián)的Controllers。
ResticRepository用來管理Velero的restic存儲庫的生命周期,當請求備份時,Velero會為每個namespace創(chuàng)建一個restic庫,用于存儲備份數(shù)據(jù)。PodVolumeBackup用于pod中卷的靜態(tài)備份,主Velero備份進程在找到帶注釋的pod時會為其創(chuàng)建備份,集群中的每個node上都會運行一個備份controller用來處理該節(jié)點上的pod的PodVolumeBackup。PodVolumeRestore是用于卷的靜態(tài)恢復的controller,Velero執(zhí)行restic restore命令來恢復pod volume數(shù)據(jù)。
在跨云遷移Kubernetes集群中的有狀態(tài)服務時,由于經(jīng)常使用的Kubernetes源集群的CSI (Cloud Storage Interface)不同于目標集群的CSI,會導致無法直接使用Snapshot來進行備份、恢復,這是在跨云遷移時的一個難題(不同云平臺之間的CSI Driver并不相同)。
所以使用Snapshot并不能完成有狀態(tài)服務的遷移,在這里我們使用Velero的File System Backup功能來實現(xiàn)。Velero不支持容器中hostpath的備份,所以請注意Velero支持的場景和功能是否滿足需求。如果在遷移需求中需要進行增量數(shù)據(jù)遷移,此時建議使用應用自帶的遷移方法,如可使用Amazon DMS去滿足數(shù)據(jù)庫的全量+增量數(shù)據(jù)遷移。
下面是備份恢復過程中的相關(guān)概念:
Kubernetes Volume
Container中的文件在磁盤上是臨時存放的,這給Container中運行的較重要的應用程序帶來一些問題。問題之一是當容器崩潰時文件丟失。第二個問題是在同一Pod中運行多個容器并共享文件時,如果kubelet重新啟動容器,但容器會以干凈的狀態(tài)重啟,此時無法共享數(shù)據(jù)。Kubernetes卷(Volume)這一抽象概念能夠解決這兩個問題。
Snapshot
在Kubernetes 中,VolumeSnapshot表示存儲系統(tǒng)上卷的快照。
File System Backup
Velero支持從卷的文件系統(tǒng)備份和恢復附加到Pod的Kubernetes卷,稱為文件系統(tǒng)備份(簡稱FSB)或Pod卷備份。
投稿郵箱:chuanbeiol@163.com 詳情請訪問川北在線:http://dstuf.com/