概述
Velero(以前稱為Heptio Ark)是一個開源工具,可以安全地備份和還原,執行災難恢復以及遷移 Kubernetes 群集資源和持久卷,可以在 TKE 集群或自建 Kubernetes 集群中部署 Velero 用於:
- 備份集群並在丟失的情況下進行還原。
- 將集群資源遷移到其他集群。
- 將生產集群復制到開發和測試集群。
更多關於 Velero 介紹,請參閱 Velero 官網,本文將介紹使用 Velero 實現 TKE 集群間的無縫遷移復制集群資源的操作步驟。
遷移原理
在需要被遷移的集群和目標集群上都安裝 Velero 實例,並且兩個集群的 Velero 實例指向相同的騰訊雲 COS 對象存儲位置,使用 Velero 在需要被遷移的集群執行備份操作生成備份數據存儲到騰訊雲 COS ,然后在目標集群上使用 Velero 執行數據的還原操作實現遷移,遷移原理如下:
前提條件
- 已 注冊騰訊雲賬戶。
- 已開通騰訊雲 COS 服務。
- 已有需要被遷移的 TKE 集群(以下稱作集群 A),已創建遷移目標的 TKE 集群(以下稱作集群 B),創建 TKE 集群請參閱 創建集群。
- 集群 A 和 集群 B 都需要安裝 Velero 實例(1.5版本以上),並且共用同一個騰訊雲 COS 存儲桶作為 Velero 后端存儲,安裝步驟請參閱 配置存儲和安裝 Velero 。
注意事項
-
從 1.5 版本開始,Velero 可以使用 Restic 備份所有pod卷,而不必單獨注釋每個 pod。默認情況下,此功能允許用戶使用 restic 備份所有 pod 卷,但以下卷情況除外:
- 掛載默認
Service Account Secret
的卷 - 掛載的
hostPath
類型卷 - 掛載 Kubernetes
secrets
和configmaps
的卷
本示例需要 Velero 1.5 以上版本且啟用 restic 來備份持久卷數據,請確保在安裝 Velero 階段開啟
--use-restic
和--default-volumes-to-restic
參數,安裝步驟請參閱 配置存儲和安裝 Velero 。 - 掛載默認
-
在執行遷移過程中,請不要對兩邊集群資源做任何 CRUD 操作,以免在遷移過程中造成數據差異,最終導致遷移后的數據不一致。
-
盡量保證集群 B 和集群 A 工作節點的CPU、內存等規格配置相同或不要相差太大,以免出現遷移后的 Pods 因資源原因無法調度導致 Pending 的情況。
操作步驟
在集群 A 創建備份
可以手動執行備份操作,也可以給 velero 設置定期自動備份,設置方法可以使用 velero schedule -h
查看。本示例將以 default 、default2 命名空間的資源情況作比較驗證,下圖可以看到集群 A 中兩個命名空間下的 Pods 和 PVC 資源情況:
提示:可以指定在備份期間執行一些自定義 Hook 操作。比如,需要在備份之前將運行應用程序的內存中的數據持久化到磁盤。 有關備份 Hook 的更多信息請參閱 備份 Hook 。
其中,集群中的 minio 對象存儲服務使用了持久卷,並且已經上傳了一些圖片數據,如下圖所示:
執行下面命令來備份集群中不包含 velero 命名空間(velero 安裝的默認命名空間)資源的其他所有資源,如果想自定義需要備份的集群資源范圍,可使用 velero create backup -h
查看支持的資源篩選參數。
velero backup create <BACKUP-NAME> --exclude-namespaces <NAMESPACE>
本示例我們創建一個 “default-all” 的集群備份,備份過程如下圖所示:
備份任務狀態顯示是 “Completed” 時,說明備份任務完成,可以通過 velero backup logs | grep error
命令檢查是否有備份操作發生錯誤,沒有輸出則說明備份過程無錯誤發生,如下圖所示:
注意:請確保備份過程未發生任何錯誤,假如 velero 在執行備份過程中發生錯誤,請排查解決后重新執行備份。
備份完成后,臨時將備份存儲位置更新為只讀模式(非必須,這可以防止在還原過程中 Velero 在備份存儲位置中創建或刪除備份對象):
kubectl patch backupstoragelocation default --namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadOnly"}}'
在集群 B 執行還原
在執行還原操作前集群 B 中 default 、default2 命名空間下沒有任何工作負載資源,查看結果如下圖:
臨時將集群 B 中 Velero 備份存儲位置也更新為只讀模式(非必須,這可以防止在還原過程中 Velero 在備份存儲位置中創建或刪除備份對象):
kubectl patch backupstoragelocation default --namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadOnly"}}'
提示:可以選擇指定在還原期間或還原資源后執行自定義 Hook 操作。例如,可能需要在數據庫應用程序容器啟動之前執行自定義數據庫還原操作。 有關還原 Hook 的更多信息請參閱 還原 Hook。
在還原操作之前,需確保集群 B 中 的 Velero 資源與雲存儲中的備份文件同步。默認同步間隔是1分鍾,可以使用--backup-sync-period
來配置同步間隔。可以使用下面命令查看集群 A 的備份是否已同步:
velero backup get <BACKUP-NAME>
獲取備份成功檢查無誤后,執行下面命令還原所有內容到集群 B 中:
velero restore create --from-backup <BACKUP-NAME>
本示例執行還原過程如下圖:
等待還原任務完成后查看還原日志, 可以使用下面命令查看還原是否有報錯和跳過信息:
# 查看遷移時是否有錯誤的還原信息
velero restore logs <BACKUP-NAME> | grep error
# 查看遷移時跳過的還原操作
velero restore logs <BACKUP-NAME> | grep skip
從下圖可以看出沒有發生錯誤的還原步驟,但是有很多 “skipped” 步驟,是因為我們在備份集群資源時備份了不包含 velero 命名空間的所有集群資源,有一些同類型同名的集群資源已經存在了,如 kube-system下的集群資源,當還原過程中有資源沖突時,velero 會跳過還原的操作步驟。所以實際上還原過程是正常的,可以忽略這些 “skipped” 日志,假如有特殊情況可以分析下日志看看。
遷移結果核驗
查看校驗集群 B 執行遷移操作后的集群資源,可以看到 default 、default2 命名空間下的 pods 和 PVC 資源已按預期遷移成功:
再通過 Web 管理頁面登錄集群 B 中的 monio 服務,可以看到 minio 服務中的圖片數據沒有丟失,說明持久卷數據也已按預期遷移成功。
至此,我們完成了 TKE 集群間資源的遷移,遷移操作完成后,請不要忘記把備份存儲位置恢復為讀寫模式(集群 A 和 集群B),以便下次備份任務可以成功使用:
kubectl patch backupstoragelocation default --namespace velero \
--type merge \
--patch '{"spec":{"accessMode":"ReadWrite"}}'
總結
本文主要介紹了在 TKE 集群間使用 Velero 遷移集群資源的原理、注意事項和操作方法,成功的將示例集群 A 中的集群資源無縫遷移到集群 B 中,整個遷移過程非常簡單方便,是一種非常友好的集群資源遷移方案。
【騰訊雲原生】雲說新品、雲研新術、雲游新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!