简介
Velero 是一个提供 Kubernetes 集群和持久卷的备份、迁移以及灾难恢复等的开源工具。
Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。
Velero 是一种云原生的Kubernetes优化方法,支持标准的K8S集群,既可以是私有云平台也可以是公有云。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。
使用velero可以对集群进行备份和恢复,降低集群DR造成的影响。velero的基本原理就是将集群的数据以json格式备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。
组成部分
Velero组件一共分两部分,分别是客户端和服务端。
- 客户端:运行在本地的velero命令行工具,包括安装服务端、备份、定时任务备份、恢复等命令,特别需要注意的是,安装服务端时需要在机器上已配置好kubectl及集群kubeconfig。
- 服务端:运行在Kubernetes集群中(运行在Pod中)。
velero使用场景
- 直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。
- 除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label、Pod
等对象进行分类备份或者恢复。
原理
Velero工作原理
每个Velero的操作(如按需备份backup,计划备份schdule,还原restore)都是自定义资源,使用Kubernetes 自定义资源定义(CRD)定义并存储在 etcd中,Velero还包括 对自定义资源执行备份、恢复和所有相关操作的控制器,例如备份控制器BackupController、恢复控制器RestoreController ,诸如此类的控制器在成功部署velero服务器后就生效了,它们负责监听对应的自定义资源(backup,schdule,restore),在监听到这些自定义资源后,验证它们,通过验证的资源将加入到velero的工作队列中,有序的完成它们对应的工作流程。Velero非常灵活,可以备份或还原群集中的所有对象,也可以按类型,命名空间或标签过滤对象。
备份工作流程
当运行velero backup create 时:
- Velero客户端调用Kubernetes API server以创建Backup对象;
- 该BackupController检测到Backup对象被创建并执行验证;
- BackupController开始备份过程,它通过向Kubernetes API server查询资源来收集要备份的数据;
- BackupController调用对象存储服务(例如AWS S3 : MinIO)上载备份文件。
默认情况下,velero backup create支持任何持久卷的磁盘快照,您可以通过指定其他标志来调整快照,运行velero backup create –help可以查看可用的标志,可以使用–snapshot-volumes=false选项禁用快照。
恢复工作流程
当运行 velero restore create 时:
1、Velero客户端调用Kubernetes API server以创建Restore对象;
2、该RestoreController 检测到Restore对象被创建并执行验证;
3、RestoreController 从对象存储服务中获取指定备份信息,并在备份的资源上运行一些预处理,以确保资源能在新的集群上工作。包括:
- 对资源进行排序,以确定Velero的恢复顺序;
- 通过Kubernetes Group Version Resource(GVR)甄别资源。如果资源无法被甄别,Velero将从恢复中排除它;
- 资源过滤筛选(例如选择某个namespace、排除某个namespace);
- 如果已配置–namespacemappings-restore选项,将验证目标命名空间;
- 保存在对象存储上的信息非常多,velero会整理过滤标准资源创建脚本,从恢复出与原来一样名称的资源。
4、RestoreController开始逐个恢复符合条件的资源。Velero将当前资源提取到Kubernetes资源对象中。根据您指定的资源类型和恢复选项,Velero将在尝试创建资源之前对资源进行以下修改或对目标集群进行准备:
5、RestoreController确保目标命名空间存在。如果目标命名空间不存在,RestoreController将在集群上创建一个新的命名空间;
6、如果资源是PersistentVolume(PV),RestoreController将重命名PV并重新映射其namespace;
7、如果资源是 PersistentVolumeClaim(PVC),RestoreController将修改PVC元数据;
RestoreController在目标集群上创建资源对象。如果资源是PV,则RestoreController将根据PV的备份方式从持久快照、文件系统备份或CSI快照中恢复PV数据;
8、默认情况下,Velero 执行的是非破坏性还原,意味着它不会删除目标集群上的任何数据。如果备份中的某个资源已经存在于目标集群中,Velero 将跳过该资源;
可以使用 –existing-resource-policy restore 标志来配置 Velero 使用更新策略, 当这个标志被设置为 update 时,Velero 将尝试更新目标集群中的现有资源,以匹配备份中的资源。
再现有k8s集群之上~
部署MinIo
创建minio数据目录
mkdir /data/minio -p
镜像下载
docker pull minio/minio:RELEASE.2022-08-08T18-34-09Z
创建minio容器
如果不指定,则默认使用用户名和密码为minioadmin/minioadmin,可以通过环境变量自定义,如下: docker run -d \ --name minio \ -p 9000:9000 \ -p 9999:9999 \ -v /data/minio:/minio \ --restart=always \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=12345678" \ minio/minio:RELEASE.2022-08-08T18-34-09Z \ server /minio --console-address '0.0.0.0:9999'
浏览器访问webui ip:9999
创建存储桶
存储桶名称 velerodata
部署velero客户端
下载velero客户端
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.5/velero-v1.9.5-linux-amd64.tar.gz
解压velero到/usr/local/bin
tar xf velero-v1.9.5-linux-amd64.tar.gz cd velero-v1.9.5-linux-amd64/ cp velero /usr/local/bin/
测试使用
velero --help
创建访问minio的认证文件
cat << EOF > /root/.velero-auth.txt [default] aws_access_key_id = admin aws_secret_access_key = 12345678 EOF
创建namespace
kubectl create ns velero-system
下载aws访问控制插件
docker pull velero/velero-plugin-for-aws:latest
执行安装velero服务端
#此处指定了velero安装到指定k8s的namespace中,后续操作均需要指定这个namespace velero install \ --kubeconfig /root/.kube/config \ --namespace velero-system \ --provider aws \ --plugins velero/velero-plugin-for-aws:latest \ --use-volume-snapshots=false \ --use-restic \ --bucket velerodata \ --secret-file /root/.velero-auth.txt \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://ip:9000
测试备份
默认命名空间
velero backup create backup \ --kubeconfig='/root/.kube/config' \ --include-namespaces default\ --namespace velero-system
查看备份结果
velero backup get --namespace velero-system
恢复备份
velero restore create --wait \ --from-backup backup \ --kubeconfig='/root/.kube/config' \ --include-namespaces default \ --existing-resource-policy=update \ --namespace velero-system
velero结合MinIo 备份完成~