Velero/Ark 实战:掌握ark get backups命令查看 Kubernetes 备份状态
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
导读
ark get backups是 Velero 的前身 Ark(Heptio Ark)提供的一条核心查询命令,用于列出集群中已创建的备份(Backup)资源及其状态。本文以 v0.7.0 版本的官方 CLI 参考文档为主体,结合当前仓库中 Velero 的对应源码实现,完整讲解该命令的语法、全部参数含义、输出格式控制与标签筛选能力,并延伸到父命令级通用参数,帮助你像使用kubectl get一样熟练地查询、过滤和格式化备份信息。
命令背景:从 Ark 到 Velero
当前仓库是 Velero(原项目名 Heptio Ark,早期 CLI 名为ark),这是一个用于 Kubernetes 集群资源与应用数据备份恢复的开源工具。在 v0.7.0 时代,CLI 二进制名为ark;此后项目更名为 Velero,CLI 也变为velero,但命令结构与设计一脉相承。因此本参考文档中的ark get backups在现代 Velero 中对应的等价命令是velero backup get(也支持velero get backups的别名形式)。
从 v0.7.0 主命令文档 可以看到,Ark 的设计刻意模仿kubectl的交互模型:ark get backup与ark backup get两种写法都可用。理解这一点后,本文所有示例在 Velero 新版中只需将ark替换为velero即可。
命令语法与核心作用
ark get backups的完整语法如下:
ark get backups [flags]执行该命令后,CLI 会向 Kubernetes apiserver 请求指定命名空间(默认heptio-ark)下的 Backup 自定义资源,并以人类可读的表格形式渲染输出。命令本身不接收位置参数(方括号中的[flags]表示只能带标志),但可以配合-l标签选择器实现资源过滤。
对应到当前仓库源码,该命令由 pkg/cmd/cli/get/get.go 注册为get父命令的子命令:
backupCommand := backup.NewGetCommand(f, "backups") backupCommand.Aliases = []string{"backup"}NewGetCommand(f, "backups")创建了一个名为backups的子命令,并为其添加了backup别名——这正是文档中提到两种调用形式的实现来源。整个get命令族还包含schedules、restores、backup-locations、snapshot-locations、plugins等子命令,结构清晰一致。
命令专属参数详解
以下参数均定义在ark get backups自身的作用域内:
| 参数 | 简写 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
--help | -h | bool | — | 显示backups子命令的帮助信息 |
--label-columns | — | stringArray | 空 | 以逗号分隔的标签列表,这些标签将作为额外的表格列展示 |
--output | -o | string | table | 输出格式,可选table、json、yaml |
--selector | -l | string | 空 | 仅显示匹配该标签选择器的备份项 |
--show-labels | — | bool | false | 在表格最后一列显示每个备份的标签 |
--selector:按标签筛选备份
-l参数接收 Kubernetes 标准的标签选择器表达式,例如:
# 查看带有 app=nginx 标签的备份 ark get backups -l app=nginx # 组合条件筛选 ark get backups -l 'app in (nginx,redis),env!=prod'在源码 pkg/cmd/cli/backup/get.go 中,选择器通过labels.Parse解析后传给 controller-runtime 客户端,作为List调用的LabelSelector:
parsedSelector, err := labels.Parse(listOptions.LabelSelector) cmd.CheckError(err) err = kbClient.List(context.TODO(), backups, &kbclient.ListOptions{ LabelSelector: parsedSelector, Namespace: f.Namespace(), })值得留意的是,listOptions.LabelSelector是通过c.Flags().StringVarP(...)绑定到-l标志上的(见 pkg/cmd/cli/backup/get.go),筛选发生在服务端 List 请求层面,而非本地过滤。
--label-columns与--show-labels:控制标签列
这两个参数协同工作,帮助你在表格中直接看到关键标签:
# 将 app 标签作为一列展示 ark get backups --label-columns app # 多个标签列,两种写法均可 ark get backups --label-columns app,env ark get backups -L app -L env # 或在表格最后一列聚合展示全部标签 ark get backups --show-labels从 pkg/cmd/util/output/output.go 的BindFlags实现看,--label-columns底层是一个flag.NewStringArray()类型,天然支持逗号分隔与重复使用;--show-labels则是简单的布尔标志。它们最终被组装进 Kubernetes 标准打印器的PrintOptions(见 pkg/cmd/util/output/output.go):
options := printers.PrintOptions{ ShowLabels: GetShowLabelsValue(cmd), ColumnLabels: GetLabelColumnsValues(cmd), } printer := printers.NewTablePrinter(options)--output:切换输出格式
-o参数控制结果的渲染方式,默认table提供人类可读的表格;需要程序化消费或精细查看对象字段时使用json/yaml:
# 表格输出(默认) ark get backups # JSON 输出 ark get backups -o json # YAML 输出 ark get backups -o yaml源码 pkg/cmd/util/output/output.go 中的validateOutputFlag会对该标志做严格校验,仅接受""、table、json、yaml四种取值,其他值会直接报错:
default: return errors.Errorf("invalid output format %q - valid values are 'table', 'json', and 'yaml'", output)打印逻辑PrintWithFormat(见 pkg/cmd/util/output/output.go)按格式分派:table走printTable生成表格;json/yaml走printEncoded做对象序列化。一个实现细节是:当 List 中恰好只有 1 个对象时,printEncoded会直接输出该对象本身而非包裹的列表(见 pkg/cmd/util/output/output.go),这与kubectl get的行为保持一致。
表格输出与排序规则
默认表格在 pkg/cmd/util/output/backup_printer.go 中定义,包含以下列:
Name Status Errors Warnings Created Expires Storage Location Queue Position Selector各列含义如下:
- Name:备份资源名称(对应 Backup CR 的 metadata.name);
- Status:备份当前阶段,如
InProgress、Completed、Failed等; - Errors / Warnings:备份过程中的错误数与警告数;
- Created:备份创建时间;
- Expires:备份过期时间(由 TTL 决定);
- Storage Location:该备份写入的 BackupStorageLocation 名称;
- Queue Position:备份在队列中的位置(排队中的备份可见);
- Selector:备份创建时指定的资源标签选择器。
关于排序,pkg/cmd/util/output/backup_printer.go 实现了一个巧妙的策略:默认按名称字典序排列;但如果备份名带有-[0-9]{14}(14 位数字时间戳)后缀——即由 Schedule 定时任务自动生成的备份——则同一前缀分组内按时间戳从新到旧排序,方便你一眼看到最新的定时备份。这一逻辑由正则timestampSuffix = regexp.MustCompile("-[0-9]{14}$")判定。
父命令级通用参数
以下参数由ark get乃至ark根命令继承而来,ark get backups同样可用,主要涉及集群连接与日志配置:
| 参数 | 说明 |
|---|---|
--kubeconfig string | 指定连接 Kubernetes apiserver 所用的 kubeconfig 路径;未设置时依次尝试KUBECONFIG环境变量与集群内配置 |
-n, --namespace string | Ark 操作的目标命名空间,默认heptio-ark(在 Velero 新版中默认为velero) |
--alsologtostderr | 日志同时输出到文件与标准错误 |
--logtostderr | 日志输出到标准错误而非文件 |
--log_dir string | 指定日志文件目录 |
--log_backtrace_at traceLocation | 当日志命中file:N时输出堆栈,默认:0 |
--stderrthreshold severity | 达到该级别及以上的日志进入 stderr,默认2(ERROR) |
-v, --v Level | V 日志的详细程度级别 |
--vmodule moduleSpec | 按pattern=N逗号分隔列表做文件过滤日志 |
实际使用中最常用的是-n与--kubeconfig:
# 查看指定命名空间下的备份 ark get backups -n my-namespace # 显式指定 kubeconfig ark get backups --kubeconfig /path/to/config在 pkg/cmd/cli/backup/get.go 中,命名空间通过f.Namespace()从 Factory 获取,并用于Get/List请求的ObjectKey与ListOptions.Namespace,与文档中的-n参数一一对应。
命令族关系与进阶路径
ark get backups是ark get命令族的一员。从 ark get 文档 可见,同一族下还有:
ark get restores— 查询恢复任务;ark get schedules— 查询定时备份计划;ark get backup-locations/ark get snapshot-locations— 查询备份存储位置与快照位置;ark get plugins— 查询已加载的插件。
这些子命令复用同一套-o/-l/--label-columns/--show-labels输出机制(见 pkg/cmd/cli/get/get.go),学习成本极低。对单个备份需要查看完整状态细节时,可进一步使用ark describe backups <name>;对备份内容进行逻辑处理或归档时,可用-o yaml导出完整对象。
源码验证与测试参考
以上行为均有仓库源码与测试可验证:
- 命令注册与别名: pkg/cmd/cli/get/get.go;
- 子命令实现(拉取与筛选逻辑): pkg/cmd/cli/backup/get.go;
- 输出标志绑定与校验: pkg/cmd/util/output/output.go;
- 表格列定义与排序: pkg/cmd/util/output/backup_printer.go;
- 单元测试: pkg/cmd/cli/backup/get_test.go 创建了
b1、b2、b3三个带abc=abc标签的假 Backup,分别验证按名称逐个获取与按-l abc=abc选择器批量获取两种路径的输出,可作为理解命令行为的直接证据。
小结
ark get backups是 Ark/Velero CLI 中查看备份状态的基础命令:默认以table呈现备份的名称、状态、错误/警告数、创建与过期时间、存储位置、队列位置等核心信息;通过-l可基于标签选择器精准筛选,通过-L/--show-labels可扩展标签列,通过-o可切换json/yaml格式用于脚本处理。结合父命令的-n与--kubeconfig,你可以完全掌控备份资源的查询场景。在当前仓库中,上述全部能力均已演进至velero backup get,实践时仅需替换命令前缀即可。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考