內容目錄
開源 Velero Kubernetes 災難復原與備份方案指南
1. 什麼是 Velero?
Velero(以前稱為 Heptio Ark)是一個開源工具,專門設計用於安全地備份和還原 Kubernetes 集群資源和持久卷 (Persistent Volumes, PVs)。它在 Kubernetes 社區中被廣泛視為備份解決方案的黃金標準。
為什麼需要 Velero?Kubernetes 本身沒有備份嗎?
Kubernetes 的核心組件 etcd 存儲了集群的狀態數據。雖然你可以對 etcd 進行快照備份,但這通常是「全有或全無」的。而且,etcd 備份不包含您的應用程序數據(存儲在 PV 中的數據)。
Velero 解決了以下關鍵痛點:
-
顆粒度備份: 可以選擇備份整個集群、特定的命名空間 (Namespace)、或帶有特定標籤的資源。
-
數據備份: 除了備份 YAML 配置 (Kubernetes Objects),還能備份持久卷中的實際數據。
-
集群遷移: 輕鬆將應用程序從一個集群遷移到另一個集群(例如:從本地遷移到雲端,或跨雲遷移)。
-
災難復原: 在集群發生災難性故障或人為錯誤(例如誤刪命名空間)時快速恢復。
2. Velero 的工作原理與架構
理解 Velero 的架構有助於更好地配置和使用它。
Velero 由兩部分組成:
-
Velero CLI (客戶端): 一個運行在您本地機器上的命令行工具,用於發送備份/還原指令。
-
Velero Server (服務端): 運行在 Kubernetes 集群中的 Deployment (包含 Controller)。
核心運作流程:
-
對象存儲 (Object Storage): Velero 需要一個外部的 S3 兼容對象存儲桶 (Bucket) 來存放備份文件 (如 AWS S3, Google GCS, Azure Blob, MinIO 等)。
-
備份過程:
-
當你發起備份命令時,Velero Server 會查詢 Kubernetes API Server以獲取資源信息。
-
它將這些資源打包成一個 tar 文件。
-
如果有 Persistent Volumes (PV),Velero 會調用雲端提供商的 API 來創建磁碟快照 (Snapshot),或者使用集成的文件系統備份工具 (如 Kopia/Restic) 來備份數據。
-
最後,將 tar 文件和快照元數據上傳到對象存儲桶。
-
-
還原過程:
-
Velero 從對象存儲下載備份文件。
-
它解析 tar 文件並開始在 Kubernetes 中重新創建資源(Deployment, Service, PVC 等)。
-
如果有 PVC,它會根據快照創建新的 PV 並掛載。
-
3. 關鍵概念解析
在開始之前,需要理解兩個備份數據的關鍵方式:
A. 原生雲端快照 (Native Cloud Snapshots)
如果您的集群運行在 AWS (EBS)、GCP (PD) 或 Azure (Managed Disks) 上,Velero 會使用相應的雲端插件 (Plugin)。
-
優點: 速度快、效率高,通常是增量備份。
-
缺點: 依賴於特定的雲端平台。
B. 文件系統備份 (File System Backup - 舊稱 Restic/現主要用 Kopia)
對於不支持原生快照的存儲類型(例如 NFS, HostPath, Longhorn 等),Velero 使用集成的開源工具(目前推薦 Kopia,舊版本使用 Restic)在 Pod 級別掃描文件系統並備份數據。
-
優點: 通用,適用於任何類型的存儲。
-
缺點: 對於大量小文件或超大數據集,速度可能比原生快照慢,且會消耗集群的 CPU/內存資源。
-
注意:要使用此功能,您需要讓 Velero 安裝一個 DaemonSet,在每個節點上運行代理來訪問 PV 數據。
kubectl create secret generic cloud-credentials \\ --from-file yourgcp-ce75eedeb64c.json
helm repo add vmware-tanzu <https://vmware-tanzu.github.io/helm-charts> helm pull vmware-tanzu/velero tar -xzf velero-*.tgz cd velero
configuration: backupStorageLocation: - name: provider: velero.io/gcp bucket: velero-yb accessMode: ReadWrite credential: name: cloud-credentials key: yourgcp-ce75eedeb64c.json volumeSnapshotLocation: - name: velero-volumesnapshot provider: gcp #這個要開才能volumeSnapshot features: EnableCSI
設定排程備份
schedules: volumesnapshot: disabled: false schedule: "0 * * * *" useOwnerReferencesInBackup: false paused: false template: includedNamespaces: - default ttl: "240h" storageLocation: default snapshotVolumes: true volumeSnapshotLocations: - velero-volumesnapshot
helm install velero ../velero -f values.yaml
helm upgrade velero ../velero -f values.yaml
velero get scdhedule
velero get backup -n default
velero backup create test-redis -n default
velero restore create --from-backup test-redis -n default