Velero 定时备份命令参考:create schedule 从 Cron 表达式到 Schedule CRD 的完整解析
2026/9/16 15:26:29 网站建设 项目流程

Velero 定时备份命令参考:create schedule 从 Cron 表达式到 Schedule CRD 的完整解析

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

本文基于 Velero v0.5.0 时期文档ark create schedule(CLI 参考页)编写,完整覆盖该命令的用法、全部选项及其继承的全局选项,并结合当前仓库的 create.go 与 schedule_types.go 源码,讲清该命令如何把命令行参数映射为 Schedule CRD 对象、以及定时备份的生命周期机制。读完后你可以直接用该命令创建周期性备份,并理解每个选项在 API 对象中的落点。

1. 命令概述:从 ark 到 velero

在 Velero 0.5.0 时代,CLI 二进制名为ark,创建定时备份的命令为ark create schedule。随着项目更名,当前仓库中该命令的等价形式是velero create schedule,命令实现位于 pkg/cmd/cli/schedule/create.go。

命令的基本用法为:

velero create schedule NAME [flags]

(v0.5.0 文档中写作ark create schedule NAME [flags],见 ark_create_schedule.md。)

从源码结构看,cobra 命令的Use字段声明为use + " NAME --schedule"(create.go#L42),且Args校验为cobra.ExactArgs(1)(create.go#L69),即必须且只能提供一个 Schedule 名称;--schedule表达式则是必填项,Validate中若其长度为 0 会直接报错"--schedule is required"(create.go#L110-L116)。

2. 完整选项参考(v0.5.0 文档版)

以下为 v0.5.0 官方文档中create schedule的全部选项,逐项继承不删减。stringArrayoptionalBool等类型标记来自 pflag/cobra 的自动文档生成:

选项类型说明默认值
--exclude-namespacesstringArray要从备份中排除的命名空间
--exclude-resourcesstringArray要从备份中排除的资源,格式为 resource.group,如storageclasses.storage.k8s.io
-h, --helpschedule 的帮助信息
--include-cluster-resourcesoptionalBool在备份中纳入集群级(cluster-scoped)资源trueoptionalBool[=true]
--include-namespacesstringArray要纳入备份的命名空间(用*表示全部)*
--include-resourcesstringArray要纳入备份的资源,格式为 resource.group,如storageclasses.storage.k8s.io(用*表示全部资源)
--label-columnsstringArray以列形式展示的标签的逗号分隔列表
--labelsmapStringString应用到备份上的标签
-o, --outputstring输出显示格式。对 create 类命令:仅打印对象但不提交到服务端。可用格式为tablejsonyaml
--schedulestring以 cron 表达式指定该备份的周期性计划
-l, --selectorlabelSelector仅备份匹配该标签选择器的资源<none>
--show-labels在最后一列显示标签
--snapshot-volumesoptionalBool备份时是否对 PersistentVolume 做快照trueoptionalBool[=true]
--ttlduration备份在被垃圾回收之前可以存活多久24h0m0s

2.1 继承自父命令的选项

v0.5.0 文档列出的继承自父命令的全局选项如下(均为 glog 日志与 kubeconfig 相关):

选项说明默认值
--alsologtostderr日志同时输出到标准错误与文件
--kubeconfig与 Kubernetes apiserver 通信所用 kubeconfig 文件路径。若未设置,则尝试环境变量KUBECONFIG以及集群内配置
--log_backtrace_at当日志命中 file:N 这一行时输出堆栈跟踪:0
--log_dir若非空,日志文件写入该目录
--logtostderr日志输出到标准错误而非文件
--stderrthreshold达到该阈值及以上的日志写入 stderr2
-v, --vV 级别日志的日志等级
--vmodule用于文件级过滤日志的pattern=N逗号分隔列表

2.2-o选项的行为印证

文档说明-o对 create 命令“打印对象但不提交服务端”。这一点在源码中得到印证:Run中先调用output.PrintWithFormat(c, schedule),若printed为 true 则直接return,不再执行后续的crClient.Create(create.go#L184-L191)。因此velero create schedule daily -o yaml是一个安全的“干跑”方式,可用于审查即将创建的 Schedule 对象。

3. 调度表达式:cron 五段式与 @every

命令的 Long 描述(create.go#L44-L56)明确了两点:cron 表达式使用 UTC 时间,且支持@every <duration>语法。

3.1 cron 表达式字段

字符位置字段含义可接受值
1分钟 (Minute)0-59, *
2小时 (Hour)0-23, *
3日 (Day of Month)1-31, *
4月 (Month)1-12, *
5星期 (Day of Week)0-6, *

3.2 @every 语法

除标准 cron 外,表达式还可以写成@every <duration>形式,duration 由秒(s)、分(m)、时(h)组合而成,例如@every 2h30m

3.3 官方示例

以下 4 个示例直接取自命令实现的Example字段(create.go#L58-L68),覆盖两种表达式风格与过滤、TTL 组合:

# 每 6 小时创建一次备份(cron 五段式)。 velero create schedule NAME --schedule="0 */6 * * *" # 用 @every 记法实现同样的每 6 小时一次。 velero create schedule NAME --schedule="@every 6h" # 每天备份 web 命名空间。 velero create schedule NAME --schedule="@every 24h" --include-namespaces web # 每周备份一次,每个备份保留 90 天(2160 小时)。 velero create schedule NAME --schedule="@every 168h" --ttl 2160h0m0s

4. 源码级实现:选项如何变成 Schedule 对象

4.1 选项结构:复用 backup 的 CreateOptions

create schedule的选项结构体CreateOptions内嵌了备份命令的BackupOptions(create.go#L87-L93)。这正是第 2 节那些 namespace/resource/labels/ttl 等选项与backup create完全一致的原因——调度命令本质上是一个“带模板的备份工厂”:

type CreateOptions struct { BackupOptions *backup.CreateOptions SkipOptions *SkipOptions Schedule string UseOwnerReferencesInBackup bool Paused bool }

BindFlags(create.go#L102-L108)在复用备份选项之外额外绑定三个调度专属参数:

新增选项类型说明
--schedulestringcron 表达式,指定周期性计划
--use-owner-references-in-backupbool是否为该 Schedule 生成的 Backup 设置 OwnerReferences。注意:设为 true 后,删除 schedule 会连带删除其生成的备份
--pausedbool新建的 schedule 是否处于暂停状态

备份侧选项的完整绑定逻辑见 backup/create.go#L144-L181,例如--snapshot-volumes--include-cluster-resources都通过NoOptDefVal = cmd.TRUE实现了“单独写出--snapshot-volumes即等价于=true”的 optionalBool 语义(backup/create.go#L163-L175),与 v0.5.0 文档中optionalBool[=true]的类型标记相互印证。

4.2 执行流程:组装 spec 并提交

Run函数(create.go#L122-L195)的核心流程:

  1. client.Factory获取 kubebuilder client;
  2. 将各选项值逐一映射进api.Schedule.Spec--include-namespacesTemplate.IncludedNamespaces--exclude-namespacesTemplate.ExcludedNamespaces--include-resources/--exclude-resourcesTemplate.IncludedResources/Template.ExcludedResources-l选择器 →Template.LabelSelector--snapshot-volumesTemplate.SnapshotVolumes--ttlTemplate.TTL,以及命名空间固定为 factory 的f.Namespace()(即 velero 部署所在命名空间,通常为velero,v0.5.0 时代为ark);
  3. --schedule表达式写入Spec.Schedule,同时写入UseOwnerReferencesInBackupPaused
  4. 支持-o干跑后直接返回;否则调用crClient.Create提交,成功时打印Schedule %q created successfully.(create.go#L193)。

其中Template的类型就是BackupSpec(create.go#L143-L166),也就是说 Schedule 的 spec 模板与一次普通备份的 spec 完全同构——定时备份每次触发时,服务端即按此模板实例化出一个具体的 Backup。

5. Schedule CRD:字段、阶段与打印列

调度资源的 API 定义在 pkg/apis/velero/v1/schedule_types.go。

5.1 ScheduleSpec 字段

字段类型说明(源码注释摘译)
templateBackupSpec将在给定计划上执行的备份定义(schedule_types.go#L28-L30)
schedulestring定义备份运行时间的 Cron 表达式
useOwnerReferencesInBackup*bool是否为生成的备份使用 OwnerReferences
pausedbool该 schedule 是否被暂停
skipImmediately*bool新建或取消暂停时若已到期是否跳过本次、顺延到下个计划时间;为空时跟随服务端配置(默认 false)(schedule_types.go#L46-L51)

5.2 生命周期阶段与状态

SchedulePhase为枚举类型,取值三个(schedule_types.go#L56-L71):

  • New:Schedule 已创建,但尚未被 ScheduleController 处理;
  • Enabled:已通过校验,将按计划触发备份;
  • FailedValidation:未通过控制器校验,不会触发备份。

ScheduleStatus记录phaselastBackup(上次运行备份的时间)、lastSkipped(上次跳过时间)与validationErrors(schedule_types.go#L74-L94)。

5.3 kubectl 打印列与命名规则

从 kubebuilder 注解可见,kubectl get sched会额外展示 Status、Schedule、LastBackup、Age、Paused 五列,且资源短名为sched(schedule_types.go#L102-L107)。另有一个值得注意的实现细节:由 schedule 派生的备份命名通过TimestampedName生成,格式为<schedule名>-<YYYYMMDDHHMMSS>(schedule_types.go#L138-L141),这解释了为什么每次定时触发的备份名都带 14 位 UTC 时间戳后缀。

6. v0.5.0 文档与当前仓库的差异说明

v0.5.0 文档反映的是ark时期的选项集;当前仓库实现(veleroCLI)在其上做了扩展,阅读旧文档对照源码时需注意:

  • 新增调度选项--paused--use-owner-references-in-backup,以及SkipOptions引入的--skip-immediately(create.go#L102-L108);
  • 新增备份模板选项--storage-location--volume-snapshot-locations(并注册了名称补全函数,create.go#L81-L82)、细粒度资源过滤(--include-cluster-scoped-resources等与旧参数互斥,互斥校验见 backup/create.go#L235-L239)、--ordered-resources--resource-policies-configmap等;
  • 默认值演变:v0.5.0 文档标注--ttl默认24h0m0s;当前源码中该 flag 以CreateOptions的零值作为默认绑定(backup/create.go#L145),因此以当前仓库为准的默认行为可能不同,使用时建议显式指定--ttl
  • 选项归属变化--label-columns--show-labels属于 v0.5.0 文档中的 get 类展示选项,当前 create 命令并未绑定。

7. 相关命令(SEE ALSO)

按 v0.5.0 文档的 SEE ALSO 指向,调度相关的命令族包括(均以仓库根目录相对路径给出):

  • ark create — 创建 ark 资源;
  • ark schedule — 管理 schedules;
  • ark schedule create — 创建 schedule;
  • ark schedule get / ark schedule delete — 查看与删除 schedule。

结合当前仓库,创建后还可通过velero backup create --from-schedule <name>立即按该模板手动触发一次备份(见 backup/create.go#L291-L293 的--from-schedule定义)。

8. 小结

create schedule命令的价值在于把“备份范围选项”与“调度策略”合并成一个声明式资源:所有过滤选项(namespaces/resources/selector/labels/ttl)原样落入spec.template,调度表达式落入spec.schedule,最终由服务端控制器按 cron(UTC)周期实例化 Backup。掌握第 2 节的完整选项表、第 3 节的两种表达式写法,以及第 5 节的 CRD 阶段与状态字段,即可独立完成从创建、干跑校验(-o yaml)、查看阶段(kubectl get sched)到暂停/删除的全流程操作。

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询