Velero 简介和部署
包括k8s的资源,以及卷里面的数据,都可以进行备份和迁移。
这个备份和etcd的备份还是有区别的, 可以备份k8s资源以及pv里面的数据,所以功能还是很强大的。
可以利用备份还原的功能实现集群数据的迁移。比如生产有一套完整的k8s集群,如果想完整的移植到测试环境,这个时候就可以使用迁移功能将一套k8s资源完整的迁移到另外一套k8s里面去。
其实下面就是围绕着k8s集群备份恢复以及迁移。
velero只能将资源进行备份,比如deploy service,secret这些。etcd只能将所有的资源进行备份,而velero也可以做完全备份,它可以做特定的资源对象分类备份,对名称空间备份,对某个标签备份,对某个类别备份。所以更加精准。
etcd的备份是可以直接操作etcd数据库的,它和k8s的APIserver是不需要连接的,velero是要通过apiserver来进行的。在备份期间是要保证k8s正常工作的,如果apiservre出现问题是无法进行备份的。
所以verlero备份和etcd的备份其实是不太一样的。
因此在实际的过程当中,etcd的备份和verlero的备份是相互补充关系,而不是完全替代关系。etcd该备份备份,verleo该备份还是备份。
verlero还支持周期性的备份,比如每天,几个小时做一次备份,自身自带计划任务功能。
velero 组件组成
在实际生产中,可以使用etcd来做备份,在velero挑一些特定的资源进行备份,包括数据。
要实现完整功能需要三部分
客户端
基于cs结构的,它需要有客户端,这个客户端实际上就是命令行工具,这个命令就叫做verlero,这个需要访问apiserver,这个是需要授权的。
verlero也是通过RBAC机制进行授权访问。所以直接部署在master节点上面,因为master节点上授权都做好了。如果不在master节点上,那么自己在节点上指定kubeconfig资源即可。
服务端
客户端要调用服务器端来完成k8s里面资源获取的,这个服务端表现方式不是以二进制进程的方式去表现,你要在k8s里面以Pod的方式运行起来。
实际平时说的就是控制器理论,在k8s里面部署服务器端,以Pod方式运行,提供备份还原功能。
在k8s里面常见的资源对应的都是有控制器,有controller manager管理,但是verlero是第三方软件,并没有集成在k8s自身的控制器里面,所以需要安装单独的控制器,部署在k8s里面。
插件
和存储,包括一些资源做快照相关的一些第三方的插件来扩展存储功能。比如velero实现远程备份到公有云,私有云,需要调用它的一些存储插件。另外需要将数据做快照,需要借助卷的快照插件。
verlero备份恢复功能 备份工作流程
当运行 velero backup create test-backup 时:
- Velero 客户端调用 Kubernetes API 服务器来创建一个 Backup 对象
- BackupController 注意到新的 Backup 对象并进行验证
- BackupController 开始备份过程。它通过查询 API 服务器的资源来收集要备份的数据
- BackupController 会调用对象存储服务-例如 AWS S3 -来上传备份文件
默认情况下,velero backup create 会对任何持久化卷进行磁盘快照:可以通过指定额外的标志来调整快照, 运行 velero backup create --help 来查看可用的标志.
可以通过选项--snapshot-volumes=false 来禁用快照.
只是安装完客户端是无法完成数据备份和还原的,因为还要服务器端,服务器端表现的是控制器。
所以这里会有两个控制器。一个是备份的控制器,一个是恢复的控制器,这两个加起来就是服务器端。
当用户备份的时候要执行这条命令向apiserver发起请求,apiserver收到请求之后会对身份进行认证,要提前配置kubeconfig。
认证完之后连接apiserver,apiserver认证信息通过之后会向backup controller发起请求,说要做备份了,收到备份请求功能之后,这个时候就会向K8s发起通知要做备份,会去从apiserver读取资源信息,然后备份到对应的存储上面。一般放在集群外部的存储上面。
无论是客户端还是服务端controller都得去连接apiserver进行通信获取里面的各种资源。
备份完之后资源是独立存放的,将来需要的时候可以做还原,也是通过客户端工具发起还原申请。当然apiserver也是需要去认证身份的,看是否有没有权限。
那么restore控制器会收到通知,然后拿到存储当中的资源对象和数据再还原到k8s里面去。
在还原中用到的还是控制器,一个是backup控制器,一个是restore控制器。这两个是表现为Pod提前要部署到k8s里面。
下面部署的时候要准备客户端,其次是服务器端,还有一个第三方的存储。存储在真正使用的时候还需要有插件,在安装的时候也会通过客户端工具给安装上。
客户端安装
安装简单,去github网站上就可以下载到对应的软件,使用互联网上面的代理。
wget https://githubfast.com/vmware-tanzu/velero/releases/download/v1.16.1/velero-v1.16.1-linux-amd64.tar.gz
加压缩之后可执行的二进制文件才是我们所需要的,放在对应的路径下即可。
[root@master ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# cp velero-v1.16.1-linux-amd64/velero /usr/local/bin
客户端工具要去连接apiserver,所以velero部署在master节点即可。
[root@master ~]# velero completion --help
[root@master ~]# mkdir -p /etc/bash_completion.d
[root@master ~]# velero completion bash > /etc/bash_completion.d/velero
对象存储minio部署
下面使用对象存储minio来实现,将客户端工具和存储结合起来使用,客户端可以将数据备份到存储上面,velero怎么有权限访问minio呢?
不使用公有云环境,使用的是私有的minio。部署的方式有二进制部署,比较繁琐,也可以使用docker来安装,最好和k8s分开部署。
docker run -d \-p 9000:9000 \-p 9090:9090 \--name minio \--restart always \-v /data/minio:/data \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=12345678" \registry.cn-beijing.aliyuncs.com/wangxiaochun/minio:RELEASE.2024-11-07T00-52-20Z server /data --console-address ":9090"
现在创建bucket,其实就是一个大的文件夹,这个文件夹后续会使用到,名字叫做velero。
可以看到是有一个桶的标记,buckets叫做桶,verlero相当于一个大的文件夹,里面还没有内容,是空的,object是文件,可以看到里面是没有文件的。
后面是去授权用户去访问,稍后要去授权verlero client来访问minio。这里面要通过accesskey去授权。
虽然也可以使用之前的admin123来授权,但是之前的权限太大,也不安全。所以需要单独建立accesskey来单独给程序使用。用这种方式进行授权比较安全。这样只能通过api的方式进行访问,而不能登入到minio上面,这样的话安全。
这里已经生成好了key secret。
一定要记录下来,防止关闭界面的时候再也看不到。
VwmHQ87Y23P5IgC7nTYTsOdhG0MpgkeYRciLQhjpIqKCm6cKIA5NTtVHEbjR
上面这些其实就已经完成了minio的工作了。上面其实就是建立了一个大的verlero的文件夹,目前这个文件夹里面没有内容。
这里面未来会放未来velero备份下来的那些k8s数据。
授权文件
现在要授权velero客户端来访问minio,写一个清单授权文件,这个授权文件在所安装的verlero机器上面。这样文件里面就存放了访问minio的授权信息了,也就有权限访问minio了。
[root@master ~]# cat > credentials-velero <<EOF
> [default]
> aws_access_key_id = VwmHQ87Y23P5IgC7nTYT
> aws_secret_access_key = sOdhG0MpgkeYRciLQhjpIqKCm6cKIA5NTtVHEbjR
> EOF[root@master ~]# cat credentials-velero
[default]
aws_access_key_id = VwmHQ87Y23P5IgC7nTYT
aws_secret_access_key = sOdhG0MpgkeYRciLQhjpIqKCm6cKIA5NTtVHEbjR
实际生产中minio都是集群方式部署的,现在只是单机的形式部署。生产建议使用多节点的,高可用的,分布式的minio集群,而不是单机版。
这样minio和客户端就准备好了
现在需要部署服务器端,backup controller和restore controller。这两个组件要部署在k8s上面,表现方式为pod方式。
这个不是使用传统的k8s清单文件部署,而是使用verlero客户端工具来对接到k8s里面,这样就可以把server部署上。
部署verlero server
部署的方法有两种,一种是verlero的客户端工具,用install子命令就可以将server部署上。这样其实就是给k8s里面安装上verlero server。表现为备份恢复的两个控制器。
第二种就是是helm来部署。
这里还有插件和版本的关系,因为要和第三方存储对接,需要一些插件,需要对接什么存储,就得使用对应的存储插件,存储插件和verlero是有版本兼容性关系的。
比如亚马逊s3的版本要去提前确认一下。
使用minio来存储实际上是兼容亚马逊s3存储的,所以这里的版本兼容性要考虑清楚。
[root@master ~]# velero version
Client:Version: v1.16.1Git commit: 2eb97fa8b187f9ed0aeb49f216565eddf93a0b08
<error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1">
在部署的时候有些镜像是放在github网站上面的,要以容器的方式下载下来部署到k8s里面去,但是直接从docker网站去拉取,目前是已经无法拉取了,国内的防火墙屏蔽了,访问不了。
这里提前将镜像传到了阿里云上,方便拉取。
--provider aws 表示要使用什么样的存储,基于s3兼容的aws亚马逊云的minio。
--plugins 亚马逊存储相关的插件
--backup-location-config 备份位置,要备份在minio上面,要提前指定备份服务器的地址
端口不是使用控制台界面的端口,是9000端口,固定的。
--bucket velero bucket桶
--secret-file 访问minio服务器是需要授权的
--use-node-agent 数据备份的
--use-volume-snapshots=false 如果k8s里面资源是存储方式是支持快照的,可以把这个开启,因为没有安装支持快照插件,所以不支持
--wait 直到安装完毕才会退出程序
部署verlero控制器,部署好之后可以看到生成大量自定义资源类型
velero install \--provider aws \--image registry.cn-beijing.aliyuncs.com/wangxiaochun/velero:v1.15.0 \--plugins registry.cn-beijing.aliyuncs.com/wangxiaochun/velero-plugin-for-aws:v1.11.0 \--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.136.66:9000 \--bucket velero \--secret-file ./credentials-velero \--namespace velero \--use-node-agent \--use-volume-snapshots=false \--wait[root@master ~]# kubectl get crd
NAME CREATED AT
backuprepositories.velero.io 2025-08-03T03:51:30Z
backups.velero.io 2025-08-03T03:51:30Z
backupstoragelocations.velero.io 2025-08-03T03:51:30Z
bgpconfigurations.crd.projectcalico.org 2024-08-19T10:30:53Z
bgppeers.crd.projectcalico.org 2024-08-19T10:30:53Z
blockaffinities.crd.projectcalico.org 2024-08-19T10:30:53Z
clusterinformations.crd.projectcalico.org 2024-08-19T10:30:53Z
datadownloads.velero.io 2025-08-03T03:51:31Z
datauploads.velero.io 2025-08-03T03:51:31Z
deletebackuprequests.velero.io 2025-08-03T03:51:30Z
downloadrequests.velero.io 2025-08-03T03:51:30Z
felixconfigurations.crd.projectcalico.org 2024-08-19T10:30:53Z
globalnetworkpolicies.crd.projectcalico.org 2024-08-19T10:30:53Z
globalnetworksets.crd.projectcalico.org 2024-08-19T10:30:53Z
hostendpoints.crd.projectcalico.org 2024-08-19T10:30:53Z
ipamblocks.crd.projectcalico.org 2024-08-19T10:30:54Z
ipamconfigs.crd.projectcalico.org 2024-08-19T10:30:54Z
ipamhandles.crd.projectcalico.org 2024-08-19T10:30:54Z
ippools.crd.projectcalico.org 2024-08-19T10:30:54Z
kubecontrollersconfigurations.crd.projectcalico.org 2024-08-19T10:30:54Z
networkpolicies.crd.projectcalico.org 2024-08-19T10:30:54Z
networksets.crd.projectcalico.org 2024-08-19T10:30:54Z
podvolumebackups.velero.io 2025-08-03T03:51:30Z
podvolumerestores.velero.io 2025-08-03T03:51:30Z
restores.velero.io 2025-08-03T03:51:30Z
schedules.velero.io 2025-08-03T03:51:30Z
serverstatusrequests.velero.io 2025-08-03T03:51:30Z
volumesnapshotlocations.velero.io 2025-08-03T03:51:30Z[root@master ~]# kubectl api-resources
backuprepositories velero.io/v1 true BackupRepository
backups velero.io/v1 true Backup
backupstoragelocations bsl velero.io/v1 true BackupStorageLocation
datadownloads velero.io/v2alpha1 true DataDownload
datauploads velero.io/v2alpha1 true DataUpload
deletebackuprequests velero.io/v1 true DeleteBackupRequest
downloadrequests velero.io/v1 true DownloadRequest
podvolumebackups velero.io/v1 true PodVolumeBackup
podvolumerestores velero.io/v1 true PodVolumeRestore
restores velero.io/v1 true Restore
schedules velero.io/v1 true Schedule
serverstatusrequests ssr velero.io/v1 true ServerStatusRequest
volumesnapshotlocations vsl velero.io/v1 true VolumeSnapshotLocation
这些资源都是新加的,加了一个资源组。有备份资源backups还有恢复资源restores,还有计划任务资源schedules。
--use-node-agent 数据备份的,在每个节点上面都会部署一个agent,如果不涉及到数据备份,其实这个也可以不要,如果只是k8s里面的资源进行备份
velero-7fdc58b7f5-c8kpv 就是一个控制器,,说的服务端软件其实就是它,两个控制器都在里面。
[root@master ~]# kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
node-agent-7j454 1/1 Running 0 31h
velero-7fdc58b7f5-c8kpv 1/1 Running 0 31h
因为新增加了一些资源类型,比如backup,restore。因为还没有做备份,所以这里面资源都是空的。
[root@master ~]# kubectl get backup
No resources found in default namespace.
[root@master ~]# kubectl get restore
No resources found in default namespace.
到此部署完成,已经把velero的组件部署完毕。上面已经安装了客户端,minio存储,使用minio的客户端执行install命令,将服务器端也部署完毕。
这样所有环境都准备完成,只剩下备份还原了。