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

騰訊雲原生發表於2021-02-23

概述

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 操作,以免在遷移過程中造成資料差異,最終導致遷移後的資料不一致。

  3. 儘量保證叢集 B 和叢集 A 工作節點的CPU、記憶體等規格配置相同或不要相差太大,以免出現遷移後的 Pods 因資源原因無法排程導致 Pending 的情況。

操作步驟

在叢集 A 建立備份

可以手動執行備份操作,也可以給 velero 設定定期自動備份,設定方法可以使用 velero schedule -h 檢視。本示例將以 default 、default2 名稱空間的資源情況作比較驗證,下圖可以看到叢集 A 中兩個名稱空間下的 Pods 和 PVC 資源情況:

提示:可以指定在備份期間執行一些自定義 Hook 操作。比如,需要在備份之前將執行應用程式的記憶體中的資料持久化到磁碟。 有關備份 Hook 的更多資訊請參閱 備份 Hook

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 中,整個遷移過程非常簡單方便,是一種非常友好的叢集資源遷移方案。

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

相關文章