ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Velero(Ark)Backup Hooks 完全指南:基于 Pod 注解与 Backup Spec 的备份钩子机制

Velero(Ark)Backup Hooks 完全指南:基于 Pod 注解与 Backup Spec 的备份钩子机制 VeleroArkBackup Hooks 完全指南基于 Pod 注解与 Backup Spec 的备份钩子机制【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero导读本指南以仓库内 site/content/docs/v0.7.1/hooks.md 为核心系统讲解 Velero 前身 Heptio Ark 自 v0.7.0 起引入的 Backup Hooks备份钩子机制在备份 Pod 的过程中通过 pod exec API 在指定容器内执行预置命令从而在卷快照前后完成应用级的数据一致性操作如冻结文件系统。读完本文你将掌握 pre/post 两类钩子的执行时机、Pod 注解与 Backup Spec 两种声明方式、全部注解/字段的参数语义以及基于源码的执行原理与从 Ark 到 Velero 的注解演进。说明v0.7.1 文档所处的 Heptio Ark 时代项目注解域名为ark.heptio.com当前仓库的现代版本已统一演化为velero.io详见文末 演进章节两者语法结构完全一致可对照使用。什么是 Backup HooksBackup Hooks 允许你在执行备份时指定一条或多条命令在该 Pod 被备份时于其某个容器内执行。这一能力由 Heptio Ark 率先支持并完整继承至 Velero。典型用途是保证卷快照的数据一致性pre 钩子在快照前运行用于完成磁盘 I/O 的收尾例如fsfreeze --freeze冻结文件系统使所有待处理的磁盘 I/O 全部落盘随后 Ark 对磁盘执行快照post 钩子在快照完成后运行解除冻结状态例如fsfreeze --unfreeze。钩子的执行不是经由 Shell而是直接通过 Kubernetes 的pod exec API在目标容器内启动进程源码注释明确说明ExecHook is a hook that uses the pod exec API to execute a command in a container in a pod见 pkg/apis/velero/v1/backup_types.go#L261-L262。Pre 与 Post 钩子的执行时机v0.7.1 文档明确定义了两类钩子的执行阶段钩子类型执行时机引入版本pre 钩子在任何自定义 Action 处理之前执行v0.7.0 之前即已支持v0.7.0 起带pre.前缀post 钩子在所有自定义 Action 完成、且自定义 Action 所追加的附加资源项additional items也全部备份完成之后执行v0.7.0 起支持后者的语义非常关键post 钩子不仅等待自定义插件逻辑结束还要等这些插件递归扩展出的附属资源全部入库确保冻结 → 全量落盘 → 解冻的闭环没有遗漏。从当前仓库源码可以印证这一时序。在 pkg/backup/backup.go 中pre 钩子由handleItemBlockPreHooks逐 Pod 调用itemHookHandler.HandleHooks(..., hook.PhasePre, ...)L917-L931而 post 钩子的执行被handleItemBlockPostHooks包裹且必须等待该 Pod 相关的 PodVolumeBackupPVB全部处理完成后才逐个执行waitUntilPVBsProcessed见 L934-L949。这保证了快照/文件级备份真正结束后post 钩子如fsfreeze --unfreeze才被触发。另外需要注意现代版本Velero 1.15引入 ItemBlock 机制后若一个 ItemBlock 包含多个 Pod如多个 Pod 共享一个 RWX 卷会先对所有 Pod 执行 pre 钩子再备份资源最后统一执行所有 post 钩子以保持多 Pod 间的冻结窗口一致。方式一通过 Pod 注解指定钩子v0.7.1 文档提供了在 Pod 上直接声明钩子的方式——备份 Pod 时Ark 读取以下注解并据此执行命令。Pre 钩子注解注解名说明pre.hook.backup.ark.heptio.com/container执行命令的容器名。默认为 Pod 中的第一个容器。可选。pre.hook.backup.ark.heptio.com/command要执行的命令。需要多个参数时以 JSON 数组形式给出如[/usr/bin/uname, -a]pre.hook.backup.ark.heptio.com/on-error命令返回非零退出码时的处理策略。默认为Fail。合法值为Fail与Continue。可选。pre.hook.backup.ark.heptio.com/timeout命令执行的最大等待时长超时即视为钩子执行出错。默认为 30s。可选。Post 钩子注解v0.7.0注解名说明post.hook.backup.ark.heptio.com/container执行命令的容器名。默认为 Pod 中的第一个容器。可选。post.hook.backup.ark.heptio.com/command要执行的命令。多参数时以 JSON 数组形式给出如[/usr/bin/uname, -a]post.hook.backup.ark.heptio.com/on-error命令返回非零退出码时的处理策略。默认为Fail。合法值为Fail与Continue。可选。post.hook.backup.ark.heptio.com/timeout命令执行的最大等待时长超时即视为钩子执行出错。默认为 30s。可选。旧版已废弃注解的兼容v0.7.0 继续兼容最初的 pre 钩子写法——去掉pre.前缀的旧注解名例如hook.backup.ark.heptio.com/container依然有效。源码中的回退逻辑位于 internal/hook/item_hook_handler.go#L219-L224当阶段为 pre 且带前缀的注解不存在时会尝试读取无阶段前缀的注解键。注解解析的源码细节从 internal/hook/item_hook_handler.go 可以看到注解解析的若干边界行为command注解必须存在否则视为没有钩子getPodExecHookFromAnnotations对空命令直接返回 nil见 L335-L339command若以[开头则按 JSON 数组解析解析失败时退化为单元素命令parseStringToCommand见 L366-L383on-error注解取值若非Continue/Fail会被忽略并交由默认行为处理L343-L346timeout使用time.ParseDuration解析格式非法时打印警告并使用默认值 30sL348-L356。方式二通过 Backup Spec 指定钩子除 Pod 注解外钩子也可以在Backup 对象规格spec中集中声明从而对一类资源如所有带特定标签的 Pod统一生效。完整的字段说明见 Backup API 类型文档。以下为 Backup spec 中hooks字段的完整声明示例节选自 site/content/docs/v0.7.1/api-types/backup.md 的备份对象全字段示例apiVersion: ark.heptio.com/v1 kind: Backup metadata: name: a namespace: heptio-ark spec: includedNamespaces: - * includedResources: - * hooks: resources: - # 钩子名称会显示在备份日志中。 name: my-hook # 该钩子适用的命名空间未指定时对所有命名空间生效。可选。 includedNamespaces: - * # 不适用的命名空间。可选。 excludedNamespaces: - some-namespace # 适用的资源当前仅支持 pods。 includedResources: - pods # 不适用的资源。可选。 excludedResources: [] # 仅对匹配该标签选择器的对象生效。可选。 labelSelector: matchLabels: app: ark component: server # 在自定义 Action 执行之前运行的钩子数组。当前仅支持 exec 类型。 # 已废弃请改用 pre。 hooks: # 在自定义 Action 执行之前运行的钩子数组。当前仅支持 exec 类型。 pre: - # 钩子类型必须为 exec。 exec: # 执行命令的容器名。未指定时使用 Pod 中的第一个容器。可选。 container: my-container # 要执行的命令数组形式。必填。 command: - /bin/uname - -a # 命令执行出错时的处理方式。合法值为 Fail 与 Continue。默认为 Fail。可选。 onError: Fail # 等待命令执行完成的最大时长。默认为 30 秒。可选。 timeout: 10s # 在所有自定义 Action 及附加资源项处理完成后运行的钩子数组。 # 当前仅支持 exec 类型。 post: # 内容与 pre 相同。字段语义与源码佐证hooks.resources[]中每个条目的结构与源码中的类型定义一一对应见 pkg/apis/velero/v1/backup_types.go#L211-L253name钩子名用于日志与钩子结果追踪中的标识includedNamespaces/excludedNamespaces命名空间过滤配合 labelSelector 组成资源选择器ResourceHookSelector在 internal/hook/item_hook_handler.go#L385-L410 中通过applicableTo判定是否命中namespace 包含排除关系、资源组名、标签选择器三者同时满足才触发pre/post分别对应PreHooks与PostHooks两个[]BackupResourceHook数组其中exec钩子的四个子字段container、command、onError、timeout定义于ExecHookL261-L280command为必填数组MinItems1onError枚举值为Continue/FailHookErrorModeL282-L294Fail钩子出错即停止执行后续钩子并向上返回错误Continue钩子出错可接受备份继续执行后续钩子。timeout为metav1.Duration类型。在 internal/hook/item_hook_handler.go#L254-L305 的实现中spec 方式的钩子按选择器过滤后依序执行一旦某个钩子以Fail模式失败后续钩子将不再执行modeFailError非空即停止但所有钩子的尝试记录仍会被收集。实战示例使用 pre/post 钩子冻结文件系统文档给出的经典场景是用fsfreeze保证快照一致性pre 钩子执行fsfreeze --freeze冻结文件系统 → Ark 完成磁盘快照 → post 钩子执行fsfreeze --unfreeze解除冻结。仓库中的 examples/nginx-app/with-pv.yaml 是一个可直接运行的完整示例其中 Deployment 的 Pod 模板通过注解声明了一对冻结/解冻钩子现代版本使用velero.io域名apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: nginx-example spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx annotations: pre.hook.backup.velero.io/container: fsfreeze pre.hook.backup.velero.io/command: [/sbin/fsfreeze, --freeze, /var/log/nginx] post.hook.backup.velero.io/container: fsfreeze post.hook.backup.velero.io/command: [/sbin/fsfreeze, --unfreeze, /var/log/nginx] spec: volumes: - name: nginx-logs persistentVolumeClaim: claimName: nginx-logs containers: - image: nginx:1.17.6 name: nginx volumeMounts: - mountPath: /var/log/nginx name: nginx-logs - image: ubuntu:bionic name: fsfreeze securityContext: privileged: true volumeMounts: - mountPath: /var/log/nginx name: nginx-logs command: - /bin/bash - -c - sleep infinity若将上述注解域名替换为 v0.7.1 时代的ark.heptio.com即pre.hook.backup.ark.heptio.com/...该示例同样适用于本文档所描述的 Ark v0.7.x 版本。注意两个实践要点冻结操作要求fsfreeze容器以privileged特权模式运行并挂载目标文件系统目录该容器需要保持存活示例中用sleep infinity常驻以便钩子命令在其内部执行。对于已运行的 Pod也可以直接用kubectl annotate就地打注解以现代域名为例v0.7.1 请对应替换为ark.heptio.comkubectl annotate pod -n nginx-example -l appnginx \ pre.hook.backup.velero.io/command[/sbin/fsfreeze, --freeze, /var/log/nginx] \ pre.hook.backup.velero.io/containerfsfreeze \ post.hook.backup.velero.io/command[/sbin/fsfreeze, --unfreeze, /var/log/nginx] \ post.hook.backup.velero.io/containerfsfreeze随后创建备份并验证钩子执行情况velero backup create nginx-hook-test velero backup get nginx-hook-test velero backup logs nginx-hook-test | grep hookCommand现代版本还支持通过velero backup describe backup name查看钩子执行结果统计HooksAttempted与HooksFailed两个指标失败详情会出现在Errors区段。进阶技巧多命令与 Shell 包装由于钩子命令默认不在 Shell 中执行存在两种常见诉求的解法多命令串联将目标命令包装进一个 Shell用;、等条件构造分隔。例如pre.hook.backup.velero.io/command[/bin/bash, -c, echo hello hello.txt echo goodbye goodbye.txt]使用 Pod 内环境变量在命令开头显式引入 Shell如/bin/sh再通过$VAR引用容器环境变量。例如对定义了MYSQL_ROOT_PASSWORD的 mysql Pod在执行备份前刷新并锁定 MySQL 表hooks: resources: - name: mysql-flush includedNamespaces: - default includedResources: - pods pre: - exec: container: mysql command: - /bin/sh - -c - mysql --password$MYSQL_ROOT_PASSWORD -e FLUSH TABLES WITH READ LOCK onError: Fail注意被调用的 Shell/bin/sh、/bin/bash等必须存在于目标容器镜像中。从 Ark 到 Velero钩子注解的演进v0.7.1 文档是 Heptio Ark 时代的产物此后项目更名为 Velero钩子机制本身的语法、字段、执行语义得以完整保留主要变化集中在注解域名与旧写法的去留版本阶段pre 钩子注解post 钩子注解说明Ark v0.7.x本文档pre.hook.backup.ark.heptio.com/*post.hook.backup.ark.heptio.com/*兼容无pre.前缀的旧注解现代 Veleropre.hook.backup.velero.io/*post.hook.backup.velero.io/*现代文档见 site/content/docs/main/backup-hooks.md现代源码中的注解键常量internal/hook/item_hook_handler.go#L53-L58证实了这一演化podBackupHookContainerAnnotationKey hook.backup.velero.io/container podBackupHookCommandAnnotationKey hook.backup.velero.io/command podBackupHookOnErrorAnnotationKey hook.backup.velero.io/on-error podBackupHookTimeoutAnnotationKey hook.backup.velero.io/timeoutpre/post 阶段通过phasedKey组合出pre.hook.backup.velero.io/*与post.hook.backup.velero.io/*L321-L326。此外Velero 还在备份钩子之外扩展了 Restore Hooks恢复钩子与 Init Container 钩子对应post.hook.restore.velero.io/*、init.hook.restore.velero.io/*注解见 L60-L71形成覆盖备份与恢复全流程的钩子体系。小结Backup Hooks 是 Velero/Ark 保障卷备份数据一致性的核心机制通过 pre/post 两阶段钩子用户可以在快照前后执行任意容器内命令典型的fsfreeze冻结/解冻场景并且既能以 Pod 注解的方式零侵入地声明也能在 Backup spec 中按命名空间、资源与标签选择器批量管理。理解container、command、on-error、timeout四个参数的含义与默认值以及注解优先级高于 spec 钩子、pre 执行于自定义 Action 之前、post 等待所有附加项与 PVB 处理完毕的时序关系是正确落地这一能力的关键。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表