在 TKE 中使用 Velero 遷移複製集羣資源

概述

Velero(之前稱爲Heptio Ark)是一個開源工具,能夠安全地備份和還原,執行災難恢復以及遷移 Kubernetes 羣集資源和持久卷,能夠在 TKE 集羣或自建 Kubernetes 集羣中部署 Velero 用於:數據庫

  • 備份集羣並在丟失的狀況下進行還原。
  • 將集羣資源遷移到其餘集羣。
  • 將生產集羣複製到開發和測試集羣。

更多關於 Velero 介紹,請參閱 Velero 官網,本文將介紹使用 Velero 實現 TKE 集羣間的無縫遷移複製集羣資源的操做步驟。後端

遷移原理

在須要被遷移的集羣和目標集羣上都安裝 Velero 實例,而且兩個集羣的 Velero 實例指向相同的騰訊雲 COS 對象存儲位置,使用 Velero 在須要被遷移的集羣執行備份操做生成備份數據存儲到騰訊雲 COS ,而後在目標集羣上使用 Velero 執行數據的還原操做實現遷移,遷移原理以下:安全

img

前提條件

  • 註冊騰訊雲帳戶
  • 已開通騰訊雲 COS 服務。
  • 已有須要被遷移的 TKE 集羣(如下稱做集羣 A),已建立遷移目標的 TKE 集羣(如下稱做集羣 B),建立 TKE 集羣請參閱 建立集羣
  • 集羣 A 和 集羣 B 都須要安裝 Velero 實例(1.5版本以上),而且共用同一個騰訊雲 COS 存儲桶做爲 Velero 後端存儲,安裝步驟請參閱 配置存儲和安裝 Velero

注意事項

  1. 從 1.5 版本開始,Velero 可使用 Restic 備份全部pod卷,而沒必要單獨註釋每一個 pod。默認狀況下,此功能容許用戶使用 restic 備份全部 pod 卷,但如下卷狀況除外:工具

    • 掛載默認 Service Account Secret 的卷
    • 掛載的 hostPath 類型卷
    • 掛載 Kubernetes secretsconfigmaps 的卷

    本示例須要 Velero 1.5 以上版本且啓用 restic 來備份持久卷數據,請確保在安裝 Velero 階段開啓 --use-restic--default-volumes-to-restic 參數,安裝步驟請參閱 配置存儲和安裝 Velero 測試

  2. 在執行遷移過程當中,請不要對兩邊集羣資源作任何 CRUD 操做,以避免在遷移過程當中形成數據差別,最終致使遷移後的數據不一致。spa

  3. 儘可能保證集羣 B 和集羣 A 工做節點的CPU、內存等規格配置相同或不要相差太大,以避免出現遷移後的 Pods 因資源緣由沒法調度致使 Pending 的狀況。rest

操做步驟

在集羣 A 建立備份

能夠手動執行備份操做,也能夠給 velero 設置按期自動備份,設置方法可使用 velero schedule -h 查看。本示例將以 default 、default2 命名空間的資源狀況做比較驗證,下圖能夠看到集羣 A 中兩個命名空間下的 Pods 和 PVC 資源狀況:日誌

提示:能夠指定在備份期間執行一些自定義 Hook 操做。好比,須要在備份以前將運行應用程序的內存中的數據持久化到磁盤。 有關備份 Hook 的更多信息請參閱 備份 Hook code

img

其中,集羣中的 minio 對象存儲服務使用了持久卷,而且已經上傳了一些圖片數據,以下圖所示:對象

img

執行下面命令來備份集羣中不包含 velero 命名空間(velero 安裝的默認命名空間)資源的其餘全部資源,若是想自定義須要備份的集羣資源範圍,可以使用 velero create backup -h 查看支持的資源篩選參數。

velero backup create <BACKUP-NAME> --exclude-namespaces <NAMESPACE>

本示例咱們建立一個 「default-all」 的集羣備份,備份過程以下圖所示:

img

備份任務狀態顯示是 「Completed」 時,說明備份任務完成,能夠經過 velero backup logs | grep error 命令檢查是否有備份操做發生錯誤,沒有輸出則說明備份過程無錯誤發生,以下圖所示:

注意:請確保備份過程未發生任何錯誤,假如 velero 在執行備份過程當中發生錯誤,請排查解決後從新執行備份。

img

備份完成後,臨時將備份存儲位置更新爲只讀模式(非必須,這能夠防止在還原過程當中 Velero 在備份存儲位置中建立或刪除備份對象):

kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'

在集羣 B 執行還原

在執行還原操做前集羣 B 中 default 、default2 命名空間下沒有任何工做負載資源,查看結果以下圖:

img

臨時將集羣 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>

本示例執行還原過程以下圖:

img

等待還原任務完成後查看還原日誌, 可使用下面命令查看還原是否有報錯和跳過信息:

# 查看遷移時是否有錯誤的還原信息
velero restore logs <BACKUP-NAME> | grep error 

# 查看遷移時跳過的還原操做
velero restore logs <BACKUP-NAME> | grep skip

從下圖能夠看出沒有發生錯誤的還原步驟,可是有不少 「skipped」 步驟,是由於咱們在備份集羣資源時備份了不包含 velero 命名空間的全部集羣資源,有一些同類型同名的集羣資源已經存在了,如 kube-system下的集羣資源,當還原過程當中有資源衝突時,velero 會跳過還原的操做步驟。因此實際上還原過程是正常的,能夠忽略這些 「skipped」 日誌,假若有特殊狀況能夠分析下日誌看看。

img

遷移結果核驗

查看校驗集羣 B 執行遷移操做後的集羣資源,能夠看到 default 、default2 命名空間下的 pods 和 PVC 資源已按預期遷移成功:

img

再經過 Web 管理頁面登陸集羣 B 中的 monio 服務,能夠看到 minio 服務中的圖片數據沒有丟失,說明持久卷數據也已按預期遷移成功。

img

至此,咱們完成了 TKE 集羣間資源的遷移,遷移操做完成後,請不要忘記把備份存儲位置恢復爲讀寫模式(集羣 A 和 集羣B),以便下次備份任務能夠成功使用:

kubectl patch backupstoragelocation default --namespace velero \
   --type merge \
   --patch '{"spec":{"accessMode":"ReadWrite"}}'

總結

本文主要介紹了在 TKE 集羣間使用 Velero 遷移集羣資源的原理、注意事項和操做方法,成功的將示例集羣 A 中的集羣資源無縫遷移到集羣 B 中,整個遷移過程很是簡單方便,是一種很是友好的集羣資源遷移方案。

【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公衆號,及時獲取更多幹貨!!

相關文章
相關標籤/搜索