Velero 前身 Ark 的定时备份查看命令:ark schedule get完整使用指南
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本篇文章聚焦于当前仓库site/content/docs/v0.8.0/cli-reference/ark_schedule_get.md所讲解的ark schedule get命令。在 Velero(当时名为 Heptio Ark)v0.8.0 时代,ark是唯一的命令行入口,而ark schedule get用于以表格、JSON 或 YAML 格式查看集群中已创建的定时备份(Schedule)资源。读完本文,你将掌握该命令的全部参数语义、与ark schedule create/describe/delete的配合方式,以及它在源码与控制器中的底层行为。
命令定位:Schedule 是备份自动化的核心
在 v0.8.0 中,Schedule 是一个自定义资源(CRD),它把「cron 表达式 + 备份参数」绑定在一起:一旦创建,Ark 服务端就会周期性地检查所有 Schedule 对象,当满足 cron 时间条件时自动发起一次备份。ark schedule get的作用就是列出这些 Schedule 资源及其当前状态,属于日常巡检备份策略的第一步。
该命令由ark schedule子命令树承载,父命令定义见 site/content/docs/v0.8.0/cli-reference/ark_schedule.md,其说明为 "Work with schedules",并聚合了create、delete、describe、get四个子命令。
命令语法与 Synopsis
ark schedule get [flags]与ark backup get、ark restore get一致,get不接收位置参数(NAME),而是将符合筛选条件的全部 Schedule 资源列表返回。这与describe不同——ark schedule describe [NAME1] [NAME2] [NAME...]需要显式指定名称,见 site/content/docs/v0.8.0/cli-reference/ark_schedule_describe.md。
参数详解(Options)
ark schedule get自身的参数如下:
| 参数 | 类型 | 默认值 | 含义 |
|---|---|---|---|
-h, --help | bool | - | 显示get子命令的帮助信息 |
--label-columns stringArray | string[] | 空 | 逗号分隔的标签键列表,这些标签将作为额外的列显示在输出表格中 |
-o, --output string | string | table | 输出展示格式,合法值为table、json、yaml |
-l, --selector string | string | 空 | 仅显示匹配该标签选择器的 Schedule 资源 |
--show-labels | bool | false | 在表格最后一列展示资源的全部标签 |
各参数要点如下:
--output(-o):默认以对齐的表格打印,便于人眼阅读;指定-o json或-o yaml时可获得完整的资源对象序列化结果,适合脚本消费或与其他工具(如jq、yq)管道衔接。注意文档中特别说明:对于create类命令,-o json/yaml的含义是「显示对象但不发送到服务端」,而get命令下则是直接输出服务端返回对象的序列化形式。--label-columns:例如 Schedule 创建时打了env=prod标签,可用--label-columns env把该标签单独列为一列,方便按环境快速区分多条备份策略。该参数可重复传入多次以同时显示多列。--selector(-l):与 Kubernetes 标签选择器语法一致(如env=prod、env!=dev、env in (prod, staging)),在客户端侧对返回列表做过滤。--show-labels:在表格最右侧追加一列,集中展示每个 Schedule 的全部标签(key=value 形式,逗号分隔)。
继承自父命令的全局参数
ark schedule get还继承了所有ark命令共享的全局参数(来自父命令链ark→ark schedule):
| 参数 | 类型 | 默认值 | 含义 |
|---|---|---|---|
--alsologtostderr | bool | - | 同时将日志写入文件与标准错误输出 |
--kubeconfig string | string | 空 | 用于连接 Kubernetes apiserver 的 kubeconfig 文件路径;未设置时依次尝试环境变量KUBECONFIG与集群内配置 |
--kubecontext string | string | 空 | 指定要使用的 kubeconfig context;未设置时使用kubectl config current-context的当前上下文 |
--log_backtrace_at traceLocation | string | :0 | 当日志命中file:N时输出堆栈追踪 |
--log_dir string | string | 空 | 非空时把日志文件写入该目录 |
--logtostderr | bool | - | 日志直接输出到标准错误而非文件 |
-n, --namespace string | string | heptio-ark | Ark 工作所在的 Kubernetes 命名空间 |
--stderrthreshold severity | int | 2 | 达到或超过该阈值的日志输出到 stderr |
-v, --v Level | int | 0 | V 级别日志的详细程度 |
--vmodule moduleSpec | string | 空 | 按文件过滤的pattern=N日志级别设置 |
其中-n, --namespace值得特别注意:v0.8.0 版本 Ark 默认命名空间是heptio-ark,ark schedule get只会列出该命名空间下的 Schedule。这一行为与测试用例的断言一致——在 pkg/cmd/cli/schedule/get_test.go 中,TestNewGetCommandListsOnlyTheVeleroNamespace明确验证了 get 命令只查询 Velero(Ark)命名空间。
源码实现:从命令注册到列表获取
命令的注册与实现位于 pkg/cmd/cli/schedule/get.go,核心入口为NewGetCommand(f client.Factory, use string) *cobra.Command。它被 pkg/cmd/cli/schedule/schedule.go 中的NewCommand挂载为ark schedule get子命令,与NewDescribeCommand并列。
从源码结构可以推断其典型执行链路:
NewGetCommand通过 Cobra 注册get命令及上述 flags(label-columns、output、selector、show-labels);- 运行时借助
client.Factory构造 Ark 自定义资源的客户端; - 调用 ScheduleList 的列表接口(受
-n/--namespace约束),再按selector、label-columns、show-labels在展示层处理。
同目录下的 pkg/cmd/cli/schedule/describe.go 与 pkg/cmd/cli/schedule/describe_test.go 则验证了describe的「按名称查看单个 Schedule 详情」行为,可与get的「批量列表」形成互补。
与创建命令配合:理解你看到的输出
Schedule 的输出内容直接源于ark schedule create时指定的参数。create命令要求--schedule参数必须是 cron 表达式,其字段含义(详见 site/content/docs/v0.8.0/cli-reference/ark_schedule_create.md):
| 字符位置 | 时间周期 | 可接受值 |
|---|---|---|
| 1 | 分钟 | 0-59,* |
| 2 | 小时 | 0-23,* |
| 3 | 日(月中的某天) | 1-31,* |
| 4 | 月 | 1-12,* |
| 5 | 星期(周中的某天) | 0-7,* |
创建示例:
ark schedule create daily-backup --schedule="0 */6 * * *" --include-namespaces default --ttl 24h该命令会创建一个每日每 6 小时触发一次、只备份default命名空间、保留 24 小时的 Schedule。随后执行ark schedule get即可看到这条策略;若想确认它具体触发了哪些 Backup,可结合 site/content/docs/v0.8.0/cli-reference/ark_backup_get.md 中的ark backup get -l velero.io/schedule-name=daily-backup(按 Schedule 标签过滤)来追踪其产出的备份。
标签选择器实战
假设你维护了多条备份策略:
ark schedule create app-prod-nightly --schedule="0 2 * * *" --labels app=web,env=prod ark schedule create app-staging-nightly --schedule="0 3 * * *" --labels app=web,env=staging ark schedule create db-prod-nightly --schedule="30 2 * * *" --labels app=db,env=prod- 只看生产环境策略:
ark schedule get -l env=prod - 只显示 web 应用策略并展示标签列:
ark schedule get -l app=web --label-columns env --show-labels - 输出机器可读格式:
ark schedule get -o json或ark schedule get -o yaml
底层机制:Schedule 如何被周期检查
ark schedule get展示的是服务端 Schedule 资源的即时快照,而这些资源之所以能产生定时备份,依赖服务端的周期同步机制。
在 pkg/controller/schedule_controller.go 中,控制器定义了scheduleSyncPeriod = time.Minute,并通过kube.NewPeriodicalEnqueueSource以该周期对ScheduleList进行周期入队扫描(pkg/controller/schedule_controller.go)。也就是说:Ark 服务端每分钟检查一次全部 Schedule,判断是否有 cron 触发点需要发起备份。
该同步周期也可通过 Ark 服务端配置覆盖。在 v0.8.0 中,服务端配置是一个名为default的自定义 Config 资源(位于heptio-ark命名空间),其中的scheduleSyncPeriod键控制「Ark 检查 Schedule 资源以决定是否发起备份」的频率,默认1m0s;与之配套的backupSyncPeriod(默认60m)控制从对象存储同步已有备份文件、gcSyncPeriod(默认60m)控制清理超过 TTL 的备份文件。完整参数表见 site/content/docs/v0.8.0/config-definition.md。
结合这两部分,可以形成完整的认知闭环:ark schedule get看到的是 Schedule 资源在 API 层面的状态;而 Schedule 真正「跑起来」是靠服务端每分钟一次的周期扫描。修改 Config 中的scheduleSyncPeriod会影响该扫描频率。
常见排查与使用建议
- 看不到任何 Schedule:先确认是否已用
ark schedule create创建过资源,再用ark schedule get -n heptio-ark显式指定命名空间;检查当前 kubeconfig 上下文是否指向目标集群(--kubecontext)。 - 需要了解某条策略的完整详情(如包含/排除的资源、TTL、PV 快照开关):改用
ark schedule describe <NAME>,其参数见 site/content/docs/v0.8.0/cli-reference/ark_schedule_describe.md。 - 需要删除不再需要的策略:使用
ark schedule delete <NAME>,入口见 site/content/docs/v0.8.0/cli-reference/ark_schedule.md 的父命令树。 - 输出用于自动化:
-o json/-o yaml可配合jq等工具提取 Schedule 的spec.schedule、spec.template、status等字段做断言或监控。
结语
ark schedule get虽是一个仅 5 个自有参数的列表命令,却是运维 Ark 定时备份体系的第一入口。结合--label-columns、--selector、--show-labels可以做精细化的策略筛选,配合-o json/yaml可融入脚本自动化;而其输出背后,是每分钟一次的scheduleSyncPeriod周期扫描机制(见 pkg/controller/schedule_controller.go)。理解这一点,你就能把「命令行看到什么」与「服务端如何执行」串成一条完整的链路。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考