Velero(原 Ark)`schedule get` 命令详解:查看定时备份计划的完整指南
2026/9/16 20:48:08 网站建设 项目流程

Velero(原 Ark)schedule get命令详解:查看定时备份计划的完整指南

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

本文基于 Velero 仓库 v0.5.0 时期的 CLI 参考文档ark schedule get(现命令为velero schedule get),完整覆盖该命令的用法、全部选项及其继承自父命令的全局参数,并结合当前仓库源码深入剖析命令的底层实现:从 Schedule 资源的字段结构、表格打印列的生成逻辑,到 shell 名称补全的机制,帮助读者既能直接上手查命令,又能理解每一条输出列背后对应的 API 字段。

命令用途与基本语法

schedule get用于获取 Velero 集群中的一个或多个备份定时计划(Schedule)。在 v0.5.0 文档中,该命令隶属于早期的ark命令行工具,其 Synopsis 与基本用法如下(原文档见 ark_schedule_get.md):

ark schedule get [flags]

在当前仓库中,该命令的实现位于 pkg/cmd/cli/schedule/get.go,其 Cobra 命令的Short描述同样是 "Get schedules",并新增了可选的位置参数支持——可以直接传入一个或多个 Schedule 名称来精确查询。与它同属schedule子命令族的还有 schedule create、delete、describe、pause、unpause 等(目录见 pkg/cmd/cli/schedule/)。

命令选项完整清单

以下为原文档中列出的全部选项,其中 Options 为命令自身选项,其余继承自父命令:

命令自身选项

选项说明
-h, --help显示本命令帮助信息
--label-columns stringArray以逗号分隔的形式指定要额外作为列展示的一组 label(label 名大小写敏感)
-o, --output string输出格式,可选值为tablejsonyaml,默认table
-l, --selector string只显示匹配该 label selector 的条目
--show-labels在结果最后一列追加显示资源的全部 labels

继承自父命令的选项

