Velero(Heptio Ark)v0.8.0 快速上手:基于 Minio 的 Kubernetes 备份与恢复完整实战指南
2026/9/17 11:44:37 网站建设 项目流程

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 由两部分组成:

  1. 服务端(Server):以 Deployment 形式运行在集群中,负责执行备份、恢复、快照等实际任务;
  2. 命令行客户端(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 完整展示了这套本地存储后端的组成,共三部分:

  1. Namespacevelero:Ark/Velero 服务端与 Minio 所在的命名空间;
  2. Deploymentminio:运行minio/minio:latest镜像,以server /storage --config-dir=/config启动,数据挂载在emptyDir卷上;环境变量MINIO_ACCESS_KEY=minioMINIO_SECRET_KEY=minio123是后续云存储凭据的来源,容器端口为 9000;
  3. Serviceminio(ClusterIP:9000):供集群内访问;清单注释明确提示:生产环境建议 ClusterIP,只有 Minikube 等测试环境才改用 NodePort;
  4. Jobminio-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标签的:

  • Namespacenginx-example(标签app: nginx);
  • Deploymentnginx-deployment(2 个副本,镜像nginx:1.17.6);
  • Servicemy-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=nginx

ark 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-resourcestrue是否纳入集群级(非命名空间级)资源
--snapshot-volumestrue是否对 PersistentVolume 做快照
--labels给备份对象附加的标签(key=value形式)
--ttl720h(30 天)备份可被垃圾回收前的保留时长
-o, --outputtable输出格式,可为table/json/yamlcreate场景下仅展示对象而不发送到服务端
-n, --namespaceheptio-arkArk 服务端所在命名空间

其中--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-backup

ark 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-resourcestrue是否恢复集群级资源
--restore-volumestrue是否从快照恢复卷
-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>

判断成功的标准是:STATUSCompleted,且WARNINGSERRORS均为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,其核心字段如下:

字段类型默认值含义
persistentVolumeProviderCloudProviderConfig无(可选)持久卷所在云厂商(用于快照)。若不配置,请求 PV 快照的备份/恢复会被判定为无效
persistentVolumeProvider/nameString原生支持aws/gcp/azure,其他厂商可通过外部插件支持
backupStorageProviderCloudProviderConfig必填实际存放备份的云存储厂商
backupStorageProvider/nameString必填备份存储厂商名
backupStorageProvider/bucketString必填备份上传的目标存储桶
backupSyncPeriodDuration60mArk 轮询对象存储、为既有备份文件创建对应 Backup 资源的频率
gcSyncPeriodDuration60m轮询对象存储、清理已过 TTL 的备份文件的频率
scheduleSyncPeriodDuration1m检查 Schedule 资源、判断是否需触发备份的频率
resourcePriorities[]string[namespaces, persistentvolumes, persistentvolumeclaims, secrets, configmaps]恢复资源的先后顺序;不在列表中的资源在所有优先资源之后恢复
restoreOnlyModeboolfalse开启后关闭备份、调度与过期备份删除功能,只允许从既有备份文件恢复

一个典型的 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: trues3Url: http://minio:9000(详见 cloud-common.md 对应的 AWS 配置小节)。

两大实战场景:灾难恢复与集群迁移

v0.8.0 的 use-cases.md 给出了两个官方推荐的落地场景。

场景一:灾难恢复(Schedule + 恢复专用模式)

  1. 服务端部署完成后,创建每日备份计划(每天 7:00 触发):

    ark schedule create <SCHEDULE NAME> --schedule "0 7 * * *"

    每次触发会生成名为<SCHEDULE NAME>-<TIMESTAMP>的 Backup 对象;

  2. 灾难发生,需要重建资源;

  3. 修改 Ark Config,将restoreOnlyMode设为true,防止恢复过程中有人误创建或误删备份;

  4. 用最近的备份执行恢复:

    ark restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>

场景二:集群迁移(同一云厂商)

前提是两个集群的 Config 指向同一个云对象存储桶,且由同一云厂商托管(再次强调:v0.8.0 不支持跨云厂商的持久卷迁移):

  1. 集群 1:若此前未做定期备份,先全量备份(默认 TTL 为 30 天/720 小时,可用--ttl调整):

    ark backup create <BACKUP-NAME>
  2. 集群 2:确保新集群的persistentVolumeProviderbackupStorageProvider字段与集群 1 一致,即指向同一个存储桶;

  3. 集群 2:等待 Ark 从对象存储同步出 Backup 对象(这正是backupSyncPeriod轮询机制的作用);

  4. 集群 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/commandpost.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询