Velero(Heptio Ark)v0.8.0 快速上手:基于 Minio 的 Kubernetes 备份与恢复完整实战指南
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
导读
本文以 Velero 前身 Heptio Ark 的 v0.8.0 版本文档(site/content/docs/v0.8.0/_index.md)为骨架,完整复现一套「零成本本地演练」:在 Kubernetes 集群内用 Minio 充当 S3 兼容对象存储,从零部署 Ark Server 与客户端,对一个带标签选择器的示例 nginx 应用执行备份、模拟灾难删除、再通过恢复命令将其原样还原。读完本文,你将掌握 Ark/Velero 的备份、恢复、删除与清理全流程,并理解其 Config 自定义资源的核心参数以及灾难恢复、跨集群迁移两个典型使用场景。
Ark 是什么:Kubernetes 备份与恢复工具概览
Heptio Ark(即 Velero 的前身)是一套运行在 Kubernetes 生态中的备份与迁移工具,其能力在 v0.8.0 文档中被归纳为三点:
- 备份与灾难恢复:对集群资源(Deployment、Service、Namespace 等)及持久卷(Persistent Volume)进行备份,在发生损失时恢复,回到之前的可用状态;
- 跨云迁移:将集群资源从一个集群复制到另一个集群(注意:v0.8.0 明确指出云厂商间的持久卷迁移暂不支持,即
Cloud volume migrations are not yet supported); - 环境复制:把生产环境复制一份用于开发与测试环境。
从架构上看,Ark 由两部分组成:
- 服务端(Server):以 Deployment 形式运行在集群中,负责执行备份、恢复、快照等实际任务;
- 命令行客户端(CLI):运行在本地机器上,通过
ark命令与服务端交互。
这意味着:对象存储是备份数据的落脚点,而集群内运行的服务端负责编排,本地 CLI 只负责下发指令与查询状态。本文的演练就是围绕这一架构展开的。
环境与前置条件
按 v0.8.0 文档,开始演练前需要满足:
- 一个可访问的 Kubernetes 集群,版本 1.7 及以上;其中执行
ark backup delete需要1.7.5 及以上; - 集群内已配置DNS 服务(Ark 部署与 Minio 内部访问依赖 DNS 解析);
- 本机已安装kubectl,并已配置好访问集群的 kubeconfig。
获取 Ark 代码
Ark 的源码通过 Git 克隆获取,文档建议检出最新 tagged 版本,因为主干分支(main)处于活跃开发中,可能不稳定:
git clone git@github.com:heptio/ark.git说明:在当前仓库中,Ark 已演进为 Velero,命令名从
ark变为velero,示例资源也从heptio-ark命名空间迁移到了velero命名空间(详见 examples/minio/00-minio-deployment.yaml)。本文保留 v0.8.0 文档的原始命令以示历史原貌,并在相关小节给出仓库现状对照。
部署 Ark Server 与本地对象存储 Minio
为了简化演练、不依赖任何云厂商账号,文档选用Minio——一个运行在集群内的 S3 兼容对象存储服务——作为备份数据的存储后端。
在 Ark 仓库根目录执行:
kubectl apply -f examples/common/00-prereqs.yaml kubectl apply -f examples/minio/注:若遇到 Config 创建相关的报错,等待约一分钟后重试即可。 注:
examples/common/00-prereqs.yaml是 v0.8.0 时代的前置资源文件,在当前仓库中已并入examples/minio/目录(该目录下的清单自包含 Namespace 与所需 RBAC 资源),因此当前仓库可直接执行kubectl apply -f examples/minio/完成同样的事。
仓库中的 Minio 清单解析
当前仓库的 examples/minio/00-minio-deployment.yaml 完整展示了这套本地存储后端的组成,共三部分:
- Namespace
velero:Ark/Velero 服务端与 Minio 所在的命名空间; - Deployment
minio:运行minio/minio:latest镜像,以server /storage --config-dir=/config启动,数据挂载在emptyDir卷上;环境变量MINIO_ACCESS_KEY=minio、MINIO_SECRET_KEY=minio123是后续云存储凭据的来源,容器端口为 9000; - Service
minio(ClusterIP:9000):供集群内访问;清单注释明确提示:生产环境建议 ClusterIP,只有 Minikube 等测试环境才改用 NodePort; - Job
minio-setup:用minio/mc客户端在启动后自动执行两件事——mc alias set velero http://minio:9000 minio minio123建立别名,以及mc mb -p velero/velero创建名为velero的 bucket,这正是后续备份数据上传的目标存储桶。
部署示例应用 nginx
备份不能没有对象,文档使用一个带标签的示例应用作为演练目标:
kubectl apply -f examples/nginx-app/base.yaml该清单(examples/nginx-app/base.yaml)在nginx-example命名空间下创建了带app: nginx标签的:
- Namespace
nginx-example(标签app: nginx); - Deployment
nginx-deployment(2 个副本,镜像nginx:1.17.6); - Service
my-nginx(LoadBalancer 类型,端口 80)。
app: nginx这个标签正是后续--selector app=nginx备份过滤的依据。
验证部署结果
kubectl get deployments -l component=ark --namespace=heptio-ark kubectl get deployments --namespace=nginx-example第一条命令确认 Ark 服务端已就绪(在 v0.8.0 时期 Ark 组件带component=ark标签);第二条确认示例应用已运行。若按当前仓库清单演练,可将第一条替换为kubectl get deployments -n velero(当前仓库中 Minio 组件的标签为component: minio,见 examples/minio/00-minio-deployment.yaml)。
安装命令行客户端
服务端就绪后,在本地安装ark客户端。文档推荐两种方式:
- 下载预编译的 release 二进制(推荐,对应 v0.8.0 的发布产物);
- 从源码自行构建(对应文档中的 build-from-scratch 说明 所在章节)。
将客户端安装到$PATH中的某个目录即可直接使用ark命令。
创建第一个备份:标签选择器实战
备份命令的核心形态是ark backup create <NAME> [flags]。本演练只备份带有app=nginx标签的对象:
ark backup create nginx-backup --selector app=nginxark backup create常用参数
v0.8.0 的 CLI 参考文档(site/content/docs/v0.8.0/cli-reference/ark_backup_create.md)列出了完整参数,常用者如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
-l, --selector | <none> | 只备份匹配该标签选择器的资源(本演练即用它) |
--include-namespaces | *(全部) | 纳入备份的命名空间列表,如--include-namespaces nginx-example |
--exclude-namespaces | 空 | 从备份中排除的命名空间 |
--include-resources/--exclude-resources | */ 空 | 按resource.group格式(如storageclasses.storage.k8s.io)过滤资源类型 |
--include-cluster-resources | true | 是否纳入集群级(非命名空间级)资源 |
--snapshot-volumes | true | 是否对 PersistentVolume 做快照 |
--labels | 空 | 给备份对象附加的标签(key=value形式) |
--ttl | 720h(30 天) | 备份可被垃圾回收前的保留时长 |
-o, --output | table | 输出格式,可为table/json/yaml,create场景下仅展示对象而不发送到服务端 |
-n, --namespace | heptio-ark | Ark 服务端所在命名空间 |
其中--selector、--include-namespaces与--ttl是日常最常用的三个:前者做精准备份、中间者限定备份范围、后者控制备份生命周期。
模拟一场灾难
备份完成后,文档引导我们模拟集群事故——直接删除整个命名空间:
kubectl delete namespace nginx-example随后用三条命令确认资源确实已消失(应无任何输出):
kubectl get deployments --namespace=nginx-example kubectl get services --namespace=nginx-example kubectl get namespace/nginx-example注意:命名空间的清理可能需要几分钟,属正常现象,请耐心等待完全删除后再进入下一步。
执行恢复:把删掉的东西找回来
在「灾难」现场,只需一条命令即可从nginx-backup备份中恢复:
ark restore create --from-backup nginx-backupark restore create常用参数
v0.8.0 的 CLI 参考文档(site/content/docs/v0.8.0/cli-reference/ark_restore_create.md)显示该命令支持自定义恢复名称与多种过滤/映射参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--from-backup | 必填 | 指定从哪个备份恢复 |
[RESTORE_NAME] | 自动生成 | 恢复名称可省略,默认形如<backup>-<timestamp> |
--namespace-mappings | 空 | 命名空间映射,格式src1:dst1,src2:dst2,...,用于把资源恢复到不同命名空间 |
--include-namespaces/--exclude-namespaces | */ 空 | 与备份命令同理,限定恢复范围 |
--include-resources/--exclude-resources | */ 空 | 按资源类型过滤 |
--include-cluster-resources | true | 是否恢复集群级资源 |
--restore-volumes | true | 是否从快照恢复卷 |
-l, --selector | <none> | 只恢复匹配标签选择器的资源 |
查看恢复进度与结果
ark restore get恢复期间状态列显示InProgress,完成后变为Completed。文档给出了一个典型的输出样例:
NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR nginx-backup-20170727200524 nginx-backup Completed 0 0 2017-07-27 20:05:24 +0000 UTC <none>判断成功的标准是:STATUS为Completed,且WARNINGS与ERRORS均为0。此时nginx-example命名空间内的所有对象应已恢复到删除前的状态。
注意:恢复本身可能耗时数分钟,期间状态列为
InProgress属正常现象。
深入排查:ark restore describe
若恢复报告了警告或错误,可用ark restore describe <RESTORE_NAME>查看明细。v0.8.0 的调试文档(site/content/docs/v0.8.0/debugging-restores.md)详细解释了输出结构——无论结果好坏,Ark 都会把状态置为Completed,差异体现在 WARNINGS/ERRORS 两列的数字上,典型输出如下:
Name: backup-test-20170726180512 Namespace: heptio-ark ... Backup: backup-test Namespaces: Included: * Excluded: <none> Resources: Included: serviceaccounts Excluded: nodes, events, events.events.k8s.io Cluster-scoped: auto Namespace mappings: <none> Label selector: <none> Restore PVs: auto Phase: Completed Validation errors: <none> Warnings: Ark: <none> Cluster: <none> Namespaces: kube-system: serviceaccounts "attachdetach-controller" already exists ... Errors: Ark: <none> Cluster: <none> Namespaces: <none>错误与警告按同样结构组织,分三层:
- Ark:Ark 服务端自身的系统性问题(如无法读取目录);
- Cluster:集群级(cluster-scoped)资源恢复时遇到的问题;
- Namespaces:以命名空间为键的映射,列出各命名空间内资源恢复的问题。
错误(Errors)代表恢复不完整或部分失败;警告(Warnings)则是非阻塞问题——比如上例中大量serviceaccounts "xxx" already exists,表示资源已存在、恢复逻辑跳过但整体依然正常。
清理:删除备份与卸载
删除备份数据
ark backup delete <BACKUP_NAME>会请求 Ark 服务端删除与指定备份关联的全部数据——包括对象存储中的备份文件和持久卷快照:
ark backup delete BACKUP_NAME相关 CLI 文档(site/content/docs/v0.8.0/cli-reference/ark_backup_delete.md)显示该命令需要--confirm标志确认删除。注意事项:
- 每个需要删除的备份都必须单独执行一次;v0.8.0 文档说明,未来版本将支持按名称或标签选择器批量删除;
- 删除彻底完成后,
ark backup get BACKUP_NAME将不再看到该备份。
保留数据地卸载 Ark
如果只想卸载 Ark 而保留对象存储与快照中的备份数据,可以安全地删除演练创建的所有资源:
kubectl delete -f examples/common/ kubectl delete -f examples/minio/ kubectl delete -f examples/nginx-app/base.yaml进阶:Config 自定义资源与核心参数
Ark 通过自定义资源Config(一个名为default、位于heptio-ark命名空间的对象)来指定云存储与备份行为。服务端首次启动后会一直等待defaultConfig 创建完成;若运行中修改 Config,服务端会优雅退出,待 kubelet 重启 Pod 后应用新配置。完整的参数参考见 site/content/docs/v0.8.0/config-definition.md,其核心字段如下:
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
persistentVolumeProvider | CloudProviderConfig | 无(可选) | 持久卷所在云厂商(用于快照)。若不配置,请求 PV 快照的备份/恢复会被判定为无效 |
persistentVolumeProvider/name | String | 无 | 原生支持aws/gcp/azure,其他厂商可通过外部插件支持 |
backupStorageProvider | CloudProviderConfig | 必填 | 实际存放备份的云存储厂商 |
backupStorageProvider/name | String | 必填 | 备份存储厂商名 |
backupStorageProvider/bucket | String | 必填 | 备份上传的目标存储桶 |
backupSyncPeriod | Duration | 60m | Ark 轮询对象存储、为既有备份文件创建对应 Backup 资源的频率 |
gcSyncPeriod | Duration | 60m | 轮询对象存储、清理已过 TTL 的备份文件的频率 |
scheduleSyncPeriod | Duration | 1m | 检查 Schedule 资源、判断是否需触发备份的频率 |
resourcePriorities | []string | [namespaces, persistentvolumes, persistentvolumeclaims, secrets, configmaps] | 恢复资源的先后顺序;不在列表中的资源在所有优先资源之后恢复 |
restoreOnlyMode | bool | false | 开启后关闭备份、调度与过期备份删除功能,只允许从既有备份文件恢复 |
一个典型的 AWS + Minio 场景 Config 示例:
apiVersion: ark.heptio.com/v1 kind: Config metadata: namespace: heptio-ark name: default persistentVolumeProvider: name: aws config: region: us-west-2 backupStorageProvider: name: aws bucket: ark config: region: us-west-2 backupSyncPeriod: 60m gcSyncPeriod: 60m scheduleSyncPeriod: 1m restoreOnlyMode: false其中若使用 Minio 等本地 S3 兼容存储,需要在backupStorageProvider/config中设置s3ForcePathStyle: true与s3Url: http://minio:9000(详见 cloud-common.md 对应的 AWS 配置小节)。
两大实战场景:灾难恢复与集群迁移
v0.8.0 的 use-cases.md 给出了两个官方推荐的落地场景。
场景一:灾难恢复(Schedule + 恢复专用模式)
服务端部署完成后,创建每日备份计划(每天 7:00 触发):
ark schedule create <SCHEDULE NAME> --schedule "0 7 * * *"每次触发会生成名为
<SCHEDULE NAME>-<TIMESTAMP>的 Backup 对象;灾难发生,需要重建资源;
修改 Ark Config,将
restoreOnlyMode设为true,防止恢复过程中有人误创建或误删备份;用最近的备份执行恢复:
ark restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
场景二:集群迁移(同一云厂商)
前提是两个集群的 Config 指向同一个云对象存储桶,且由同一云厂商托管(再次强调:v0.8.0 不支持跨云厂商的持久卷迁移):
集群 1:若此前未做定期备份,先全量备份(默认 TTL 为 30 天/720 小时,可用
--ttl调整):ark backup create <BACKUP-NAME>集群 2:确保新集群的
persistentVolumeProvider与backupStorageProvider字段与集群 1 一致,即指向同一个存储桶;集群 2:等待 Ark 从对象存储同步出 Backup 对象(这正是
backupSyncPeriod轮询机制的作用);集群 2:确认
<BACKUP-NAME>可见后执行恢复:ark restore create --from-backup <BACKUP-NAME>
排障与社区
遇到问题时,文档给出的路径是:先查阅 troubleshooting.md 排障文档,若未解决可在仓库提交 Issue。此外,v0.8.0 文档还提到开发者可通过邮件列表参与讨论,提交 Pull Request 前需先了解 CONTRIBUTING 规范(仓库根目录 CONTRIBUTING.md) 与行为准则。
从 Ark 到 Velero:仓库现状对照
需要特别说明的是,本仓库已是 Ark 更名后的 Velero 项目:
- CLI 命令由
ark演变为velero,命名空间由heptio-ark演变为velero(可对比 cmd/velero/velero.go 与 examples/minio/00-minio-deployment.yaml); - v0.8.0 时代的
examples/common/00-prereqs.yaml已并入examples/minio/目录; - 带 PV 的演练清单已演化为 examples/nginx-app/with-pv.yaml,其中还加入了备份/恢复钩子注解(
pre.hook.backup.velero.io/command与post.hook.backup.velero.io/command,示例中用fsfreeze冻结/解冻文件系统以保证卷数据一致性),并可通过 PVC(nginx-logs,50Mi)测试 PV 快照能力。
无论 CLI 与命名空间如何变化,本文基于 v0.8.0 文档还原的「部署服务端 → 创建备份 → 模拟灾难 → 恢复验证 → 清理卸载」这一核心链路,至今仍是理解 Velero 工作原理与上手实践的最快路径——本文所有命令均可按仓库当前清单在当前集群中复现。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考