1 简介
Velero介绍
Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。
备份可以按集群资源的子集,按命名空间、资源类型标签选择器进行过滤,从而为备份和恢复的内容提供高度的灵活性
支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中
Velero组件
Velero 组件一共分两部分,分别是服务端和客户端。
服务端:运行在Kubernetes集群中(运行在Pod中)
客户端:运行在本地的velero命令行工具,包括安装服务端、备份、定时任务备份、恢复等命令,特别需要注意的是,安装服务端时需要在机器上已配置好kubectl及集群kubeconfig。
velero使用场景
灾备场景:提供备份恢复k8s集群的能力
迁移场景:提供拷贝集群资源到其他集群的能力(两个集群连接同一个对象存储地址)
与etcd备份区别
直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。
除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label、Pod等对象进行分类备份或者恢复。
Velero工作流程
备份数据:
本地velero客户端发送备份命令,就会调用API Server创建Backup资源对象
服务端收到通知有新的Backup对象创建并执行验证
服务端开始执行备份过程,向API Server查询需要备份的数据
服务端调用对象存储服务,将备份数据保存到对象对象存储上
恢复数据:
本地velero客户端发送恢复指令,就会调用API Server创建Restore资源对象
服务端收到通知有新的Restore对象创建并执行验证
服务端调用对象存储,将指定的备份文件下载下来
服务端开始执行恢复过程,根据备份数据调用API Server重新创建相关资源对象

