使用Velero备份还原K8S的数据

发布时间 2023-07-14 14:25:21作者: fengjian1585

一 原理

Velero 的基本原理就是将Kubernetes 集群资源对象数据备份到对象存储中,并能从对象存储中拉取备份数据来恢复集群资源对象数据。不同于etcd 备份——将集群的全部资源备份起来——Velero 是对Kubernetes 集群内资源对象级别进行备份,可以通过对Type、Namespace、Label等对象进行分类备份或者恢复。

elero的操作(backup, scheduled backup, restore)都是CRD自定义资源,存储etcd中。 Velero的整体模块架构如下图1,首先,客户端是一个简单的交互客户端Velero-cli,封装了各种命令参数,可以执行安装、配置、备份、恢复等操作。服务端则可以类比成一个典型的kubebuild 的operator,首先是不同的CR,也就是API。中间Controller 层需要用到一些相对比较独立的服务时,都会通过插件系统来对接到内部或者外部的插件服务。底层的数据拷贝层是对接Restic。其它都是外部的插件实现, 就代表内部的插件实现,由Velero 或者第三方厂商来实现。

 

 

按需备份(On-demand backups)

backup: 将复制的Kubernetes 资源对象上传到对象存储中,且可选择调用云环境提供的API 来创建持久化卷快照,以及可选择指定在备份期间执行backup hook操作(比如:可能需要在快照之前告诉数据库将其内存中的缓存刷新到磁盘)。 Tips: backup操作并不是严格的原子性备份,在备份期间,若是有Kubernetes 资源对象被新建或编辑操作,则这个操作变动可能不会被包含在backup备份中。 指令: velero backup create test-backup 流程:

  • Velero客户端向Kubernetes API server 发起创建Backup对象的请求
  • BackupController 检测到新建Backup对象,并进行参数验证
  • BackupController 开始备份执行过程。通过与API server交互,获取需要备份的资源数据
  • BackupController 向对象存储服务(如:AWS S3)发起上传备份数据请求
  • 默认情况,backup操作是会对持久卷(PV)进行磁盘快照备份的,不过是可以通过–snapshot-volumes=false进行取消

图2 Velero 备份流程

备份还原(Restores)

restore: 对历史备份的Kubernetes 资源对象和持久卷进行还原,且允许按需选择指定部分资源对象还原到指定命名空间(Namespace)中。且可以选择在备份还原期间或还原后执行restore hook操作(比如:执行自定义数据库的还原操作之后,再执行数据库应用容器启动动作)。 Tips: 默认情况下,Velero进行的是非破坏性还原操作(non-destructive restore),这意味着它不会删除目标集群上的任何数据——即如果备份中的资源对象已经存在于目标集群中,restore操作将会跳过该资源的还原。当然,也可通配置更新策略(–existing-resource-policy=update),尝试更新目标集群中已存在资源,以匹配备份中的资源数据。 指令: velero restore create 流程:

  • Velero客户端向Kubernetes API server 发起创建Restore对象的请求
  • RestoreController 检测到新建Restore 对象,并进行参数验证
  • RestoreController 从对象存储服务处获取待还原备份资源数据信息,并进行备份资源还原前的一些预处理工作(比如:备份资源的API versions版本验证)
  • RestoreController 开始备份还原执行过程,一次性还原所有指定待还原资源

定时备份(Scheduled backups)

schedule: 可以定期备份数据。在schedule 创建后,便创建第一次备份,随后备份将按照指定调度周期(由 Cron 表达式指定)进行备份。定时备份保存的名称为 -,其中 格式为 YYYYMMDDhhmmss。

API versions

Velero备份资源时,使用Kubernetes API 首选版本为每个组(group)/资源(CRD)备份。而还原备份的目标集群中,必须存在相同API 组(group)/资源(CRD)版本。需要注意的是:只是需要存在,而并不是需要首选版本。例如,如果正在备份的集群在 things API 组中有一个 gizmos 资源,group/versions为 things/v1alpha1、things/v1beta1 和 things/v1,并且服务器的首选group/versions 是 things/v1,那么所有 gizmos 将从 things/v1 API 端点备份。 当从该集群恢复备份时,目标集群必须具有 things/v1 端点才能恢复 Gizmo。

 

使用docker 安装minio对象存储

docker run -p 9000:9000 -p 9090:9090 --name minio -d --restart=always \
-e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin12345" \
-v /home/minio/data:/data minio/minio server /data \
--console-address ":9090" --address ":9000"

 

 

登录minio,创建buckets

 



 

 

在k8s master 安装 velero 客户端

先决条件:  Kubernetes 集群 v1.16 或更高版本

wget https://mirror.ghproxy.com/https://github.com/vmware-tanzu/velero/releases/download/v1.10.3/velero-v1.10.3-linux-amd64.tar.gz
tar -zxvf velero-v1.10.3-linux-amd64.tar.gz
cp velero-v1.10.3-linux-amd64/velero /usr/local/bin/

 

创建velero 使用minio的密钥

[root@master1 ~]# cat credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = admin12345

 

在k8s中安装 velero服务器端

velero install     --provider aws     --plugins velero/velero-plugin-for-aws:v1.2.1   \
--bucket data --secret-file /root/credentials-velero \
--use-volume-snapshots=false --backup-location-config \
region=minio,s3ForcePathStyle="true",s3Url=http://172.20.106.193:9000

 

备份k8s test 命名空间

[root@master1 ~]# kubectl get pod  -n test
NAME                      READY   STATUS    RESTARTS      AGE
apache-7d57797d98-cv44s   1/1     Running   1 (28m ago)   7d23h
nginx-8f458dc5b-hv2np     1/1     Running   1 (28m ago)   7d23h

 

备份

velero backup create backup-test --include-namespaces test -n velero

 

删除test命名空间,并且恢复

kubectl delete ns test
#恢复
velero restore  create --from-backup backup-test  --wait