在 Kubernetes(K8s)中,備份和恢復是保障數據安全與業務連續性的關鍵環節,主要方式包括?ETCD 備份恢復?和?Velero 備份恢復,兩者在備份粒度、恢復影響范圍、存儲位置等方面存在以下差異:
1、ETCD 備份恢復:ETCD 是 K8s 集群的分布式鍵值存儲系統,保存著所有資源對象(如 Pod、Service、ConfigMap 等)的配置數據。備份 ETCD 即備份集群的全局狀態。
2、Velero 備份恢復:Velero 是專為 K8s 設計的云原生備份恢復工具,支持備份資源對象(如 Deployment、PVC)和持久化卷(PV)數據,存儲至對象存儲(如阿里云 OSS、S3、MinIO)。
差異對比:
對比維度 | etcd 備份 | Velero |
---|---|---|
備份層級 | 集群級(底層存儲) | 應用級(API 對象) |
備份內容 | 所有 Kubernetes 資源的元數據(存儲在 etcd 中) | Kubernetes 資源(Deployment、Service、PV 等) +?持久卷(PV)中的實際數據(通過 Restic/CSI) |
是否備份 PV 數據 | ? 不備份 | ? 支持(Restic 或 CSI 插件) |
備份粒度 | 全量備份(整個集群) | ? 支持按命名空間、標簽、資源類型進行選擇性備份 |
恢復粒度 | 全量恢復(覆蓋整個集群) | ? 支持選擇性恢復(如只恢復某個命名空間或 Deployment) |
跨集群恢復 | ? 困難(需相同架構、證書、IP 等) | ? 支持跨集群、跨云、跨 Kubernetes 版本遷移 |
恢復影響 | 恢復即覆蓋,影響所有服務 | 可僅恢復部分資源,不影響其他服務 |
備份目標 | 本地磁盤、NFS、S3 兼容存儲 | OSS、S3、MinIO、Azure Blob、GCS 等對象存儲 |
是否影響運行中集群 | 備份時建議暫停 API Server(或使用快照) | ? 無影響,備份在運行時進行 |
適用場景 | 集群完全崩潰后的“終極恢復” | 日常備份、災難恢復、跨集群遷移、CI/CD 回滾 |
部署復雜度 | 無需額外部署 | 需部署 Velero Server 和插件 |
推薦用途 | “最后一道保險” | “日常防護 + 快速恢復” |
本文主要是基于Velero + 阿里云 OSS 完整部署文檔:使用 Velero 為 Kubernetes 集群創建備份,并將備份數據安全存儲到阿里云對象存儲服務 (OSS)。
一、下載 Velero CLI
需要訪問githup,如果下載不了可以使用此鏈接,下載后上傳至服務器。
velero-v1.13.0-linux-amd64.tar.gz提取碼:vo66
# 下載指定版本(以 v1.13.0 為例,支持 amd64)
wget https://github.com/vmware-tanzu/velero/releases/download/v1.13.0/velero-v1.13.0-linux-amd64.tar.gz# 解壓
tar -xvzf velero-v1.13.0-linux-amd64.tar.gz# 將 velero 二進制文件移動到 /usr/local/bin(需要 sudo 權限)
sudo mv velero-v1.13.0-linux-amd64/velero /usr/local/bin/velero# 驗證安裝
velero version
如圖:
二、部署 Velero 服務端
📋 前提條件
確保?kubectl
已配置好集群訪問(~/.kube/config
正確)Velero CLI 會自動讀取 kubectl
的配置來連接集群
準備阿里云 oss 獲取的?AccessKey ID
?和?AccessKey Secret
已創建 Bucket(例如:velero-bakup
)。
位于目標區域(例如:cn-hangzhou
)。
1、將 AccessKey 信息保存為本地文件 credentials-velero
,格式如下:
#注意前后空格
[default]
aws_access_key_id = <您的AccessKey ID>
aws_secret_access_key = <您的AccessKey ID>
1、安裝 Velero??
velero install
?命令
注:使用 velero-plugin-for-aws:v1.3.0
插件,并設置 s3ForcePathStyle=false
。
#velero install 命令是 velero CLI 工具自帶的核心功能。是一個高度封裝的、面向用戶的“一鍵式”安裝工具,它內部實際上就是生成 Kubernetes 資源清單(YAML)并調用 kubectl 應用到集群中velero install \--image registry.aliyuncs.com/elvin/velero:v1.13.2 \--plugins velero/velero-plugin-for-aws:v1.3.0 \--provider aws \--bucket 你創建的bucket \--prefix Bucket內的備份目錄 \--secret-file ./credentials-velero \--use-node-agent \--use-volume-snapshots=false \--backup-location-config region=cn-hangzhou,s3ForcePathStyle=false,s3Url=https://oss-cn-hangzhou.aliyuncs.com \--wait
參數說明:
--image
: Velero 服務器鏡像。--plugins
:?關鍵!?使用?v1.3.0
?版本插件以避免?aws-chunked
?問題。--provider aws
: 雖然對接 OSS,但使用 AWS 兼容模式。--bucket
: 您的 OSS Bucket 名稱。--prefix
: Bucket內的備份目錄。--secret-file
: 包含 AccessKey 的文件。--use-node-agent
: 啟用節點代理進行更高效的備份。--use-volume-snapshots=false
: 禁用云平臺快照(除非您配置了 CSI Snapshot)。--backup-location-config
: 配置 OSS 終端節點。region
: OSS Bucket 所在區域。s3ForcePathStyle=false
:?至關重要!使用路徑式訪問 (https://oss-cn-hangzhou.aliyuncs.com/opple-road-bak/...
),避免虛擬托管式域名 (https://opple-road-bak.oss-cn-hangzhou.aliyuncs.com
) 帶來的?SecondLevelDomainForbidden
?錯誤。s3Url
: OSS 的外網或內網 Endpoint。
2、驗證
#查看Velero 的 Kubernetes Pod 是否成功創建、調度并處于 Running 狀態
kubectl get pod -n velero #查看客戶端 (CLI) 和服務器端 (Server) 整體連通性和基本健康狀態
velero version#查看Velero 的 Backup Storage Location (BSL) 是否被正確配置,并且 Velero 服務端能否成功連接到 OSS Bucket
velero get backup-location
?手動創建一個備份:
#驗證 Velero 備份功能是否真正,創建一個名為 nacos-test1 的備份,只備份nacos這一個命名空間
velero backup create nacos-test1 --include-namespaces nacos --wait
提示 Backup completed with status: Completed. 備份成功,在阿里云上可以查看
三、備份與恢復
功能 | 命令 |
---|---|
查看備份 | velero backup get |
查看恢復 | velero restore get |
查看定時任務 | velero schedule get |
創建備份 | velero backup create NAME --include-namespaces NS |
恢復備份 | velero restore create NAME --from-backup BACKUP |
查看詳情 | velero backup/restore describe NAME |
查看日志 | velero backup/restore logs NAME |
使用?Schedule
?定時備份()
如果期望定期備份某個命名空間,使用用定時任務
#每天凌晨 2 點自動備份 test 命名空間下的所有資源,并使用 Restic 備份持久卷(PV)數據
velero schedule create test-daily \--schedule="0 2 * * *" \--include-namespaces test \--use-restic
這樣每天會自動創建類似這樣的備份:
test-daily-20250829020001
test-daily-20250830020001
# 刪除定時任務
velero schedule delete test-daily --confirm# 查看某個定時任務詳情
velero schedule describe test-daily
四、卸載重新部署
velero uninstall --wait
五、踩坑記錄
以下是我在部署過程中遇到的所有典型錯誤、日志和對應的解決方案。
? 問題 1:?SecondLevelDomainForbidden
?- 虛擬托管式域名被禁用
🔍 錯誤日志
api error SecondLevelDomainForbidden: Please use virtual hosted style to access.
📌 錯誤原因
阿里云 OSS 的部分 Bucket(尤其是新創建或啟用了特定功能的 Bucket)強制要求使用虛擬主機風格(Virtual Hosted-Style)訪問。
若配置中設置了 s3ForcePathStyle=true
,則 SDK 會使用路徑風格(Path-Style)請求,導致被拒絕。
- 路徑風格(Path-Style)示例:
https://oss-cn-hangzhou.aliyuncs.com/my-bucket/path/to/object
- 虛擬主機風格(Virtual Hosted-Style)示例:
https://my-bucket.oss-cn-hangzhou.aliyuncs.com/path/to/object
? 解決方案
將 s3ForcePathStyle
設置為 false
,允許 SDK 使用虛擬主機風格訪問 OSS。
?? 注意:Bucket 名稱必須全局唯一,且不能包含大寫字母或特殊字符。
? 問題 2:?InvalidArgument
?- 不支持?aws-chunked
?編碼
error="rpc error: code = Unknown desc = InvalidArgument: null
status code: 400, request id: ..., host id: ...
The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256."
x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD
📌 原因分析
- 使用了基于?AWS SDK for Go v2?的?
velero-plugin-for-aws
?插件(如?v1.9.2
)。 - 該 SDK 在上傳大文件時使用?
aws-chunked
?流式編碼(即?STREAMING-AWS4-HMAC-SHA256-PAYLOAD
)。 - 阿里云 OSS 不支持?
aws-chunked
?編碼,因此返回?400 InvalidArgument
。
? 錯誤嘗試
嘗試通過配置禁用校驗和:
checksumAlgorithm: none
# 或
md5: true
→ 結果:插件不支持該字段,報 invalid checksum algorithm
。失敗!!!
? 根本解決方案
降級 Velero AWS 插件至兼容版本:
使用基于 AWS SDK for Go v1 的插件版本 —— velero-plugin-for-aws:v1.3.0
。
錯誤現象 | 原因 | 解決方案 |
---|---|---|
Error getting backup store... invalid checksum algorithm: none ?或?md5 | 使用了?v1.5.0+ ?的?velero-plugin-for-aws ,該版本不正確處理?checksumAlgorithm ?或強制使用?aws-chunked 。 | 降級插件:使用?velero-plugin-for-aws:v1.3.0 。 |
Error: InvalidArgument ?(上傳時) | SDK 使用了?aws-chunked ?編碼,OSS 不支持。 | 降級插件:使用?v1.3.0 ?版本。 |
Backup Storage Location is Unavailable | 憑證錯誤、網絡不通、Bucket 不存在或權限不足。 | 1. 檢查?credentials-velero ?文件。<br>2. 檢查?velero pod ?日志 (kubectl logs deploy/velero -n velero )。<br>3. 檢查 OSS Bucket 名稱、區域和 RAM 權限。 |