Velero后端存储
Velero支持两种关于后端存储的CRD,分别是BackupStorageLocation和VolumeSnapshotLocation。
BackupStorageLocation
主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。主要支持的后端存储是 S3 兼容的存储,比如:Mino 和阿里云 OSS 等。
VolumeSnapshotLocation
主要用来给 PV 做快照,需要云提供商提供插件。阿里云已经提供了插件,这个需要使用 CSI 等存储机制。也可以使用专门的备份工具 Restic,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。
Restic 是一款 GO 语言开发的数据加密备份工具,顾名思义,可以将本地数据加密后传输到指定的仓库。支持的仓库有 Local、SFTP、Aws S3、Minio、OpenStack Swift、Backblaze B2、Azure BS、Google Cloud storage、Rest Server。
备份有状态数据
velero 有两种备份有状态数据的方式,对比如下
文件复制会进行加密、压缩、增量备份,压缩比在60%左右,备份文件都是加密后的二进制文件,打开乱码
两种文件复制插件:
Restic(默认) https://restic.readthedocs.io/en/latest/100_references.html#terminology
Kopia https://kopia.io/docs/advanced/architecture
2 准备minIO存储
Velero支持很多种存储插件,可查看:https://velero.io/docs/main/supported-providers/获取插件信息,我们这里使用minio作为S3兼容的对象存储提供程序。您也可以在任意地方部署Minio对象存储,只需要保证K8S集群可以访问到即可。
安装部署
部署过程可参考另外一篇博客:
3 安装Velero
软件包下载地址:https://github.com/vmware-tanzu/velero/releases
[root@master k8s]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz
[root@master k8s]# tar -zxvf velero-v1.14.0-linux-amd64.tar.gz
[root@master ~]# mv velero-v1.14.0-linux-amd64/velero /usr/bin/
[root@master ~]# velero version
Client:
Version: v1.14.0
Git commit: ea5a89f83b89b2cb7a27f54148683c1ee8d57a37
<error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1">启用命令补全
[root@master ~]# source <(velero completion bash)
[root@master ~]# velero completion bash > /etc/bash_completion.d/velero创建minIO密钥
[root@master ~]# cat > credentials-velero <<EOF
[default]
aws_access_key_id = 3PLipAJkOumVWGZGRHZg # minio的key
aws_secret_access_key = S9syQfiGfTvvuRUXleWL69yh7mf5doxAZXQnM9rn # minio的access_key
EOF安装velero到k8s集群
备份数据需要通过s3协议上传到minIO对象存储,提前下载aws插件https://github.com/vmware-tanzu/velero-plugin-for-aws并上传仓库
需要准备的镜像列表
velero/velero-plugin-for-aws:v1.15.0
velero/velero:v1.17.0
velero/velero-restore-helper:v1.17.0部署 velero
# 执行install命令后会创建一系列清单,包括CustomResourceDefinition、Namespace、Deployment等。
[root@master ~]# velero install \
--provider aws \
--image harbor.local.com/velero/velero:v1.17.0 \
--plugins harbor.local.com/velero/velero-plugin-for-aws:v1.15.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-node-agent \
--uploader-type=restic \
--privileged-node-agent \
--use-volume-snapshots=false \
--namespace velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio-api.local.com \
--wait
# 配置恢复工具镜像地址(解决内网环境无法访问dockerhub问题)
[root@master velero]# cat > config.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: fs-restore-action-config
namespace: velero
labels:
velero.io/plugin-config: ""
velero.io/pod-volume-restore: RestoreItemAction
data:
image: harbor.local.com/velero/velero-restore-helper:v1.17.0 # 恢复镜像地址
EOF
[root@master velero]# kubectl apply -f config.yaml
configmap/fs-restore-action-config created
[root@master ~]# kubectl get all -n velero
NAME READY STATUS RESTARTS AGE
pod/node-agent-8cpz4 1/1 Running 0 50s
pod/node-agent-bl98j 1/1 Running 0 50s
pod/node-agent-pnl82 1/1 Running 0 50s
pod/node-agent-rvz99 1/1 Running 0 50s
pod/node-agent-t25wf 1/1 Running 0 50s
pod/node-agent-vlqn6 1/1 Running 0 50s
pod/velero-6c7f5c9466-8nnjw 1/1 Running 0 50s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/node-agent 6 6 6 6 6 <none> 50s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/velero 1/1 1 1 50s
NAME DESIRED CURRENT READY AGE
replicaset.apps/velero-6c7f5c9466 1 1 1 50s
[root@master ~]# kubectl get backupstoragelocation -A
NAMESPACE NAME PHASE LAST VALIDATED AGE DEFAULT
velero default Available 1s 15m true
[root@master ~]# kubectl get backupstoragelocations.velero.io -A
NAME PHASE LAST VALIDATED AGE DEFAULT
default Available 23s 15m true选项说明:
--kubeconfig(可选):指定kubeconfig认证文件,默认使用.kube/config;--provider:定义插件提供方;--image:定义运行velero的镜像,默认与velero客户端一致;--plugins:指定使用aws s3兼容的插件镜像;--bucket:指定对象存储Bucket桶名称;--secret-file:指定对象存储认证文件;--use-node-agent:启用文件系统备份,创建Velero Node Agent守护进程,托管FSB模块;--uploader-type=restic:使用Restic工具备份<font style="color:rgb(37, 41, 51);">--privileged-node-agent</font>: 节点代理需要在特权模式下运行--use-volume-snapshots:是否启使用快照;--namespace:指定部署的namespace名称,默认为velero;--backup-location-config:指定对象存储地址信息,需要注意的是如果指定域名的话,服务器端必须能解析到。
aws插件与velero版本对应关系:
其它命令:
# 可使用如下命令查看运行日志
[root@master ~]# kubectl logs deployment/velero -n velero
# 查看velero创建的api对象
[root@master ~]# kubectl api-versions | grep velero
velero.io/v1
velero.io/v2alpha1
# 查看备份信息
[root@master ~]# velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws velero Available 2026-08-05 22:45:08 +0800 CST ReadWrite true卸载velero
如果您想从集群中完全卸载Velero,则以下命令将删除由velero install创建的所有资源:
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero4 数据备份
备份命令
velero create backup NAME [flags]
backup选项:
--exclude-namespaces stringArray: 要从备份中排除的名称空间--exclude-resources stringArray: 要从备份中排除的资源,如storageclasses.storage.k8s.io--include-cluster-resources optionalBool[=true]: 包含集群资源类型--include-namespaces stringArray: 要包含在备份中的名称空间(默认’*')--include-resources stringArray: 备份中要包括的资源--labels mapStringString: 给这个备份加上标签-o, --output string: 指定输出格式,支持’table’、‘json’和’yaml’;-l, --selector labelSelector: 对指定标签的资源进行备份--snapshot-volumes optionalBool[=true]: 对 PV 创建快照--storage-location string: 指定备份的位置--ttl duration: 备份数据多久删掉--volume-snapshot-locations strings: 指定快照的位置,也就是哪一个公有云驱动
创建测试应用
[root@master velero]# cat > redis.yaml <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: redis
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: reids-pvc
namespace: redis
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: redis
spec:
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: harbor.local.com/library/redis:7
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: "/data"
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: reids-pvc
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: redis
spec:
type: ClusterIP
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
EOF
[root@master velero]# kubectl apply -f redis.yaml
namespace/redis created
persistentvolumeclaim/reids-pvc created
deployment.apps/redis created
service/redis created
# 查看资源清单
[root@master velero]# kubectl get all -n redis
NAME READY STATUS RESTARTS AGE
pod/redis-7cf5f784f6-8c9xg 1/1 Running 0 26s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis ClusterIP 10.109.225.198 <none> 6379/TCP 26s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/redis 1/1 1 1 26s
NAME DESIRED CURRENT READY AGE
replicaset.apps/redis-7cf5f784f6 1 1 1 26s
# 添加测试数据
[root@master velero]# kubectl exec -it -n redis redis-7cf5f784f6-8c9xg -- redis-cli
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"
127.0.0.1:6379> exit备份测试应用
[root@master velero]# velero backup create redis-backup --include-namespaces=redis --default-volumes-to-fs-backup
Backup request "redis-backup" submitted successfully.
Run `velero backup describe redis-backup` or `velero backup logs redis-backup` for more details.
选项:
--include-namespaces:指定命名空间--selector:标签选择器,如app=nginx--default-volumes-to-fs-backup:同时备份pv
备份数据查看
查看备份列表
[root@master velero]# velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
redis-backup Completed 0 0 2024-08-06 10:37:12 +0800 CST 29d default <none>
# 查看备份详细信息
[root@master velero]# velero backup describe redis-backup --details
# 查看备份日志
[root@master velero]# velero backup logs redis-backupminio控制台查看备份内容
评论区