備份叢集並從備份還原
設定 Velero 的 S3 存放位置與排程,確認備份結果,並從備份還原專案。
打開 叢集 → 備份,先設定 備份存放位置,再設定 排程。按 立即備份 跑一次,等 備份紀錄 顯示 成功,就確定備份能用了。
叢集備份由 Velero 執行,把選定 Namespace 的 Kubernetes 物件和磁碟區裡的檔案存到 S3 相容儲存。PostgreSQL、MongoDB 這類資料庫有自己的備份,在各資料庫的 備份 分頁設定,見部署資料庫。只想備份單一服務的磁碟區,可以用 K8up 磁碟區備份。
- 叢集裝了 Velero。畫面顯示 備份需要 Velero 時,按 安裝 Velero,照安裝元件裝好。
- 準備 S3 相容的儲存貯體、端點和金鑰,或先在同一頁上方的 S3 目的地 登錄,見 S3 目的地。
- 你能在 Velero 的 Namespace 讀取和建立備份位置、排程、備份、還原和 Secret。Zeabur Chart 的成員角色沒有 Velero 的權限,通常要用管理員帳號操作。
設定存放位置
Section titled “設定存放位置”選擇儲存貯體
Section titled “選擇儲存貯體”在 備份存放位置 按 設定 或 編輯。已登錄 S3 目的地時,S3 目的地 選單預設選第一個,表單會帶入它的位置和金鑰。要自己填,改選 手動輸入。
手動輸入時填 儲存貯體、存取金鑰 ID 和 私密存取金鑰。用 AWS S3 時 端點 留白,R2、B2 或 MinIO 填它們的 S3 位址。區域 留白時是 us-east-1。資料夾 選填,可以讓這些備份和其他檔案分開。
編輯既有設定時,兩個金鑰都留白就沿用目前的金鑰。要換就兩個一起填。
檢查並等待連線結果
Section titled “檢查並等待連線結果”按 檢查變更,確認儲存貯體、端點,以及要新增或修改的備份位置和儲存金鑰,再套用。
回到 備份存放位置,等 狀態 從 尚未檢查 變成 可連線。顯示 無法連線 時,先核對儲存貯體、端點和金鑰,再設定排程。
設定排程並跑一次備份
Section titled “設定排程並跑一次備份”-
在 排程 選每天執行的 時間(UTC 整點)和 保留天數。新排程預設每天 03:00(UTC)、保留 7 天。保留天數可填 1 到 365。
-
在 範圍 選 整個叢集,或選 選定的專案 並至少勾一個專案。整個叢集 也包括之後新增的專案和 Namespace。
-
按 檢查變更,確認執行時間和範圍後套用。Zeabur 會建立或修改名為
zeabur的 Velero Schedule,並開啟磁碟區檔案備份。 -
按 立即備份,檢查後套用。這次備份照剛設定的範圍和保留天數執行,不用等排程。
-
在 備份紀錄 找到這筆,等狀態從 執行中 變成 成功,再看紀錄列出的項目數和 保留到 的日期。
在 Zeabur 以外建立的排程會標示 在 Zeabur 以外設定,要回到原本建立的地方修改。
還原分三步:先還原專案,檢查服務和資料,最後接回網域。原專案還在時,備份會另存成一個新專案,原專案照常執行。原專案已經刪除時,備份用原本的名稱還原。兩種還原都不帶網域,等你確認專案沒問題,再把網域接回來。
選擇專案並檢查
Section titled “選擇專案並檢查”-
在 備份紀錄 找到要用的備份,按該列的還原按鈕。按鈕名稱跟著備份裡的專案變:
- 從備份建立新專案:備份選定的專案都還在。
- 還原已刪除的專案:備份選定的專案都已經刪除。
- 還原專案:備份整個叢集,或選定的專案有些還在、有些已刪除。
-
在 要還原的專案 選一個專案。選項是這份備份選定的專案;備份整個叢集時,選項是目前的專案,加上備份裡已經刪除的專案,後面標 (已刪除)。Zeabur 要下載備份才知道有哪些已刪除的專案,表單會先顯示「正在找備份裡已刪除的專案…」。
- 原專案還在:新專案名稱 會帶入一個新名稱,可以改。
- 原專案已經刪除:畫面會說明它會用原本的名稱還原。
-
按 檢查變更,確認內容。清單讀自備份本身,跟現在的專案無關:
- 備份裡的網域不會跟著還原。Ingress、HTTPRoute 和 cert-manager 的憑證都不還原,網域在最後一步接回,憑證到時重新申請。
- 另存成新專案時,備份裡的排程工作會先暫停,避免同一件事在兩個專案各跑一次。用原名稱還原時,排程工作照常執行。
- 另存成新專案時,畫面會列出備份裡的服務和機密。寫著
<服務>.<原專案>.svc的值還是連到原專案,還原後用 改寫位址 改掉。 - 另存成新專案時,畫面會顯示節點資源夠不夠兩個專案同時執行。自動部署和 Git webhook 還是送到原專案。
原專案還在時按 從備份建立新專案,已經刪除時按 還原。
-
套用後 Velero 馬上開始。到 還原紀錄 看這筆的狀態、來源備份、錯誤和警告數。
還原完成後,該筆紀錄下方會出現 開啟專案 和 接回網域,另存成新專案時還有 改寫位址。
- 按 開啟專案,確認服務的副本都就緒、磁碟區掛上且資料正確。用資料庫自己備份的資料,照該資料庫的還原步驟處理。
- 另存成新專案時,按 改寫位址,把指向原專案的服務位址改成新專案。
- 確認新專案沒問題後,到每個排程工作按 恢復。
Velero 會略過已經存在的同名物件。另存成新專案後,原專案會繼續保留,不需要時自己刪除。
按 接回網域。Zeabur 從備份讀出這個專案的網域,再檢查叢集裡有沒有其他專案正在使用。
-
沒有其他專案在用:套用後 Velero 只還原這些路由,還原紀錄 會多一筆「網域接回」。cert-manager 會重新申請憑證。
-
原專案還在用:這次不能套用。畫面會指出是哪個專案在用,例如原專案是
blog時,按 從 blog 移動網域,把網域從blog移到新專案。
用 kubectl 做同樣的事
Section titled “用 kubectl 做同樣的事”把備份 zeabur-20261020030000 裡的 blog 另存成 blog-restored:先建立暫停排程工作的 ConfigMap(Velero 的 resource modifier),再建立 Restore,兩個都在 velero Namespace。ConfigMap 的 namespaces 填備份裡原本的 blog。
apiVersion: v1kind: ConfigMapmetadata: name: blog-restored namespace: velerodata: cronjobs.yaml: | version: v1 resourceModifierRules: - conditions: groupResource: cronjobs.batch namespaces: - blog patches: - operation: add path: /spec/suspend value: "true"---apiVersion: velero.io/v1kind: Restoremetadata: name: blog-restored namespace: velerospec: 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/v1kind: Restoremetadata: name: blog-restored-domains namespace: velerospec: 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-password | Kopia 在上傳前用它加密磁碟區裡的檔案。 |
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 下接受。不支援的儲存服務會拒絕上傳,備份就會失敗。
把金鑰另存到叢集外
Section titled “把金鑰另存到叢集外”kubectl -n velero get secret velero-repo-credentials velero-backup-key -o yaml > velero-keys.yaml還原到新叢集時,先建立這兩個 Secret,再安裝 Velero,指向同一個儲存貯體。
確認儲存服務真的要求金鑰
Section titled “確認儲存服務真的要求金鑰”第一次備份完成後,只用儲存貯體的存取金鑰、不帶 SSE-C 金鑰,下載 backups/<備份名稱>/velero-backup.json。儲存服務應該拒絕,例如 SeaweedFS 回 InvalidArgument,要求提供 customer key。下載得到內容,就表示這個儲存服務沒有加密。
之前就裝了 Velero
Section titled “之前就裝了 Velero”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 裡的備份都會留著。