基于Velero + 阿里云 OSS的Kubernetes 集群的备份与恢复
在 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 权限。 |