Skip to content
Open Source

備份叢集並從備份還原

設定 Velero 的 S3 存放位置與排程,確認備份結果,並從備份還原專案。

打開 叢集 → 備份,先設定 備份存放位置,再設定 排程。按 立即備份 跑一次,等 備份紀錄 顯示 成功,就確定備份能用了。

叢集備份由 Velero 執行,把選定 Namespace 的 Kubernetes 物件和磁碟區裡的檔案存到 S3 相容儲存。PostgreSQL、MongoDB 這類資料庫有自己的備份,在各資料庫的 備份 分頁設定,見部署資料庫。只想備份單一服務的磁碟區,可以用 K8up 磁碟區備份。

  • 叢集裝了 Velero。畫面顯示 備份需要 Velero 時,按 安裝 Velero,照安裝元件裝好。
  • 準備 S3 相容的儲存貯體、端點和金鑰,或先在同一頁上方的 S3 目的地 登錄,見 S3 目的地。
  • 你能在 Velero 的 Namespace 讀取和建立備份位置、排程、備份、還原和 Secret。Zeabur Chart 的成員角色沒有 Velero 的權限,通常要用管理員帳號操作。

在 備份存放位置 按 設定 或 編輯。已登錄 S3 目的地時,S3 目的地 選單預設選第一個,表單會帶入它的位置和金鑰。要自己填,改選 手動輸入。

手動輸入時填 儲存貯體、存取金鑰 ID 和 私密存取金鑰。用 AWS S3 時 端點 留白,R2、B2 或 MinIO 填它們的 S3 位址。區域 留白時是 us-east-1。資料夾 選填,可以讓這些備份和其他檔案分開。

編輯既有設定時,兩個金鑰都留白就沿用目前的金鑰。要換就兩個一起填。

按 檢查變更,確認儲存貯體、端點,以及要新增或修改的備份位置和儲存金鑰,再套用。

回到 備份存放位置,等 狀態 從 尚未檢查 變成 可連線。顯示 無法連線 時,先核對儲存貯體、端點和金鑰,再設定排程。

  1. 在 排程 選每天執行的 時間(UTC 整點)和 保留天數。新排程預設每天 03:00(UTC)、保留 7 天。保留天數可填 1 到 365。

  2. 在 範圍 選 整個叢集,或選 選定的專案 並至少勾一個專案。整個叢集 也包括之後新增的專案和 Namespace。

  3. 按 檢查變更,確認執行時間和範圍後套用。Zeabur 會建立或修改名為 zeabur 的 Velero Schedule,並開啟磁碟區檔案備份。

  4. 按 立即備份,檢查後套用。這次備份照剛設定的範圍和保留天數執行,不用等排程。

  5. 在 備份紀錄 找到這筆,等狀態從 執行中 變成 成功,再看紀錄列出的項目數和 保留到 的日期。

在 Zeabur 以外建立的排程會標示 在 Zeabur 以外設定,要回到原本建立的地方修改。

還原分三步:先還原專案,檢查服務和資料,最後接回網域。原專案還在時,備份會另存成一個新專案,原專案照常執行。原專案已經刪除時,備份用原本的名稱還原。兩種還原都不帶網域,等你確認專案沒問題,再把網域接回來。

  1. 在 備份紀錄 找到要用的備份,按該列的還原按鈕。按鈕名稱跟著備份裡的專案變:

    • 從備份建立新專案:備份選定的專案都還在。
    • 還原已刪除的專案:備份選定的專案都已經刪除。
    • 還原專案:備份整個叢集,或選定的專案有些還在、有些已刪除。
  2. 在 要還原的專案 選一個專案。選項是這份備份選定的專案;備份整個叢集時,選項是目前的專案,加上備份裡已經刪除的專案,後面標 (已刪除)。Zeabur 要下載備份才知道有哪些已刪除的專案,表單會先顯示「正在找備份裡已刪除的專案…」。

    • 原專案還在:新專案名稱 會帶入一個新名稱,可以改。
    • 原專案已經刪除:畫面會說明它會用原本的名稱還原。
  3. 按 檢查變更,確認內容。清單讀自備份本身,跟現在的專案無關:

    • 備份裡的網域不會跟著還原。Ingress、HTTPRoute 和 cert-manager 的憑證都不還原,網域在最後一步接回,憑證到時重新申請。
    • 另存成新專案時,備份裡的排程工作會先暫停,避免同一件事在兩個專案各跑一次。用原名稱還原時,排程工作照常執行。
    • 另存成新專案時,畫面會列出備份裡的服務和機密。寫著 <服務>.<原專案>.svc 的值還是連到原專案,還原後用 改寫位址 改掉。
    • 另存成新專案時,畫面會顯示節點資源夠不夠兩個專案同時執行。自動部署和 Git webhook 還是送到原專案。

    原專案還在時按 從備份建立新專案,已經刪除時按 還原。

  4. 套用後 Velero 馬上開始。到 還原紀錄 看這筆的狀態、來源備份、錯誤和警告數。

