Velero(Ark)backup get命令完全指南:查询备份、状态解析与输出控制
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本文围绕 Velero 项目 v0.3.0 时代 CLI 参考文档中的ark backup get命令展开,讲解如何列出与查询 Kubernetes 集群中的备份(Backup)资源、按标签筛选、按需扩展输出列以及切换 table/json/yaml 输出格式。读者读完可以掌握该命令全部选项的语义与默认行为,并能从源码层面理解每一列数据的来源,直接用于日常备份运维与脚本化集成。
说明:v0.3.0 时代 CLI 名为
ark(对应文档位于 ark_backup_get.md)。后续版本中命令更名为velero backup get,但命令语义、选项与实现逻辑在 pkg/cmd/cli/backup/get.go 中持续沿用,本文以当前仓库源码为准展开说明。
命令概述:ark backup get
ark backup get用于获取(列出)Velero 管理的备份资源。其 Synopsis 与基本用法为:
ark backup get- 不带任何参数时,列出当前命名空间(默认
velero)下所有备份; - 传入一个或多个备份名称时,仅查询并显示这些指定备份的详情。
在命令行中,get是ark backup的子命令(完整的备份子命令集合见 ark_backup.md),顶层命令ark负责统一接入 kubeconfig、日志等全局参数(见 ark.md)。
查询行为与源码实现
从当前仓库源码 pkg/cmd/cli/backup/get.go 可以看到get命令的核心执行逻辑分为两条路径:
backups := new(api.BackupList) if len(args) > 0 { // 按名称逐个获取 for _, name := range args { backup := new(api.Backup) err := kbClient.Get(context.TODO(), kbclient.ObjectKey{Namespace: f.Namespace(), Name: name}, backup) cmd.CheckError(err) backups.Items = append(backups.Items, *backup) } } else { // 列出所有备份,支持标签选择器 parsedSelector, err := labels.Parse(listOptions.LabelSelector) cmd.CheckError(err) err = kbClient.List(context.TODO(), backups, &kbclient.ListOptions{ LabelSelector: parsedSelector, Namespace: f.Namespace(), }) cmd.CheckError(err) }- 按名称查询:把命令行参数中的每个备份名拼成
{Namespace, Name}对象,调用 controller-runtime 的Get从 Kubernetes API Server 逐个读取;多个名称之间是独立的,最终汇总为一个列表输出。 - 列出全部:不传名称时,把
--selector解析为 Kubernetes 标签选择器后调用List,配合--selector即可实现按标签过滤。
两条路径都限定在f.Namespace()(即 Velero 自身所在的命名空间,通常为velero),意味着backup get只能查询 Velero 部署命名空间内的备份资源。该命令还通过c.ValidArgsFunction = cli.CompleteBackupNames(f)注册了备份名的自动补全函数,交互式 Shell 下可以按 Tab 补全备份名称。
命令执行前会调用output.ValidateFlags对输出相关标志进行校验(见下文“输出格式”一节),校验失败时命令直接报错退出。
源码测试验证
仓库中的 get_test.go 使用 fake client 验证了该命令的两条核心路径:
- 创建
b1、b2、b3三个带标签abc=abc的备份后,执行velero backup get b1 b2 b3,断言输出中每个备份名各出现一次(按名称查询路径); - 再次执行带
-l abc=abc的velero backup get,断言通过标签选择器筛选出的结果同样包含全部三个备份(标签过滤路径)。
该测试同时印证了get命令的 Short 描述为 "Get backups",与文档一致。
选项详解
-l, --selector string
只显示匹配该标签选择器的备份。该值被解析为 Kubernetes 标准labels.Selector后传给List请求(见 get.go)。典型用法:
ark backup get -l app=nginx ark backup get -l 'app in (nginx,redis)'选择器语法与kubectl get --selector完全一致:支持=、==、!=、in、notin、exists等集合操作。该参数只作用于“不传名称、批量列出”的场景;一旦显式指定了备份名称,--selector不会参与过滤(从源码分支结构可以推断)。
--label-columns stringArray
以逗号分隔的标签键列表,把这些标签作为独立的表格列展示。用法:
ark backup get --label-columns=app,env对应源码 output.go 中的BindFlags:该标志被定义为flag.NewStringArray(),因此既支持逗号分隔(--label-columns=a,b),也支持多次传入(--label-columns=a --label-columns=b)。标签名区分大小写,未设置对应标签的备份在该列显示为空。
-o, --output string
输出显示格式,默认值为table。文档说明其合法取值为table、json、yaml;对于 create 类命令,-o表示“仅显示对象而不真正提交到服务端”。源码 output.go 中的校验逻辑明确:取值只能是table、json、yaml(空值表示跳过打印),其它值一律报错:
invalid output format "xxx" - valid values are 'table', 'json', and 'yaml'--show-labels
在表格的最后一列追加展示该备份的全部标签,未设置标签时显示<none>。该开关通过printers.PrintOptions.ShowLabels传入 Kubernetes 表格打印器(见 output.go)。
三个选项的协同
--label-columns、--show-labels、-o三个标志由统一的output.BindFlags绑定(见 get.go),它们共同决定表格的展示维度:
ark backup get --show-labels --label-columns=app,env -o table从父命令继承的全局选项
以下选项在ark根命令上定义,backup get会自动继承,用于控制 kubeconfig 连接与日志行为:
| 选项 | 说明 |
|---|---|
--kubeconfig string | 连接 Kubernetes API Server 使用的 kubeconfig 路径;未设置时依次尝试环境变量KUBECONFIG与集群内配置(in-cluster config) |
--alsologtostderr | 除了写日志文件外,同时输出日志到标准错误 |
--log_backtrace_at traceLocation | 当日志命中file:N时输出堆栈跟踪(默认:0,即不触发) |
--log_dir string | 非空时,将日志文件写入该目录 |
--logtostderr | 将日志输出到标准错误而非文件 |
--stderrthreshold severity | 达到或超过该级别的日志进入 stderr(默认2,即 ERROR) |
-v, --v Level | 设置 V 级别日志的详细程度 |
--vmodule moduleSpec | 按pattern=N的逗号分隔列表,对特定文件做日志级别过滤 |
这些继承参数与根命令 ark.md 中的定义一一对应,是 Velero CLI 所有子命令共享的日志与连接基础设施。
table 输出格式:九列数据的含义
默认的table输出由 backup_printer.go 定义,列定义见其中的backupColumns:
Name Status Errors Warnings Created Expires Storage Location Queue Position Selector各列数据在printBackup函数中逐项填充,含义如下:
| 列 | 数据来源 | 说明 |
|---|---|---|
Name | backup.Name | 备份名称 |
Status | backup.Status.Phase | 备份当前阶段,见下文“阶段解析”;对象正在被删除时显示Deleting |
Errors | backup.Status.Errors | 备份过程中产生的错误计数 |
Warnings | backup.Status.Warnings | 备份过程中产生的警告计数 |
Created | backup.Status.StartTimestamp | 备份实际开始时间;尚未开始(如停留在 New 阶段)时显示n/a |
Expires | backup.Status.Expiration或由StartTimestamp + TTL推算 | 相对当前时间的剩余有效期;过期后显示xx ago,无过期时间显示n/a |
Storage Location | backup.Spec.StorageLocation | 该备份使用的存储位置 |
Queue Position | backup.Status.QueuePosition | 备份在队列中的位置;为 0(不在队列)时显示为空 |
Selector | backup.Spec.LabelSelector | 备份声明要包含的资源标签选择器 |
值得注意的实现细节:
- 排序:
printBackupList先调用sortBackupsByPrefixAndTimestamp排序:默认按名称字典序;如果多个备份名来自同一调度且带 14 位时间戳后缀(如schedule-20240915120000),则同一前缀内按时间戳从新到旧排列(见 backup_printer.go)。 - 过期时间推算:若
Status.Expiration尚未生成,源码只在“备份已经开始(StartTimestamp非空)且 TTL 大于 0”时用StartTimestamp + TTL估算过期时间,避免把停滞在 New 阶段的备份误判为已过期。 - 空阶段处理:阶段为空时按
New处理。
备份阶段(Status)枚举
Status列的取值定义于 backup_types.go(BackupPhase*常量),完整枚举如下:
| 阶段 | 含义 |
|---|---|
New | 刚创建,尚未被控制器处理 |
Queued | 已入队等待执行 |
ReadyToStart | 已就绪,等待启动 |
FailedValidation | 参数校验失败,备份不会执行 |
InProgress | 备份执行中 |
WaitingForPluginOperations | 等待插件异步操作完成 |
WaitingForPluginOperationsPartiallyFailed | 插件操作部分失败,等待其余完成 |
Finalizing | 收尾阶段 |
FinalizingPartiallyFailed | 收尾阶段部分失败 |
Completed | 备份成功完成 |
PartiallyFailed | 备份完成但存在部分失败(如某些资源失败) |
Failed | 备份失败 |
Deleting | 删除中 |
在 v0.3.0 时代,阶段集合相对精简(New、InProgress、Completed、Failed、Deleting 等);上述列表为当前仓库完整枚举,可作为查询状态时的参考全集。
json / yaml 输出:面向脚本与排查
-o json与-o yaml通过 output.go 的printEncoded实现:直接序列化Backup/BackupList对象。一个细节是:当对象是列表但只包含 1 个条目时,会直接打印该单个对象而不是外层列表,便于脚本解析。
ark backup get -o json # 所有备份的 JSON ark backup get my-backup -o yaml # 单个备份的 YAML,含完整 Spec 与 Statusjson/yaml 输出包含完整资源字段(metadata、spec、status),是排查备份详情(如status.phase、status.errors、status.warnings、spec.ttl、spec.storageLocation等)和接入自动化脚本的首选方式。
典型使用场景
1. 查看当前所有备份的状态
ark backup get重点关注Status、Errors、Warnings三列:Completed且Errors=0说明备份成功;出现PartiallyFailed或Failed时结合Errors/Warnings数量判断严重程度。
2. 按标签筛选备份
ark backup get -l env=prod ark backup get --label-columns=env,app第一条只显示env=prod的备份;第二条把env、app两个标签展示为独立列,方便批量比对不同环境的备份覆盖情况。
3. 深入排查单个备份
ark backup get my-backup -o yaml ark backup get my-backup -o json获取完整 Spec 与 Status 后,可核对 TTL、存储位置、资源过滤器(LabelSelector)以及详细的错误/警告统计。
4. 脚本化轮询备份完成状态
ark backup get my-backup -o jsonpath='{.status.phase}'在支持该输出格式的环境下,可用 jsonpath 提取阶段字段做轮询判断;否则可退化为-o json配合jq解析,例如:
ark backup get -o json | jq -r '.items[] | select(.status.phase=="Failed") | .metadata.name'相关命令与延伸阅读
backup get只是备份管理命令族的一员,配套子命令还包括:
- ark backup create:创建备份;
- ark backup:备份命令族入口;
- 恢复与调度查询:
ark restore get、ark schedule get使用相同的查询与输出框架(对应源码 pkg/cmd/cli/restore/get.go、pkg/cmd/cli/schedule/get.go)。
若需了解备份对象的完整字段定义(含BackupSpec、BackupStatus及各阶段常量),可深入阅读 backup_types.go;输出与打印层的通用实现(BindFlags、ValidateFlags、PrintWithFormat、表格打印)集中在 output.go。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考