
Velero 前身 Heptio Ark 架构解析Kubernetes 备份、恢复与定时调度全流程指南【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本文基于当前仓库site/content/docs/v0.8.0/about.mdHeptio Ark v0.8.0 官方文档撰写并补充了同版本 API 类型定义、Config 配置参考、CLI 参考及仓库源码佐证。Heptio Ark 是 Velero 的前身与演进基础理解 Ark 的备份/恢复/调度三大操作模型是掌握 Velero 备份体系备份控制器、对象存储同步、TTL 回收等的最佳入口。一、Ark 是什么为 Kubernetes 提供可定制粒度的灾备能力Heptio Ark 为 Kubernetes 集群中的所有对象Pod、Deployment、Job、Custom Resource Definition 等以及持久卷Persistent Volume提供可自定义粒度的恢复能力。这种恢复可以是集群级的全量恢复也可以精细到按**对象类型object type、命名空间namespace或标签labels**进行过滤后的定向恢复。因此 Ark 是**灾难恢复Disaster Recovery**场景的理想选择同时也可以用于在执行集群系统级操作例如集群升级之前先对应用状态进行快照留存——即变更前留底。二、核心特性三大操作全部以自定义资源CRD驱动Ark 提供三类操作按需备份On-demand backups定时备份Scheduled backups恢复Restores每一类操作都是一个自定义资源Custom Resource通过 Kubernetes 的 CRD 机制定义并存储在etcd中。除此之外还有一个额外的自定义资源Config用于指定必需的云厂商信息和定制化选项如云提供商设置。这些资源由对应的**自定义控制器custom controllers处理当请求被提交到 Kubernetes API server 时每个控制器会监听watch**其对应的自定义资源执行校验并处理与云厂商 API 交互的逻辑——例如管理对象存储和持久卷快照。从当前仓库源码可以印证这一设计Ark 演进为 Velero 后Backup、Schedule、Restore的类型定义分别位于 pkg/apis/velero/v1/backup_types.go、pkg/apis/velero/v1/schedule_types.go 和 pkg/apis/velero/v1/restore_types.go对应的控制器实现则在 pkg/controller/ 目录下如 backup_controller.go。2.1 按需备份Backupbackup操作完成两件事将复制的 Kubernetes 对象打包成 tarball上传到云对象存储若指定了快照调用云厂商 API 对持久卷做磁盘快照。你还可以在备份期间**可选地指定钩子hooks**在容器内执行命令。例如在拍快照之前可能需要先让数据库把内存缓冲区刷盘flush 到磁盘。详见 Hooks 文档。需要注意集群备份并非严格原子操作。如果在备份过程中有 Kubernetes 对象正在被创建或编辑它们可能不会被包含进备份文件。捕获到不一致信息的概率很低但理论上存在这种可能。2.2 定时备份Scheduleschedule操作允许你按固定时间间隔备份数据。第一次备份在 schedule 创建时立即执行后续备份则按指定的时间间隔发生间隔由Cron 表达式指定。Schedule 本质上是 Backup 的包装器wrapper当被触发时它在后台创建对应的 Backup 对象。定时备份产生的备份资源命名规则为SCHEDULE NAME-TIMESTAMP其中TIMESTAMP的格式为YYYYMMDDhhmmss。2.3 恢复Restorerestore操作允许你从之前创建的 Backup 中恢复所有对象和持久卷。Ark 支持多命名空间重映射namespace remapping——例如在单次恢复中命名空间abc下的对象可以被重建到def下同时123下的对象可以恢复到456下。恢复出来的 Kubernetes 对象可以通过如下标签识别ark-restoreBACKUP NAME-TIMESTAMP同样TIMESTAMP格式为YYYYMMDDhhmmss。此外你还可以让 Ark 服务运行在restore-only仅恢复模式下该模式会在灾备期间禁用 backup、schedule 和垃圾回收功能避免误操作破坏恢复现场。三、备份工作流从一条 CLI 命令到对象存储文档给出了执行ark backup create test-backup后的完整链路Ark 客户端调用 Kubernetes API server创建一个Backup对象BackupController发现新的Backup对象并执行校验validationBackupController 开始备份流程通过查询 API server收集collect待备份的资源数据BackupController 调用对象存储服务例如 AWS S3上传备份文件。该流程的架构示意图如下图源 site/content/docs/v0.8.0/img/backup-process.png默认情况下ark backup create会对所有持久卷制作磁盘快照。可以通过额外标志flags调整快照行为例如用--snapshot-volumesfalse禁用快照。完整的ark backup create参数如下出处ark_backup_create.mdark backup create NAME [flags] --exclude-namespaces stringArray 从备份中排除的命名空间 --exclude-resources stringArray 从备份中排除的资源格式为 resource.group如 storageclasses.storage.k8s.io --include-cluster-resources optionalBool[true] 是否包含集群级资源 --include-namespaces stringArray 要包含的命名空间用 * 表示所有命名空间(默认 *) --include-resources stringArray 要包含的资源默认 * --labels mapStringString 应用到备份上的标签 -l, --selector labelSelector 只备份匹配该标签选择器的资源 --snapshot-volumes optionalBool[true] 是否作为备份的一部分对 PersistentVolume 拍快照 --ttl duration 备份多久之后可以被垃圾回收 (默认 720h0m0s)四、Backup 对象的完整定义API 类型Backup属于 API 组版本ark.heptio.com/v1。下面是根据 Backup API Type 文档整理的带字段注释的完整示例——这也是ark backup create在背后生成的 CR 对象形态apiVersion: ark.heptio.com/v1 kind: Backup metadata: name: a namespace: heptio-ark # 0.7.0 之后可为任意字符串但必须是 Ark server 所在命名空间 spec: # 要包含的命名空间未指定则包含全部可选 includedNamespaces: - * # 要排除的命名空间可选 excludedNamespaces: - some-namespace # 要包含的资源支持缩写如 po 代表 pods未指定则包含全部可选 includedResources: - * # 要排除的资源可选 excludedResources: - storageclasses.storage.k8s.io # 是否包含集群级资源。取值 true / false / null。 # 未设置时仅当包含全部命名空间且无排除时才包含全部集群级资源 # 只要 included/excludedNamespaces 指定了具体命名空间则只备份与 # 被包含的命名空间级资源相关联的集群级资源如随 PVC 一起备份其 PV。 includeClusterResources: null # 个体对象必须匹配该标签选择器才会被包含进备份可选 labelSelector: matchLabels: app: ark component: server # 是否对卷拍快照仅对 Azure、GCE、AWS 的 PersistentVolume 生效。 # 取值 true / false / null未设置时只要配置了 PV provider 就会执行快照。 snapshotVolumes: null # 该备份多久后进入可被垃圾回收的状态 ttl: 24h0m0s # 备份过程中不同阶段执行的动作目前唯一支持的 hook 是通过 pod exec API # 在 Pod 容器内执行命令可选 hooks: resources: - name: my-hook includedNamespaces: - * excludedNamespaces: - some-namespace includedResources: - pods # 目前仅支持 pods excludedResources: [] labelSelector: matchLabels: app: ark component: server # 在自定义动作custom actions执行之前运行的 hook目前仅支持 exec # 已废弃改用 pre hooks: # 内容与下面的 pre 相同 pre: - exec: container: my-container # 未指定则使用 Pod 的第一个容器可选 command: # 要执行的命令数组形式必填 - /bin/uname - -a onError: Fail # 出错时的处理方式Fail / Continue默认 Fail可选 timeout: 10s # 命令最长等待时间默认 30 秒可选 # 在所有自定义动作及附加项处理完成后执行的 hook目前仅支持 exec post: # 内容与上面的 pre 相同 status: expiration: null # 可被垃圾回收的时间点 phase: # 取值New / FailedValidation / InProgress / Completed / Failed validationErrors: null # 校验错误列表 version: 1 # 当前仅支持版本 1 volumeBackups: # 恢复时需要的 PV 信息 some-pv-name: snapshotID: snap-1234 # 云厂商侧为本次备份创建的快照 ID type: io1 # 云厂商 API 中的卷类型 availabilityZone: my-zone # 卷所在可用区 iops: 10000 # 卷的预置 IOPS可选提示关于 hook 的另一种指定方式——直接在 Pod 上加注解annotation。Ark 支持pre.hook.backup.ark.heptio.com/{container,command,on-error,timeout}与post.hook.backup.ark.heptio.com/*v0.7.0两套注解其中on-error默认Fail、timeout默认30scommand需以 JSON 数组形式给出如[/usr/bin/uname, -a]。完整表格与示例见 Hooks 文档。五、Ark Config云厂商与服务器行为配置Ark 定义了属于自己的Config 对象一种自定义资源用于指定备份与云厂商设置。Ark server 首次部署后会等待你在heptio-ark命名空间中创建名为default的 Config。注意前提是 Ark server 以 Kubernetes Deployment 方式运行。若defaultConfig 被修改server 会优雅关闭gracefully shut down待 kubelet 重启 Ark server Pod 后再使用更新后的配置。5.1 示例 ConfigapiVersion: 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: false5.2 主配置参数参考Key类型默认值含义persistentVolumeProviderCloudProviderConfig无可选集群用于持久卷将被快照的云厂商配置。若未指定请求 PV 快照/恢复的 Backup、Restore 会被视为无效。注意Azure 需要 Kubernetes 1.7.2 才支持托管磁盘快照。persistentVolumeProvider/nameStringArk 原生支持aws、gcp、azure其他厂商可通过外部插件无可选集群持久卷所用云厂商名称persistentVolumeProvider/configmap[string]string无可选传给持久卷云厂商的配置键/值backupStorageProviderCloudProviderConfig必填实际存储备份的云厂商配置backupStorageProvider/nameString必填实际存储备份的云厂商名称backupStorageProvider/bucketString必填备份上传的存储桶backupStorageProvider/configmap[string]string无可选传给备份存储云厂商的配置键/值backupSyncPeriodmetav1.Duration60m0sArk 查询对象存储、确保为已有备份文件创建了对应 Backup 资源的频率gcSyncPeriodmetav1.Duration60m0sArk 查询对象存储、删除已超过 TTL 的备份文件的频率scheduleSyncPeriodmetav1.Duration1m0sArk 检查 Schedule 资源对象、判断是否需要发起备份的频率resourcePriorities[]string[namespaces, persistentvolumes, persistentvolumeclaims, secrets, configmaps]恢复时资源对象的恢复顺序也支持RESOURCE.GROUP格式。未列入的资源在优先资源之后恢复restoreOnlyModeboolfalse开启后backup、schedule 及过期备份删除功能全部关闭仅从对象存储中的既有备份文件执行恢复5.3 云厂商专属参数AWS或其他 S3 兼容存储——backupStorageProvider/configKey类型默认值含义regionstring必填例us-east-1s3ForcePathStyleboolfalse使用 Minio 等本地存储服务时设为trues3Urlstring非 AWS 托管存储必填例http://minio:9000。Ark 可由region与bucket自动推导 AWS S3 URL此字段主要用于 Minio 等本地存储kmsKeyIdstring空指定 AWS KMS key id 或别名如alias/KMS-Key-Alias-Name以启用 S3 备份加密仅适用于 AWS S3可能需要显式授予密钥使用权限AWS——persistentVolumeProvider/configKey类型默认值含义regionstring必填例us-east-1GCPbackupStorageProvider/config与persistentVolumeProvider/config均无需参数。AzurebackupStorageProvider/config无需参数persistentVolumeProvider/config仅一项Key类型默认值含义apiTimeoutmetav1.Duration2m0sAzure API 请求超时前的等待时长完整参数说明见 Ark Config definition 文档。六、设置备份过期TTL创建备份时可以通过--ttl DURATION标志指定 TTL。当 Ark 发现某个 Backup 资源已过期时会删除Backup 资源本身云对象存储中的备份文件所有 PersistentVolume 快照所有与之关联的 Restore。该机制由gcSyncPeriod默认 60 分钟周期驱动Ark 会按此频率查询对象存储删除已超过 TTL 的备份文件。在 Backup API 定义 中过期时间点记录在status.expiration字段ark backup create的默认 TTL 为720h30 天。七、对象存储同步把对象存储作为事实来源Ark将对象存储视为事实来源source of truth持续检查确保正确的 Backup 资源始终存在。如果存储桶中存在格式正确的备份文件但 Kubernetes API 中没有对应的 Backup 资源Ark 会把信息从对象存储同步到 Kubernetes——即在集群中重建对应的 Backup 资源对象。这一机制使**集群迁移cluster migration**场景下的恢复成为可能当原集群的 Backup 对象在新集群中不存在时只要备份文件还在对象存储中新集群的 Ark 就能通过同步找回这些备份并执行恢复。同步周期由 Config 中的backupSyncPeriod默认 60 分钟控制对应的实现可参考 backup_sync_controller.go。八、实践小结Ark v0.8.0 的完整使用闭环结合 CLI 参考目录 与本文内容Ark 的核心操作闭环可归纳为部署 server 并创建 Configark server参考 ark_server.md并在heptio-ark命名空间创建名为default的 Config 以声明云厂商与周期参数按需备份ark backup create NAME配合--include-namespaces、--selector、--snapshot-volumes、--ttl等标志控制粒度与行为定时备份ark create schedule NAME --schedule0 */6 * * *Cron 五段式分/时/日/月/周各字段可取值0-59,*、0-23,*、1-31,*、1-12,*、0-7,*详见 ark_create_schedule.md恢复ark restore create [RESTORE_NAME] --from-backup BACKUP_NAME支持--namespace-mappings src1:dst1,src2:dst2,...做多命名空间重映射、--restore-volumesfalse跳过卷恢复详见 ark_create_restore.md灾备模式在 Config 中开启restoreOnlyMode: true让 Ark 只从对象存储恢复禁用备份、调度与 GC。这套CRD 定义操作 控制器监听执行 对象存储作为事实来源的架构构成了后来 Velero 备份体系的核心骨架——理解 Ark v0.8.0 的这一模型即可顺藤摸瓜读懂 Velero 各控制器与 API 类型的演进脉络。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考