选项说明
--alsologtostderr日志在写入文件的同时输出到标准错误
--kubeconfig string与 Kubernetes apiserver 通信所用的 kubeconfig 文件路径;未设置时依次尝试环境变量KUBECONFIG以及 in-cluster 配置
--log_backtrace_at traceLocation当日志命中file:N时输出堆栈(默认:0
--log_dir string非空时日志文件写入该目录
--logtostderr日志输出到标准错误而非文件
--stderrthreshold severity达到该阈值的日志输出到 stderr(默认 2,即 Error 及以上)
-v, --v LevelV 级别日志的日志级别
--vmodule moduleSpec逗号分隔的pattern=N形式,用于按文件过滤日志级别

从当前源码 pkg/cmd/cli/schedule/get.go 可以看到,-l/--selector绑定到metav1.ListOptions.LabelSelector,而-o/--output--label-columns--show-labels等则通过output.BindFlags(c.Flags())统一注册在 pkg/cmd/util/output/output.go 中,其中--label-columns同时支持-L短选项且可多次指定(如-L label1 -L label2),与文档中的"逗号分隔列表"行为一致。

两种查询路径:按名称 vs 按条件列举

阅读 get.go 的实现可以清晰看到该命令的两条执行路径:

  1. 按名称精确获取:当命令行携带位置参数时,代码对每个名称构造ObjectKey{Name: name, Namespace: f.Namespace()},调用 controller-runtime 客户端的Get逐个取出 Schedule,再合并进一个api.ScheduleList。这意味着:
    • 查询范围限定在当前配置客户端的命名空间(即 Velero 安装所在命名空间,通常由--kubeconfig上下文决定);
    • 任何一个名称不存在都会导致命令报错退出。
  2. 列举全部:不带位置参数时,若设置了-l/--selector,会先用labels.Parse解析 selector 表达式,随后以该 selector 作为ListOptions.LabelSelector调用List;未设置 selector 则列出命名空间内全部 Schedule。

此外,在执行任何查询之前,命令会先调用output.ValidateFlags(c)校验输出相关 flag 的合法性(例如-o传了不支持的格式会在此处被拒绝),这是所有 Velero "get 类"命令的共同行为。

表格输出的列从何而来:Schedule Printer

默认table格式下,每一行展示哪些列由 pkg/cmd/util/output/schedule_printer.go 中的scheduleColumns定义决定,共 8 列:

列名数据来源(Schedule 对象字段)
Namemetadata.name
Statusstatus.phase;若为空则显示为New
Createdmetadata.creationTimestamp
Schedulespec.schedule(Cron 表达式)
Backup TTLspec.template.ttl
Last Backupstatus.lastBackup(以"距现在多久"的人类可读形式展示)
Selectorspec.template.labelSelector
Pausedspec.paused

实现细节上有两点值得注意(见 printSchedule):

  • Status 兜底逻辑:新建的 Schedule 尚未被 ScheduleController 处理时status.phase为空,打印器会将其显示为New,与 Schedule 资源定义中的SchedulePhaseNew常量语义一致;
  • Last Backup 空值安全status.lastBackup是指针类型,仅在非 nil 时才取值,避免空指针。

这些列与 CRD 上的 kubebuilder+kubebuilder:printcolumn注解(schedule_types.go 中定义的 Status、Schedule、LastBackup、Age、Paused 列)在含义上相互呼应,因此velero schedule get表格与kubectl get schedule看到的列信息基本对齐。

-o输出格式:json 与 yaml

-o选项支持table(默认)、jsonyaml三种格式。当指定json/yaml时,命令会走PrintWithFormat的序列化分支,直接输出完整的 Schedule(或 ScheduleList)对象——包括spec.template中完整的备份模板(包含includedNamespacesincludedResourcessnapshotVolumesdefaultVolumesToFsBackupttl等全部字段)以及status块。对于需要脚本化处理(如用jq提取status.lastBackup)的场景,JSON 输出更为可靠。

--label-columns--show-labels是 table 模式下的增强选项:前者把指定 label 的值提升为独立列展示,便于横向对比不同备份计划的分组标签;后者把资源的全部 labels 以键值串形式追加在最后一列。相关 flag 的注册与读取逻辑见 output.go。

Schedule 资源模型:读懂 get 的输出

理解schedule get输出的最佳方式是理解 Schedule API 类型定义:

  • ScheduleSpec(定义见):
    • template:嵌入一个完整的BackupSpec,即该计划每次触发时生成的备份定义;
    • schedule:标准 Cron 表达式,定义触发时间;
    • useOwnerReferencesInBackup:是否在新版备份上使用 OwnerReferences 关联到本 Schedule;
    • paused:布尔值,计划是否暂停(对应表格中的 Paused 列);
    • skipImmediately:恢复暂停或新建计划时,若到期时间恰好立即到达,是否跳过当次备份、顺延到下一个调度时刻;为空时遵循服务端配置(默认 false)。
  • SchedulePhase:取值New(已创建、尚未被控制器处理)、Enabled(已通过校验、按计划触发备份)、FailedValidation(校验失败、不会触发备份)。
  • ScheduleStatus(定义见):phaselastBackup(上次触发备份的时间)、lastSkipped(上次跳过时间,配合skipImmediately使用)、validationErrors(校验错误列表)。当状态为FailedValidation时,velero schedule get只能看到状态码,具体原因需结合velero describe schedule(或-o json查看status.validationErrors)进一步排查。

另有一个实用细节:Schedule 类型上带有+kubebuilder:resource:shortName=sched注解(schedule_types.go),因此kubectl get sched也能快捷查看同一资源。

Shell 补全:命令行为何能"智能提示"

get.go 中一行c.ValidArgsFunction = cli.CompleteScheduleNames(f)为位置参数提供了动态补全。其实现 completeNames 的工作方式是:发起一次带 3 秒超时的 Schedule 列表查询,提取所有名称后按用户已输入的前缀过滤(并去掉已作为参数出现的名称),从而在终端中输入velero schedule get <TAB>即可从集群中现有计划名中自动补全。这也解释了为什么该命令对"名称位置参数"的支持是可靠的——补全与实际Get查询走的是同一命名空间。

典型使用示例

结合上述实现,日常运维中的典型用法如下(注意:当前仓库的 CLI 二进制名为velero,v0.5.0 文档中的ark前缀属于早期命名,选项语义一致):

# 列出 Velero 命名空间下所有备份计划(table 格式) velero schedule get --kubeconfig ~/.kube/config # 按 label 过滤,只看生产环境的计划 velero schedule get -l env=production # 指定名称精确获取,输出 YAML 供脚本消费 velero schedule get nightly-backup -o yaml # 把 team 与 tier 两个 label 提升为列,横向对比多个计划 velero schedule get --label-columns team,tier

以上示例中的参数组合均出自本文档的选项清单与 get.go 的实际绑定逻辑,可直接在当前仓库对应的 CLI 版本中复现。

小结

schedule get虽然是一条查询命令,但其背后串联了 Velero 的完整技术栈:Cobra 命令层(参数绑定与校验)、controller-runtime 客户端(按名称 Get / 按 selector List)、Schedule CRD 模型(spec/status 字段与 Phase 生命周期)、输出层(table 列定义与 json/yaml 序列化)以及 shell 补全机制。理解了这条命令的实现路径后,再遇到 Status 为NewFailedValidation、Last Backup 为空等表象时,就能准确定位到对应的 API 字段与控制器行为去排查。

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

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

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

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

立即咨询