方案概述
操作場景
隨著容器化技術的日益成熟,眾多企業正逐步以容器替代虛擬機,實現應用的高效運行與部署。這一轉變在很大程度上得益于Kubernetes平臺的崛起,它極大地簡化了容器編排流程,賦予了容器部署前所未有的便捷性和效能。
隨著多云災備、高可用、供應商多樣化、降低成本等多方面的考量,將第三方集群已有業務遷移或備份到天翼云容器引擎已成為眾多企業的選擇之一。
此外,不少企業仍選擇自行搭建Kubernetes集群,但隨之而來的是運維壓力的顯著增大。自建集群要求運維團隊自行配置復雜的管理系統、構建全方位的監控體系,這不僅推高了人力成本,還可能導致工作效率下降。從性能角度看,自建Kubernetes集群存在明顯局限。其規模調整困難,擴展性欠佳,難以應對業務峰值時期的動態資源需求,容易陷入資源短缺或過度閑置的兩難境地。此外,此類集群往往缺乏完備的容災規劃,一旦發生故障,可能導致整個集群服務中斷,對生產環境造成重大影響。
天翼云容器引擎以其簡便的集群管理機制、強大的彈性擴展功能,以及對應用服務網格與Helm標準模板的深度整合,為企業用戶帶來了顯著的運維簡化、成本節約效益,贏得了廣大企業的廣泛認同與信賴。越來越多的企業選擇將原有的Kubernetes集群全面遷移至天翼云容器引擎進行云端托管。本文旨在詳述這一遷移過程的具體策略與操作步驟,助力企業順利實現集群上云的平滑過渡。
遷移方案
集群遷移工作主要涵蓋以下六個關鍵環節:
- 目標集群資源規劃: 全面了解云容器引擎集群與自建集群之間的特性差異,合理進行資源分配。為確保遷移后的平穩運行,建議盡可能保持新舊集群在配置上的對應一致性。
- 集群外資源遷移: 如涉及集群外部資源的遷移,可選用相應的遷移解決方案進行操作。
- 遷移工具安裝: 完成集群外資源轉移后,分別在源集群與目標集群中安裝遷移工具Velero。
- 集群內資源遷移: 采用遷移工具Velero,將源集群內部資源備份至對象存儲系統,隨后在目標集群中執行恢復操作。
- 原集群應用備份: 用戶啟動備份流程時,Velero會在源集群中生成Backup對象,同步收集并備份相關數據及資源,然后將其打包上傳至符合S3協議的對象存儲。備份的各類集群資源將以JSON格式文件保存。
- 目標集群應用恢復: 在目標集群進行還原時,Velero會定位到先前存儲備份數據的臨時對象桶,將備份數據下載至新集群環境中,依據JSON文件內容逐一重新部署各項資源。
- 資源更新適配: 遷移后的集群資源可能出現部署問題,此時需對存在問題的資源進行針對性更新適配,主要涵蓋以下幾類情況:
- 鏡像更新適配
- 訪問服務更新適配
- StorageClass更新適配
- 數據庫更新適配
- 其他后續工作: 集群資源部署無誤后,對遷移后應用的各項功能進行全面驗證,逐步將業務流量切至新集群。確認所有服務均正常運作后,可將原集群安全下線。
目標集群資源規劃
云容器引擎允許用戶對集群資源進行個性化選取,以精準匹配其多樣化的業務訴求。如下所示的表1中,列舉了集群的指標參數,并提供了本次演示實例的規劃選擇。用戶應依據自身業務的確切需求,對相關設置做出合理調配,其間,我們建議盡可能保持與原集群性能配置的一致性水平。
主要指標參數 指標參數說明 本示例規劃 kubernetes版本
1.25.6
1.27.8
1.27.8 網絡插件
cubecni:cubecni 是云容器引擎自研的網絡插件,支持基于 Kubernetes 標準的網絡策略來定義容器間的訪問策略
calico:使用社區 calico CNI 插件的IP模式
cubecni apiserver訪問 API Server的訪問需要依賴ELB實例,您可根據需要選擇合適的ELB規格,系統將根據該規格創建一個私網ELB實例。規格選擇請見:了解ELB實例規格 標準型I 控制節點數
1:單控制節點,無高可用能力,不建議在生產環境使用
3:基本的高可用能力
5:更多冗余的高可用能力
3 節點規格 分為控制節點規格和工作節點規格,如何選擇可以參考:集群規格推薦規劃 通用型4C8G 工作節點操作系統
公有鏡像:ctyunos201
私有鏡像:用戶自定義鏡像
ctyunos201
集群外資源遷移
集群外資源主要包括自建鏡像倉庫、自建數據庫等。這些遷移工作是可選的,可以根據實際需求決定是否進行。
自建鏡像倉庫遷移請參見:遷移自建Harbor至容器鏡像服務企業版
自建數據庫如mysql遷移請參見:使用mysqldump遷移MySQL數據
遷移工具安裝
Velero作為一款開源的解決方案,專為Kubernetes集群設計,提供了全面的備份與遷移功能。其內建了對Restic工具的支持,以確保對Persistent Volume(PV)數據的安全備份。借助Velero,用戶能夠系統性地備份原Kubernetes集群中的各類資源實體,包括但不限于Deployments、Jobs、Services、ConfigMaps等,以及與Pod關聯的持久卷數據,并將這些備份安全地傳輸并儲存在指定的對象存儲服務中。
當面臨災難恢復場景或有計劃的集群遷移需求時,目標集群只需運用同樣配置的Velero工具,即可從預先設定的對象存儲位置檢索相應的備份數據,進而按照實際需求逐步恢復集群資源的狀態。
前提條件
- 原始自建集群Kubernetes版本與所選云容器引擎的版本差距盡量小,差距越大,遷移過程中出現不兼容的風險越大
- 準備存放備份數據的對象存儲,可以使用云廠商提供的對象存儲,或者自建minio服務,本文使用自建MinIO服務
- 已開通遷移的目標云容器引擎集群
- 源集群與目標集群都可以正常訪問到對象存儲服務
安裝MinIO
MinIO 是一個兼容S3接口協議的高性能對象存儲開源工具。由于源集群與目標集群都需要能夠訪問到對象存儲服務,建議單獨申請一臺ECS并綁定EIP作為MinIO服務的載體,源集群與目標集群可以方便的通過公網連接MinIO服務。單獨申請一臺ECS的另一個好處是將備份資源與集群資源區分開,出問題時彼此不會互相影響。
1、下載MinIO
mkdir /opt/minio
mkdir /opt/miniodata
cd /opt/minio
wget //dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
2、設置MinIO的用戶名和密碼
注意此方法設置的用戶名及密碼為臨時環境變量,在服務重啟后需要重新設定。
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minio123!
3、啟動服務
./minio server /opt/miniodata/ --console-address ":30000" &
以上命令指定了/opt/miniodata目錄為備份數據存儲的路徑,30000端口為console訪問端口。關于minio的詳細啟動參數,請參見:。
4、瀏覽器訪問//{minio所在ECS的EIP}:30000,可進入MinIO console界面。
安裝Velero
首先前往MinIO console界面,創建存放備份文件的桶并命名為velero。此處桶名稱可自定義,但安裝Velero時必須指定此桶名稱,否則將無法訪問導致備份失敗。
注意?Velero服務端在源集群與目標集群上都需要部署,并且部署方法是一致的;
以下命令建議分別在源集群和目標集群的master上執行。
1、下載Velero
wget //github.com/vmware-tanzu/velero/releases/download/v1.7.0/velero-v1.7.0-linux-amd64.tar.gz
tar -xvf velero-v1.7.0-linux-amd64.tar.gz
cp ./velero-v1.7.0-linux-amd64/velero /usr/local/bin
2、創建密鑰文件credentials-velero,用于連接備份數據的對象存儲,文件內容如下,注意與安裝MinIO時的用戶名和密碼一致:
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123!
3、部署Velero服務端
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.2.1 \
--bucket velero \
--secret-file ./credentials-velero \
--use-restic \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=//{minio所在ECS的EIP}:30000
以上命令--bucket參數需要修改為已創建的對象存儲桶名稱,本例中為velero。--backup-location-config參數中的s3Url要修改為安裝MinIO時ECS的EIP和設置的對應端口。關于更多自定義安裝參數,請參見:。
4、Velero實例將默認創建一個名為velero的namespace,執行以下命令可查看pod狀態。
$ kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
restic-xxxxx 1/1 Running 0 50s
velero-xxxxxxx-xxxxxxx 1/1 Running 0 50s
5、查看Velero工具與對象存儲的對接情況,狀態需要為available
$ velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws velero Available 2024-04-04 11:08:12 +0800 CST ReadWrite true
集群內資源遷移
源集群應用備份
注意以下命令在源集群的master上運行。
Velero可以實現多個粒度的集群備份及恢復,如集群級、命名空間級、資源對象級等。Velero備份集群命令基本格式為:velero backup create RESTORE_NAME [flags],它有多種參數,以下舉一些例子:
備份集群所有資源
velero backup create cluster-backup
備份一個namespace,如命名空間demo
velero backup create namespace-backup --include-namespaces demo
備份一個namespace下的一種資源,如命名空間demo下的deployments
velero backup create namespace-deploy-backup --include-namespaces demo --include-resources deployments
備份過程中可以通過以下命令查看備份情況:
velero backup get
目標集群應用恢復
注意以下命令在目標集群的master上運行。
Velero恢復/同步數據的命令基本格式為velero restore create RESTORE_NAME [--from-backup BACKUP_NAME] [flags]。以同步上面的namespace-deploy-backup為例,以下命令可以將源集群已備份的數據(即demo命名空間下的deployments),同步到目標集群上,實現集群數據的遷移:
velero restore create --from-backup namespace-deploy-backup
恢復過程中可以通過以下命令查看恢復情況:
velero restore get
資源更新適配
由于基礎設施或環境信息的改變,遷移后的資源配置需要針對新環境進行適配。以下列舉一些常見的需要適配的資源及對應的處理方法。
鏡像更新適配
一般情況下,集群內的應用使用的鏡像都會保存在一個鏡像倉庫中,如果目標集群可以直接訪問源集群使用的鏡像倉庫,那么不需要針對容器鏡像做任何適配。
如果原有的鏡像倉庫無法訪問或者有網絡性能的問題,就需要在集群外資源遷移時進行鏡像倉庫遷移,并將應用中的鏡像名稱更改為新的鏡像名稱。
訪問服務更新適配
如果源集群的服務都是通過集群內的DNS域名訪問的,那么不需要針對訪問服務做任何適配。
如果是通過NodePort方式訪問,需要將源集群的節點IP更改為目標集群的節點IP。
如果集群內應用通過Ingress對外提供服務,需要將域名DNS從源集群的ingress節點IP更改為目標集群的ingress節點IP。如果源集群的應用需要在公網上提供服務,則需要將目標集群的ingress暴露到公網上,具體操作請參見:如何將Ingress服務暴露到公網。
StorageClass更新適配
注意以下操作需要在進行集群備份/恢復之前進行。
由于目標集群所采用的存儲基礎設施與源集群存在差異,可能導致遷移后存儲卷無法實現正常掛載。針對這一情況,您可酌情選取并實施以下任一策略,以順利完成存儲卷的適應性調整。
-
創建ConfigMap映射
apiVersion: v1kind: ConfigMapmetadata: name: change-storageclass-plugin-config namespace: velero labels: app.kubernetes.io/name: velero velero.io/plugin-config: "true" velero.io/change-storage-class: RestoreItemActiondata: {原集群StorageClass name01}: {目標集群StorageClass name01} {原集群StorageClass name02}: {目標集群StorageClass name02}
- 執行以下命令,應用上述的 ConfigMap 配置
$ kubectl create -f change-storage-class.yaml
configmap/change-storageclass-plugin-config created
- 創建同名StorageClass
通過云容器引擎頁面在目標集群上創建與源集群名稱相同的存儲類,過程請參見:使用zos動態存儲卷
通過以上任一方法在目標集群創建與源集群同名的StorageClass后,目標集群進行恢復/同步操作時,應用依賴的pv/pvc即可以動態自動創建,不對集群遷移造成影響。
數據庫更新適配
如果源數據庫進行了遷移,需要在目標集群中將遷移過來的應用配置進行修改,將源數據庫地址更改為新數據庫地址。
其他后續工作
應用功能驗證
遷移工作完成后,需要對遷移后的服務進行功能測試,驗證遷移效果。
業務流量切換
功能測試驗證通過后,需要將全部網絡流量導向目標集群,有以下兩種方式可參考:
- DNS流量遷移策略:通過調整DNS系統的配置設定,實現對網絡流量的定向引導,將其從源集群平穩過渡至目標集群。
- 客戶端層面流量遷移方案:在客戶端應用程序上進行代碼版本升級或配置更新,以此達到將客戶端發起的訪問請求重新指向新集群的目的。
原集群下線
待目標集群業務正常運行一段時間后,可以下線原集群,下線原集群過程中請確認:
- 目標集群業務各環節運作順暢,無異常情況
- 對原集群數據進行備份
- 對已完成遷移且不再需要的備份文件進行清理