還原完成後,該筆紀錄下方會出現 開啟專案 和 接回網域,另存成新專案時還有 改寫位址。

  1. 按 開啟專案,確認服務的副本都就緒、磁碟區掛上且資料正確。用資料庫自己備份的資料,照該資料庫的還原步驟處理。
  2. 另存成新專案時,按 改寫位址,把指向原專案的服務位址改成新專案。
  3. 確認新專案沒問題後,到每個排程工作按 恢復。

Velero 會略過已經存在的同名物件。另存成新專案後,原專案會繼續保留,不需要時自己刪除。

按 接回網域。Zeabur 從備份讀出這個專案的網域,再檢查叢集裡有沒有其他專案正在使用。

  • 沒有其他專案在用:套用後 Velero 只還原這些路由,還原紀錄 會多一筆「網域接回」。cert-manager 會重新申請憑證。

  • 原專案還在用:這次不能套用。畫面會指出是哪個專案在用,例如原專案是 blog 時,按 從 blog 移動網域,把網域從 blog 移到新專案。

把備份 zeabur-20261020030000 裡的 blog 另存成 blog-restored:先建立暫停排程工作的 ConfigMap(Velero 的 resource modifier),再建立 Restore,兩個都在 velero Namespace。ConfigMap 的 namespaces 填備份裡原本的 blog。

apiVersion: v1
kind: ConfigMap
metadata:
name: blog-restored
namespace: velero
data:
cronjobs.yaml: |
version: v1
resourceModifierRules:
- conditions:
groupResource: cronjobs.batch
namespaces:
- blog
patches:
- operation: add
path: /spec/suspend
value: "true"
---
apiVersion: velero.io/v1
kind: Restore
metadata:
name: blog-restored
namespace: velero
spec:
backupName: zeabur-20261020030000
includedNamespaces:
- blog
namespaceMapping:
blog: blog-restored
excludedResources:
- ingresses.networking.k8s.io
- httproutes.gateway.networking.k8s.io
- certificates.cert-manager.io
- certificaterequests.cert-manager.io
- orders.acme.cert-manager.io
- challenges.acme.cert-manager.io
resourceModifier:
kind: ConfigMap
name: blog-restored

用原名稱還原時,拿掉 namespaceMapping 和 resourceModifier,也不用建立 ConfigMap。Zeabur 建立的 ConfigMap 會把 Restore 設為擁有者,刪除 Restore 時一起刪除;自己建立的要在還原完成後用 kubectl -n velero delete configmap blog-restored 刪掉。

確認專案後,用 kubectl get ingress -A 確認沒有其他專案在用同一個網域,再建立只還原路由的 Restore:

apiVersion: velero.io/v1
kind: Restore
metadata:
name: blog-restored-domains
namespace: velero
spec:
backupName: zeabur-20261020030000
includedNamespaces:
- blog
namespaceMapping:
blog: blog-restored
includedResources:
- ingresses.networking.k8s.io
- httproutes.gateway.networking.k8s.io

恢復排程工作:

kubectl -n blog-restored patch cronjob <名稱> -p '{"spec":{"suspend":false}}'

