Velero(之前稱爲Heptio Ark)是一個開源工具,能夠安全地備份和還原,執行災難恢復以及遷移 Kubernetes 羣集資源和持久卷,能夠在 TKE 集羣或自建 Kubernetes 集羣中部署 Velero 用於:數據庫
更多關於 Velero 介紹,請參閱 Velero 官網,本文將介紹使用 Velero 實現 TKE 集羣間的無縫遷移複製集羣資源的操做步驟。後端
在須要被遷移的集羣和目標集羣上都安裝 Velero 實例,而且兩個集羣的 Velero 實例指向相同的騰訊雲 COS 對象存儲位置,使用 Velero 在須要被遷移的集羣執行備份操做生成備份數據存儲到騰訊雲 COS ,而後在目標集羣上使用 Velero 執行數據的還原操做實現遷移,遷移原理以下:安全
從 1.5 版本開始,Velero 可使用 Restic 備份全部pod卷,而沒必要單獨註釋每一個 pod。默認狀況下,此功能容許用戶使用 restic 備份全部 pod 卷,但如下卷狀況除外:工具
Service Account Secret
的卷hostPath
類型卷secrets
和 configmaps
的卷本示例須要 Velero 1.5 以上版本且啓用 restic 來備份持久卷數據,請確保在安裝 Velero 階段開啓 --use-restic
和 --default-volumes-to-restic
參數,安裝步驟請參閱 配置存儲和安裝 Velero 。測試
在執行遷移過程當中,請不要對兩邊集羣資源作任何 CRUD 操做,以避免在遷移過程當中形成數據差別,最終致使遷移後的數據不一致。spa
儘可能保證集羣 B 和集羣 A 工做節點的CPU、內存等規格配置相同或不要相差太大,以避免出現遷移後的 Pods 因資源緣由沒法調度致使 Pending 的狀況。rest
能夠手動執行備份操做,也能夠給 velero 設置按期自動備份,設置方法可使用 velero schedule -h
查看。本示例將以 default 、default2 命名空間的資源狀況做比較驗證,下圖能夠看到集羣 A 中兩個命名空間下的 Pods 和 PVC 資源狀況:日誌
提示:能夠指定在備份期間執行一些自定義 Hook 操做。好比,須要在備份以前將運行應用程序的內存中的數據持久化到磁盤。 有關備份 Hook 的更多信息請參閱 備份 Hook 。code
其中,集羣中的 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 中 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 中,整個遷移過程很是簡單方便,是一種很是友好的集羣資源遷移方案。
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公衆號,及時獲取更多幹貨!!