当前位置: 首页 > news >正文

基于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 权限。

http://www.dtcms.com/a/356582.html

相关文章:

  • Kubernetes 与 GitOps 的深度融合实践指南
  • 国产数据库转型指南:DBA技能重构与职业发展
  • 面试问题详解十一:Qt中的线程池与 QRunnable
  • 阿里云百炼智能体连接云数据库实践(DMS MCP)
  • Qt事件_xiaozuo
  • Baseline|基线
  • Linux: proc: pid: coredump_filter
  • Redis搭建哨兵模式一主两从三哨兵
  • GO入门(一)——安装和了解
  • MySQL底层数据结构与算法浅析
  • “设计深圳”亚洲权威消费科技与室内设计盛会
  • CVPR 强化学习模块深度分析:连多项式不等式+自驾规划
  • 在Linux的环境下安装GitLab(保姆级别)
  • 打造高效外贸网站:美国服务器的战略价值
  • 阻塞,非阻塞,同步,异步的理解
  • Windows 下 MSYS2 + MinGW-w64 配置 Fyne GUI 编译环境全流程
  • 【计算机408计算机网络】第三章:自底向上五层模型之数据链路层
  • WINTRUST!_GetMessage函数分析之CRYPT32!CryptSIPGetSignedDataMsg函数的作用是得到nt5inf.cat的信息
  • 【算法】链表专题
  • 钉钉补卡事件处理方案
  • uni-app 跨平台项目的 iOS 上架流程:多工具组合的高效协作方案
  • 常见视频封装格式对比
  • 从零开始学习单片机16
  • 数据结构——线性表(链表,力扣中等篇,增删查改)
  • AI接管浏览器:Anthropic发布Claude for Chrome,是效率革命还是安全噩梦?
  • MySQL-内置函数
  • Python 【深度解析】线程与进程:操作系统中多任务的核心机制
  • WebRTC音频QoS方法五(音频变速算法之Expand算法实现)
  • Nodejs介绍
  • FreeRTOS基础知识记录