Velero 把 Kubernetes 物件照原樣放進備份,Secret 也在裡面,值只是任何人都能解碼的 base64。從 Zeabur Catalog 安裝 Velero 時,會在 velero Namespace 產生兩把隨機金鑰:

Secret 與欄位用途
velero-repo-credentials 的 repository-passwordKopia 在上傳前用它加密磁碟區裡的檔案。
velero-backup-key 的 key(32 個字元)存放位置設定 customerKeyEncryptionSecret: velero-backup-key/key,儲存服務用它加密每個物件,包括物件清單和 Secret(SSE-C)。

在 叢集 → 備份 新增存放位置時,Zeabur 也會設定 customerKeyEncryptionSecret。velero-backup-key 不存在就建立一把,已經有的不會換掉。既有的存放位置維持原樣,之前沒用金鑰的備份照樣讀得到。

SSE-C 每次請求都把金鑰交給儲存服務,由它加密後再存,所以端點要用 HTTPS。SeaweedFS、AWS S3、Cloudflare R2 和 Backblaze B2 支援 SSE-C,MinIO 只在 HTTPS 下接受。不支援的儲存服務會拒絕上傳,備份就會失敗。

kubectl -n velero get secret velero-repo-credentials velero-backup-key -o yaml > velero-keys.yaml

還原到新叢集時,先建立這兩個 Secret,再安裝 Velero,指向同一個儲存貯體。

第一次備份完成後,只用儲存貯體的存取金鑰、不帶 SSE-C 金鑰,下載 backups/<備份名稱>/velero-backup.json。儲存服務應該拒絕,例如 SeaweedFS 回 InvalidArgument,要求提供 customer key。下載得到內容,就表示這個儲存服務沒有加密。

Velero 不是從 Catalog 安裝時,叢集裡可能沒有 velero-repo-credentials。這時 Velero 會自己用公開的預設密碼 static-passw0rd 建立它,而 Kopia 儲存庫會一直沿用建立時的密碼。這種叢集要把存放位置的 資料夾 換成新的,讓 Kopia 用新密碼建立儲存庫。加入 SSE-C 之前的備份不會被加密,到期刪除後就不留明文。

磁碟區備份使用 restic,上傳前用 Zeabur 產生的 <claim>-backup Secret 裡的 RESTIC_PASSWORD(24 個隨機字元)加密。CloudNativePG 的資料庫備份只壓縮、不加密,儲存貯體裡讀得到資料列(沒有 Secret 的值)。資料庫備份要放在有伺服器端加密的儲存貯體,存取金鑰只給叢集使用。

  • 無法連線:核對儲存貯體、端點、區域和金鑰,並看位置下方 Velero 的訊息。
  • 連線成功但備份失敗,儲存服務拒絕上傳:確認它支援 SSE-C,端點也用 HTTPS,見備份的加密。
  • 沒有 立即備份:要先有 Zeabur 建立的排程,而排程要先有存放位置。
  • 還原按鈕(從備份建立新專案、還原已刪除的專案 或 還原專案)無法使用:你不能在 Velero 的 Namespace 建立 Restore。還原時 Velero 用自己的權限寫入物件,所以只有管理員能還原,見權限。請管理員用管理員帳號還原。
  • 部分失敗:有些物件或磁碟區檔案沒有複製到,其餘的已存好。用 velero backup describe <backup> --details 查看失敗的項目,處理後再備份一次。
  • 畫面說備份途中 Velero 重新啟動:下一次會照排程執行,也可以按 立即備份 補一次。
  • 磁碟區 顯示 只備份物件,不複製磁碟區裡的檔案:這是在 Zeabur 以外建立的排程,要到原本的設定開啟 defaultVolumesToFsBackup。
  • 變更已過期:重新 檢查變更。

在 排程 按 暫停,檢查後套用,之後就不會再備份。按 繼續 恢復。已有的備份和存放位置都會保留,備份照各自的 保留到 日期到期。

Zeabur 沒有刪除備份或排程的操作。要馬上刪掉,用 velero backup delete 或 velero schedule delete。移除 S3 目的地 只會刪掉目的地本身,已經複製到 Velero 的金鑰、排程和 S3 裡的備份都會留著。