1.Velero 简介
1.1.Velero介绍

Velero (西班牙语,意思是“帆船)最初由 Heptio 公司开发,项目名称为 “Heptio Ark”。Heptio 由 Kubernetes 的两位联合创始人 Craig McLuckie 和 Joe Beda 创立,旨在为 Kubernetes 用户提供一系 列可靠的工具来增强集群的管理、运维能力。Ark 项目应运而生,其核心目标就是解决 Kubernetes 集 群的备份和恢复这一关键需求,当时市场上缺乏功能完善且易于使用的针对 Kubernetes 的此类工具。
Heptio 在 2017 年将 Ark 开源发布,开源之后,吸引了大量 Kubernetes 用户以及开发者的关注。许多 企业和开发者开始尝试使用 Ark 来保障自身集群内应用及数据的安全性,同时也积极向项目贡献代码、 反馈使用过程中遇到的问题以及提出新的功能需求,社区围绕 Ark 开始逐渐活跃起来,不断推动其功能 的完善和对更多存储、云平台环境等的适配。
2018 年,随着 Heptio 被 VMware 收购,Ark 项目为了更好地体现其通用性以及适应更广泛的社区发展 需要,被重命名为 “Velero”。后由 VMware Tanzu 对其进行维护和开发, 并于 2018 年捐赠给 CNCF, 成为 CNCF 的孵化项目之一。
发展至今,Velero 已经成为 Kubernetes 云原生生态中不可或缺的一部分,众多企业将其作为保障集群 业务连续性、进行数据保护和应用迁移的重要手段。其社区仍然保持着较高的活跃度,不断有开发者贡 献新的功能特性、改进文档,而且与其他云原生相关项目之间也有着紧密的协作关系,一起助力云原生 应用在 Kubernetes 平台上更安全、稳定地运行。
Velero是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、 恢复和迁移Kubernetes集群资源和持久卷。
特点
-
备份可以按集群资源的子集,按命名空间、资源类型标签选择器进行过滤,从而为备份和恢复的内 容提供高度的灵活性
-
支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群,注意:只备份kubernetes中的元数 据,不会备份PVC等数据内容
-
通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中
官网: https://velero.io/
Github 地址:https://github.com/vmware-tanzu/velero
官方文档:https://velero.io/docs/
1.2.Velero 主要功能
备份功能
-
集群资源备份:能够备份 Kubernetes 集群中的各种资源对象,包括 Deployment、Service、 ConfigMap、Secret、PersistentVolumeClaims 等几乎所有常见资源类型。例如,可以定期备份 重要的应用部署配置以及相关的服务定义等,方便在需要时进行还原。
-
持久卷数据备份:除了资源对象本身,Velero 还支持对与应用相关联的持久卷(Persistent Volumes)中的数据进行备份。这对于保存有重要业务数据(如数据库文件、用户上传文件等)的 应用来说至关重要,确保数据不会因意外删除、集群故障等情况丢失。 可基于文件系统备份(FileSystem Backup)备份Pod卷中的数据,并借助于restc或kopia上传到对象 存储系统 支持基于快照备份PV,这种方式较之FSB能确保文件的一致性;它支持两种操作: 1 仅创建PV快照,2 创建PV快照,并借助于restic或kopia上传到对象存储系统上
恢复功能
-
资源还原:可以将之前备份的资源对象按照备份时的状态准确地还原到集群中,无论是因为误操作 删除了某个关键服务,还是集群整体出现故障重建后,都能快速恢复应用部署和配置。
-
数据恢复:与资源还原配合,能把持久卷中的数据也恢复到相应的存储位置,使整个应用恢复到备 份时刻的可用状态,保障业务的连续性。
灾难恢复与迁移支持
-
跨集群迁移:方便将应用及数据从一个 Kubernetes 集群迁移到另一个集群,比如从测试环境集群 迁移到生产环境集群,或者在进行数据中心迁移、云平台更换等场景下,实现平滑的资源和数据转 移。
-
灾难恢复预案:作为灾难恢复计划的关键部分,通过定期备份,在遇到如集群硬件故障、数据中心 灾难等极端情况时,能快速依据备份在新的环境中恢复集群的关键业务应用,最大限度减少业务停 机时间和损失
1.3.Velero 使用场景
灾备场景: 提供备份和恢复kubernetes集群的能力
迁移场景: 提供复制和迁移集群资源到其他集群的能力,可用于快速实现开发,测试,生产等不同集群配置同步 需要将两个集群连接同一个对象存储服务
1.4.Velero 与 ETCD 备份比较
-
ETCD 备份是直接把集群的全部资源备份,而 Velero 可以支持对 Kubernetes 集群内对象级别进行 备份。
-
Velero 除了对 Kubernetes 集群进行整体备份外, 还可以支持对 Namespace、Type、Label、 Pod 等对象进行分类备份或者恢复
-
ETCD方式是直接对ETCD的数据库备份,无需连接API Server, 而 velero是通过API Server 进行备份, 要求Kubernetes 是可用的才可以还原 Velero 自身支持实现周期的定期备份,ETCD需要自行通过其它方式实现
-
Velero 还支持将PV卷的数据进行备份,ETCD方式只能备份Kubernetes 集群的资源
1.5.Velero 组件
Velero 组件一共分三部分,分别是客户端和服务端,插件。
客户端:
运行在本地的 velero命令行工具,包括安装服务端、备份、定时任务备份、恢复等命令,特别需要 注意的是,安装服务端时需要在机器上已配置好kubectl及集群kubeconfig。
服务端:
就是一组运行在Kubernetes集群中(以Pod方式运行)controller 资源 通过一组 CRD 实现的 Operator,包括: Backup Controller 和 Restore Contoller 这是整个工具的核心控制组件,负责与 Kubernetes API 服务器通信,协调备份和恢复任务的执 行,管理备份记录等,同时也会和各种插件交互来完成具体的功能,比如和存储插件协作进行数据 的存储和读取操作。
插件(Plugins):
https://velero.io/docs/main/supported-providers/
存储插件:用于对接不同的存储后端,支持多种存储类型,像 Amazon S3、Google Cloud Storage、Azure Blob Storage、MinIO等云存储服务,以及一些本地的兼容 S3 协议的存储系 统,如MinIO,实现备份数据的可靠存储和获取。
卷快照插件:针对不同的存储提供商(如不同云平台对持久卷的管理机制不同),卷快照插件 能够与相应的存储系统集成,实现对持久卷数据的快照创建和恢复,提高备份和恢复的效率, 尤其是对于大容量数据的处理。
1.6.Velero 后端存储
Velero 支持两种关于后端存储的 CRD ,分别是 BackupStorageLocation 和 VolumeSnapshotLocation 。
BackupStorageLocation 主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。 主要支持的后端存储是 S3 兼容的存储,比如:MinIO,阿里云 OSS,AWS S3,Azure Blob,Google Cloud 等。
VolumeSnapshotLocation 主要用来给 PV 做快照,这个需要使用 CSI 等存储机制。 如果是公有云需要云提供商提供插件。比如: 阿里云已经提供了插件, 也可以使用专门的备份工具 Restic ,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。
1.7.Velero 备份还原的工作流程


