一、Velero简介
Velero提供备份和恢复 Kubernetes 集群资源和持久卷的工具。
Velero功能:
- 对群集进行备份,并在丢失时进行还原。
- 将集群资源迁移到其他集群。
Velero 包括:
- 在群集上运行的服务器
- 在本地运行的命令行客户端
- 开源地址:https://github.com/vmware-tanzu/velero
- 官方文档:Velero
velero备份流程
- velero客户端调用kubernetes API Server创建backup任务
- Backup控制器基于watch机制通过Api Server获取到备份任务
- Backup控制器开始执行备份动作,会通过请求Api Server获取到需要备份的数据
- Backup 控制器将获取到的数据备份到指定的对象存储server端
二、准备后端存储
Velero支持很多种存储插件,可查看:Velero Docs - Providers获取插件信息,我们这里使用minio作为S3兼容的对象存储提供程序。也可以在任意地方部署Minio对象存储,只需要保证K8S集群可以访问到即可。
这里使用一台独立机器docker部署minio
1、下载minio的docker镜像
2、准备数据目录
# mkdri -pv /data/minio
3、docker部署minio
两个变量定义minio的用户、密码
MINIO_ROOT_USER
MINIO_ROOT_PASSWORD
一个管理端口9999,一个数据端口9000
容器正常启动后,通过浏览器访问http://IP:9999 输入上面定义的用户、密码即可登录
登录之后,创建一个Bucket,命名为velerodata
参考文章 Docker 搭建 Minio 容器 (完整详细版)_docker minio-CSDN博客
minio也可部署到 k8s集群里
三、安装velero
velero包含velero客户端和服务端,服务端需要部署在可以使用kubectl命令操作k8s集群的机器上,这里就安装在k8s的master上
从GitHub上搜索下载即可:Releases · vmware-tanzu/velero · GitHub
下载最新的release linux_amd64版本
将velero执行程序cp至/usr/local/bin/目录下即可,部署Server之前Server的版本是获取不到的
部署Server
先创建认证文件,把minio的用户名、密码写到这个文件
使用velero命令部署velero server
velero install \
--provider aws \
--image velero/velero:latest \
--plugins velero/velero-plugin-for-aws:v1.8.2 \
--bucket velerodata \
--secret-file /root/credentials-velero \
--use-node-agent \
--use-volume-snapshots=false \
--namespace velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.49.133.147:9000 \
--wait
# 执行install命令后会创建一系列清单,包括CustomResourceDefinition、Namespace、Deployment等。
这里遇到一个坑
有些节点上的node-agent pod总是起不来,查看日志报没有velero命令(这个是node-agent pod里容器的默认命令),后面通过检查发现报错的节点上的velero image不是最新的,但tag确实是latest,确实是个坑
旧版本镜像是45.5MB,新版本镜像是59.7MB,使用crictl重新下载正常的镜像,然后使用nerdctl工具把新版本镜像的tag改成docker.io/velero/velero:latest(与daemonset里的一致),之后pods成功启动
卸载velero
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
四、备份、恢复k8s上的资源
使用官方案例创建测试应用
创建备份
到minio上查看备份数据
测试恢复
先删除nginx-example名称空间里的所有资源
创建恢复,再检查nginx-example名称空间里的资源,可以看到名称空间里的资源恢复回来了
备份命令参数
恢复命令参数
批量备份名称空间脚本,这个脚本定时执行即可达到定时备份所有名称空间的目的
五、资源迁移
这个架构里有个巧妙的地方是,如果两个k8s集群上都有velero,并且velero的后端存储指向同一个Bucket,这样这个Bucket可以当做共享存储来用,即从集群A备份出来的数据,可以轻松恢复到集群B上,这样也相当于一个迁移动作。
如上个步骤备份的nginx-backup1220可以在另一个集群上恢复,如下是在集群B上恢复了nginx-backup1220,从svc的cluster-ip可以看到这是另一个集群
从这个过程得知,如果多个集群上的velero的后端存储指向相同的Bucket,velero的备份可以在多个集群上共享使用。
更多自定义的备份恢复,后面再补充。。。
参考文章 https://www.cnblogs.com/wubolive/p/17345716.html