更新时间:2023年2月
Velero 简介
官网:Velero
Velero 是一个开源的 Kubernetes 备份恢复工具,其前身是 Heptio Ark。可以对 Kubernetes 集群资源和持久卷 进行安全地备份和恢复,或者执行灾难恢复以及迁移
Velero 作用包括
- 备份和恢复集群数据
- 迁移集群资源
- 将生产集群负责到开发和测试集群
Velero 相关组件包括
- Server:服务端,运行在集群上
- Client:客户端,用户交互的命令行工具,与服务端通信完成备份操作
- 第三方对象存储:用于存储备份数据
支持的存储类型
Velero 工作原理
每个 Velero 操作都是一个自定义资源,安装 Velero 之后,由 Kubernetes 自定义资源定义(CRD),并存储在 etcd 中。除了自定义资源之外,Velero 还包括处理自定义资源所需的相关操作的控制器
按需备份
备份操作
- 将复制的 Kubernetes 对象压缩包上传到云端的对象存储
- 调用对象存储所提供的 API 以创建持久卷的磁盘快照
可以选择指定在备份期间执行一些触发操作(backup hooks)。例如,在拍摄快照之前将数据库内存缓冲区刷新到磁盘。详见 backup hooks 文档:Velero Docs - Backup Hooks
注:集群备份并不是严格的原子备份。如果备份时正在创建或编辑 Kubernetes 对象,则备份中可能不包含这些对象
计划备份
计划操作可以定期备份数据。您可以随时创建定时备份,然后按照定时的指定间隔执行备份。时间间隔由 Cron 表达式决定
Velero 将会以 <SCHEDULE NAME>-<TIMESTAMP>
格式来命名创建的备份。其中,<TIMESTAMP>
的格式为 YYYYMMDDHhmms
。详细信息可以参考:Velero Docs - Backup Reference
备份工作流程
当执行 velero backup create test-backup
时,备份流程如下
- Velero 客户端调用 Kubernetes API 服务(kube-apiserver),在 Kubernetes 中创建备份对象
- BackupController 会监控到新的 Backup 对象并执行验证
- BackupController 开始执行备份过程。通过向 API 服务查询资源来收集要备份的数据
- BackupController 调用对象存储服务(例如:AWS、S3),上传备份文件
默认情况下,velero 备份创建会创建任何持久卷的磁盘快照。可以通过指定其他的选项来调整快照备份策略。例如:可以使用选项 --snapshotvolumes=false
禁用快照。其他选项请参考:velero backup create --help
恢复
恢复操作可以从之前创建的备份中还原所有对象和持久卷,也可以仅恢复对象和持久卷的过滤子集
Velero 在恢复时,支持多个命名空间重新映射。例如,在单个还原中,命名空间 “abc” 中的对象可以在命名空间 “def” 下重新创建,而命名空间 “123” 中的目标可以在 “456” 下重新生成
Velero 默认恢复的备份名称为 <BACKUP NAME>-<TIMESTAMP>
,也可以指定备份恢复。其中,<TIMESTAMP>
的格式为 YYYYMMDDHhmms
。还原后的对象会包含一个标签 velero.io/restore-name
,值为 <RESTORE NAME>
默认情况下,备份存储位置以读写模式创建。但是,在恢复还原过程中,可以将备份存储位置配置为只读模式,禁用存储位置的备份创建和删除。确保在还原场景中不会无意中创建或删除备份
可以选择在还原期间或还原资源后执行一些触发操作(restore hooks)。例如:在数据库应用程序容器启动之前执行数据库还原操作。详见 restore hooks 文档:Velero Docs - How Velero Works
恢复工作流程
当执行 velero restore create
时,恢复流程如下:
- Velero 客户端调用 Kubernetes API 服务(kube-apiserver),在 Kubernetes 中创建 Restore 对象
- RestoreController 监控到新的 Restore 对象并执行验证
- RestoreController 从对象存储服务获取备份信息。然后对备份的资源进行一些预处理,以确保恢复的资源能够在集群上运行。例如:使用备份的 API 版本验证恢复资源是否可以在目标集群上运行
- RestoreController 启动还原过程,一次还原一个符合条件的资源
默认情况下,Velero 执行的是非破坏性恢复,这意味着它不会删除目标集群上的任何数据。如果目标集群中已经存在备份中的资源,Velero 将跳过该资源的恢复工作。可以通过选项指定将 Velero 的更新策略(默认为 --existing-resource-policy
)。当此标志设置为 update
时,Velero 会尝试更新目标集群中的已存在的资源
更多恢复相关操作请查阅:Velero Docs - Restore Reference
备份的 API 版本
Velero 默认会使用 Kubernetes API Server 的首选版本进行资源备份。还原资源时,目标集群中必须存在相同的 API 版本,才能成功还原
设置备份过期
创建备份时,可以通过 --ttl <DURATION>
选项来指定 TTL(生存时间)。如果 Velero 发现有备份资源已过期,则会进行删除以下相关资源
- 备份的资源
- 云端对象存储的备份文件
- 所有的 PersistentVolume 快照
- 所有关联的还原
TTL 标签允许用户以小时、分钟和秒为单位指定备份保留期,格式为 --ttl 24h0m0s
。如果未指定,将应用 30 天的默认 TTL 值
如果备份删除失败,则会在备份的自定义资源中添加标签 velero.io/gc-failure=<Reason>
。后续可以使用该标签筛选和选择未能删除的备份
备份删除失败可能原因如下:
- BSLNotFound:找不到备份的位置
- BSLCannotGet:由于未知原因,无法从 API 服务检索到备份存储位置
- BSLReadOnly:备份存储位置是只读的,无法执行删除
对象存储同步
Velero 会将对象存储作为正确的信息来源,不断检查以确保 Kubernetes 中始终存在正确的备份对象。如果存储桶中有一个格式正确的备份文件,但 Kubernetes API 中没有相应的备份对象,Velero 就会将对象存储中的信息同步到 Kubernetes
这就让 Velero 具备了集群迁移功能,允许恢复功能在迁移场景中工作,因为原始的备份对象在新集群中不存在,Velero 会自动同步对象存储中的信息到 Kubernetes
同理,如果一个已完成的备份对象(Completed)存在于 Kubernetes 中,但不存在于对象存储中。那么它将会被 Velero 从 Kubernetes 中删除
注:对象存储同步不会删除失败或部分失败的备份
安装配置 MinIO 单节点
本文采用 MinIO 作为 Velero 的云端存储,用于存储备份文件
安装流程官方文档:Install and Deploy MinIO — MinIO Object Storage for Container
MinIO 是一款高性能分布式对象存储服务器,专为大型私有云基础设施而设计。MinIO 支持在裸金属硬件上部署,也可以选择将过程管理的容器化
安装 MinIO
由于是单节点,选择使用 Docker 安装更加方便
$ mkdir -p /data/minio
$ docker run -d \
--restart=always \
-p 9000:9000 \
-p 9090:9090 \
--user $(id -u):$(id -g) \
--name minio \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minio520123" \
-v /data/minio:/data \
minio/minio server /data --console-address ":9090"
相关信息
/data/minio
:存储 minio 的数据,挂载到容器中- 端口 9000:API 端口
- 端口 9090:控制台(WEB)端口,可通过浏览器访问
MINIO_ROOT_USER
:设置控制台的 root 用户,默认为minioadmin
MINIO_ROOT_PASSWORD
:设置控制台的 root 用户的密码,默认为minioadmin
创建 bucket 及验证
登录控制台
登录成功
创建 bucket
安装 Velero
根据使用的对象存储不同, Velero 有不同的安装方式,详情请参阅:Velero Docs - Providers
此处使用 MinIO 作为对象存储,文档参考:Velero Docs - Quick start evaluation install with Minio
前置条件
- Kubernetes 版本 1.7 以上。注:文件系统的备份需要 Kubernetes 版本 1.10 以上
- Kubernetes 集群 DNS 插件已安装并正常工作
- 安装了
kubectl
命令行,并可以正常连接到集群 - MinIO 需要有足够的磁盘空间处理备份,如果 MinIO 空间小于 1G,则无法正常工作
安装客户端
版本发布 github 地址:Releases · vmware-tanzu/velero (github.com)
# 下载
$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.1/velero-v1.10.1-linux-amd64.tar.gz
# 解压
$ tar -zxvf velero-v1.10.1-linux-amd64.tar.gz