备份数据: 本地velero客户端发送备份命令,就会调用API Server创建Backup资源对象 服务端的Backup Controller 收到通知有新的Backup对象创建并执行验证 服务端的Backup Controller 开始执行备份过程,向API Server查询需要备份的数据服务端的Backup Controller 调用OSS对象存储服务,将备份数据保存到对象对象存储上 默认情况下,BackupController还会为PV创建Snapshot(若PV支持),用户可使用 –snapshotvolumes=false 选项禁用该功能 Velero 会与 Kubernetes API 服务器交互,首先获取要备份的资源对象的清单信息,然后根据配置 决定是否对关联的持久卷数据进行备份(通过调用相应的存储插件来操作)。对于持久卷数据备 份,它会协调存储系统(如支持的云存储服务或本地存储解决方案)创建数据的快照或者复制数据 到指定的备份存储位置。整个备份过程中会生成相应的备份记录,记录备份的资源范围、时间、状 态等关键信息。
恢复数据: 本地velero客户端发送恢复指令,就会调用API Server创建Restore资源对象 服务端的Restore Controller 收到通知有新的Restore对象创建并执行验证 服务端的Restore Controller 调用对象存储,将指定的备份文件下载下来 服务端的Restore Controller 开始执行恢复过程,根据备份数据调用API Server重新创建相关资源 对象 当执行恢复操作时,Velero 读取备份记录,先将资源对象的定义重新应用到 Kubernetes 集群中, 创建相应的资源(如重新创建 Deployment 来启动应用副本等)。对于有持久卷数据需要恢复的情 况,它会从备份存储位置获取数据并还原到对应的持久卷中,确保应用能够正常使用之前的数据。
2.安装和使用 Velero Cli
2.1.Velero CLI 二进制安装
软件包下载地址:
https://github.com/vmware-tanzu/velero/releases
k8s版本要求:

wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.2/velero-v1.17.2-linux-amd64.tar.gz
tar -zxf velero-v1.17.2-linux-amd64.tar.gz
cp velero-v1.17.2-linux-amd64/velero /usr/local/bin/
minio创建Access Key并配置权限

创建并记录 Access Key 和 Secret key
aws_access_key_id = tksm4QnaHeL0VkS7946h
aws_secret_access_key = dnMQ2n6d3eRMmdoqBzurNk3GwnFTpmJMBzmrveSZ
在K8s集群的Master节点上MinIO的创建认证文件
cat > credentials-velero <<EOF
[default]
aws_access_key_id = tksm4QnaHeL0VkS7946h
aws_secret_access_key = dnMQ2n6d3eRMmdoqBzurNk3GwnFTpmJMBzmrveSZ
EOF
2.2.安装Velero Server
velero install \\
–provider aws \\
–image swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/velero/velero:v1.16.2 \\
–plugins swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/velero/velero-plugin-for-aws:v1.12.0 \\
–backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.apotos.com:9000 \\
–bucket velero \\
–secret-file ./credentials-velero \\
–namespace velero \\
–use-node-agent \\
–use-volume-snapshots=false \\
–wait
命令参数详解
这条 velero install 命令,目的是在 Kubernetes 集群中部署 Velero 备份恢复工具,并配置使用一个兼容 S3 协议的存储后端(通常指 MinIO 或 AWS S3)。以下是各参数的具体作用:
| –provider aws | 指定存储提供商类型为 aws。因为 MinIO 兼容 AWS S3 接口,使用此标识可以复用 AWS 的插件逻辑。 |
| –image swr.cn-north-4.myhuaweicloud.com/…/velero:v1.16.2 | 指定 Velero 主控制器的容器镜像地址。这里使用的是华为云镜像仓库(SWR)中的 v1.16.2 版本。 |
| –plugins swr.cn-north-4.myhuaweicloud.com/…/velero-plugin-for-aws:v1.12.0 | 指定使用的插件镜像。velero-plugin-for-aws 使 Velero 能够与 S3 兼容的存储进行交互,例如读写备份数据。 |
| –backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.apotos.com:9000 | 配置备份存储的位置(BSL)。这是核心参数,包含了多个子配置: • region=minio:指定区域标识,对于自建的 MinIO 可以自定义。 • s3ForcePathStyle="true":强制使用路径风格的请求方式。这是使用非 AWS 的 S3 兼容存储(如 MinIO)时的必需设置。 • s3Url=http://minio.apotos.com:9000:指定 S3 兼容服务的完整访问地址和端口。 |
| –bucket velero | 指定用于存放备份数据的存储桶(Bucket)名称,此处为 velero。该桶需要在 MinIO 中预先手动创建好。 |
| –secret-file ./credentials-velero | 指定包含访问 MinIO 凭证的本地文件路径。该文件内容格式通常如下:[default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY |
| –namespace velero | 指定 Velero 组件安装的 Kubernetes 命名空间,此处为 velero。 |
| –use-node-agent | 启用节点代理(Node Agent)功能。它允许 Velero 使用文件系统备份(FSB)来备份挂载的持久卷中的数据。 |
| –use-volume-snapshots=false | 显式禁用卷快照功能。因为您使用的是 MinIO,且未配置云提供商的卷快照能力,所以必须设置为 false。 |
| –wait | 让 velero install 命令阻塞等待,直到 Velero 部署的所有资源都处于就绪状态再退出。 |
执行前的关键检查点
运行此命令前,必须确认以下几点,否则安装会失败:
MinIO 服务可达性:
-
http://minio.apotos.com:9000 指向的是真正的 MinIO 服务地址。
-
建议:将此地址替换为您实际部署的、集群可访问的 MinIO 服务的正确地址(可以是内部 Service 域名,如 minio.minio.svc.cluster.local:9000,或节点的 IP 加端口)。
存储桶与凭证:
-
在 MinIO 中创建好名为 velero 的存储桶。
-
确保 ./credentials-velero 文件存在,且其中的 Access Key 和 Secret Key 与您的 MinIO 服务匹配。
2.3.执行备份命令
velero backup create k8s-backup-$TIME –kubeconfig ~/.kube/config –include-namespaces=default
命令参数详解
velero backup create
-
作用:Velero 的子命令,用于创建一个新的备份
-
说明:这是执行备份操作的主要命令
k8s-backup-$TIME
-
作用:备份的名称
-
说明:$TIME 是一个变量,通常会被替换为当前时间戳,使备份名称唯一
-
示例:如果 $TIME=20250225-1430,则备份名为 k8s-backup-20250225-1430
–kubeconfig ~/.kube/config
-
作用:指定 Kubernetes 集群的连接配置文件
-
路径:~/.kube/config 是默认的 kubeconfig 文件位置
-
说明:Velero 需要连接 Kubernetes API Server 来备份资源
–include-namespaces=default
-
作用:指定要备份的命名空间
-
值:default 表示只备份 default 命名空间中的资源
-
说明:如果不指定,默认会备份所有命名空间
2.4.查看备份状态
velero backup describe k8s-backup-2026-02-25-15-53-10
velero backup logs k8s-backup-2026-02-25-15-53-10
root@master01:~# velero backup describe k8s-backup-2026-02-25-15-53-10
Name: k8s-backup-2026-02-25-15-53-10
Namespace: velero
Labels: velero.io/storage-location=default
Annotations: velero.io/resource-timeout=10m0s
velero.io/source-cluster-k8s-gitversion=v1.32.11
velero.io/source-cluster-k8s-major-version=1
velero.io/source-cluster-k8s-minor-version=32
Phase: Completed
Namespaces:
Included: default
Excluded: <none>
Resources:
Included cluster-scoped: <none>
Excluded cluster-scoped: <none>
Included namespace-scoped: *
Excluded namespace-scoped: <none>
Label selector: <none>
Or label selector: <none>
Storage Location: default
Velero-Native Snapshot PVs: auto
File System Backup (Default): false
Snapshot Move Data: false
Data Mover: velero
TTL: 720h0m0s
CSISnapshotTimeout: 10m0s
ItemOperationTimeout: 4h0m0s
Hooks: <none>
Backup Format Version: 1.1.0
Started: 2026-02-25 16:09:30 +0800 CST
Completed: 2026-02-25 16:09:31 +0800 CST
Expiration: 2026-03-27 16:09:30 +0800 CST
Total items to be backed up: 22
Items backed up: 22
Backup Volumes:
Velero-Native Snapshots: <none included>
CSI Snapshots: <none included>
Pod Volume Backups: <none included>
HooksAttempted: 0
HooksFailed: 0
MinIO 查看备份

定时备份
#Examples :
#Create a backup every 6 hours.
velero create schedule NAME –schedule="0 */6 * * *”
# Create a backup every 6 hours with the @every notation.
velero create schedule NAME –schedule="@every 6h"
#Create a daily backup of the web namespace.
velero create schedule NAME –schedule="@every 24h" –include-namespaces web
# Create a weekly backup, each living for 90 days(2160 hours).
velero create schedule NAME –schedule="@every 168h" –ttl 2160h@m0s
2.5.恢复资源
先删除部分资源
root@master01:~# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
myweb-7d756bcd87-chbsv 1/1 Running 1 (6h56m ago) 25h
myweb-7d756bcd87-kcbz7 1/1 Running 1 (6h56m ago) 25h
myweb-7d756bcd87-pn27p 1/1 Running 1 (6h56m ago) 25h
network-tools 1/1 Running 1 (6h56m ago) 25h
root@master01:~# kubectl delete deployments.apps myweb
deployment.apps "myweb" deleted
root@master01:~# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
network-tools 1/1 Running 1 (6h56m ago) 25h
恢复前查看备份名称
root@master01:~# velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
k8s-backup-2026-02-25-15-53-10 Completed 0 0 2026-02-25 16:09:30 +0800 CST 29d default <none>
k8s-backup-2026-02-25-16-00-37 Completed 0 0 2026-02-25 16:00:37 +0800 CST 29d default <none>
在worker节点上可以提前下载相关镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/velero/velero-restore-helper:v1.15.2
在master节点执行恢复命令
#使用如下命令恢复指定的备份
velero restore create –from-backup k8s-backup-2026-02-25-15-53-10 –wait
root@master01:~# velero restore create –from-backup k8s-backup-2026-02-25-15-53-10 –wait
Restore request "k8s-backup-2026-02-25-15-53-10-20260225165431" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting – your restore will continue in the background.
Restore completed with status: Completed. You may check for more information using the commands `velero restore describe k8s-backup-2026-02-25-15-53-10-20260225165431` and `velero restore logs k8s-backup-2026-02-25-15-53-10-20260225165431`.
2.6.检查恢复的资源
创建restores资源
root@master01:~# kubectl get restores.velero.io -A
NAMESPACE NAME AGE
velero k8s-backup-2026-02-25-15-53-10-20260225165431 14m
完成恢复后,会在MinIO存储中同时创建和一个和backups同级的restores的目录

查看恢复情况
root@master01:~# velero restore get
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR
k8s-backup-2026-02-25-15-53-10-20260225165431 k8s-backup-2026-02-25-15-53-10 Completed 2026-02-25 16:54:31 +0800 CST 2026-02-25 16:54:32 +0800 CST 0 12 2026-02-25 16:54:31 +0800 CST <none>
查看详细信息
root@master01:~# velero restore describe k8s-backup-2026-02-25-15-53-10-20260225165431 –details
Name: k8s-backup-2026-02-25-15-53-10-20260225165431
Namespace: velero
Labels: <none>
Annotations: <none>
Phase: Completed
Total items to be restored: 21
Items restored: 21
Started: 2026-02-25 16:54:31 +0800 CST
Completed: 2026-02-25 16:54:32 +0800 CST
Warnings:
Velero: <none>
Cluster: <none>
Namespaces:
default: could not restore, Pod:network-tools already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Endpoints:myweb-clusterip already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Endpoints:myweb-loadbalancer already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Endpoints:myweb-nodeport already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Service:baidu already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Service:kubernetes already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Service:myweb-clusterip already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Service:myweb-loadbalancer already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, Service:myweb-nodeport already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, EndpointSlice:myweb-clusterip-qmd4s already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, EndpointSlice:myweb-loadbalancer-vst84 already exists. Warning: the in-cluster version is different than the backed-up version
could not restore, EndpointSlice:myweb-nodeport-smp7h already exists. Warning: the in-cluster version is different than the backed-up version
Backup: k8s-backup-2026-02-25-15-53-10
Namespaces:
Included: all namespaces found in the backup
Excluded: <none>
Resources:
Included: *
Excluded: nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io, csinodes.storage.k8s.io, volumeattachments.storage.k8s.io, backuprepositories.velero.io
Cluster-scoped: auto
Namespace mappings: <none>
Label selector: <none>
Or label selector: <none>
Restore PVs: auto
CSI Snapshot Restores: <none included>
Existing Resource Policy: <none>
ItemOperationTimeout: 4h0m0s
Preserve Service NodePorts: auto
Uploader config:
HooksAttempted: 0
HooksFailed: 0
Resource List:
apps/v1/Deployment:
– default/myweb(created)
apps/v1/ReplicaSet:
– default/myweb-7d756bcd87(created)
discovery.k8s.io/v1/EndpointSlice:
– default/kubernetes(skipped)
– default/myweb-clusterip-qmd4s(failed)
– default/myweb-loadbalancer-vst84(failed)
– default/myweb-nodeport-smp7h(failed)
v1/ConfigMap:
– default/kube-root-ca.crt(skipped)
v1/Endpoints:
– default/kubernetes(skipped)
– default/myweb-clusterip(failed)
– default/myweb-loadbalancer(failed)
– default/myweb-nodeport(failed)
v1/Pod:
– default/myweb-7d756bcd87-chbsv(created)
– default/myweb-7d756bcd87-kcbz7(created)
– default/myweb-7d756bcd87-pn27p(created)
– default/network-tools(failed)
v1/Service:
– default/baidu(failed)
– default/kubernetes(failed)
– default/myweb-clusterip(failed)
– default/myweb-loadbalancer(failed)
– default/myweb-nodeport(failed)
v1/ServiceAccount:
– default/default(skipped)
检查刚才的删除的资源是否恢复
root@master01:~# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
myweb 3/3 3 3 56s
root@master01:~# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
myweb-7d756bcd87-chbsv 1/1 Running 0 63s
myweb-7d756bcd87-kcbz7 1/1 Running 0 62s
myweb-7d756bcd87-pn27p 1/1 Running 0 62s
network-tools 1/1 Running 1 (7h1m ago) 25h
恢复完成
网硕互联帮助中心




评论前必须登录!
注册