Ark(Velero)backup download命令深度解析:把 Kubernetes 备份清单下载到本地
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
本篇文章以 site/content/docs/v0.6.0/cli-reference/ark_backup_download.md 为主体,结合当前仓库源码(pkg/cmd/cli/backup/download.go 等)展开。文章将完整继承原文档中的命令语法、全部选项及默认值,并深入讲解其底层工作流程。
ark backup download是 Ark(Velero 的前身,v0.6.0 时代项目仍以ark为命令名)用于将备份内容从对象存储下载到本地的 CLI 命令。它生成的<NAME>-data.tar.gz归档包含该备份捕获的全部 Kubernetes 资源清单,是离线审计、迁移前检查或灾难恢复演练的关键手段。读完本文,你将掌握该命令的完整参数、默认行为、下载产物内容,以及它背后"DownloadRequest 自定义资源 → 服务端控制器 → 预签名 URL → HTTP 流式下载"的完整实现链路。
命令概述:下载一份备份
原文档对该命令的 Synopsis 只有一句话:
Download a backup
其语义可以进一步展开为:从当前备份存储位置(Backup Storage Location)中拉取指定备份的完整内容,默认以<备份名>-data.tar.gz的形式写入当前工作目录。需要注意的是,该归档只包含Kubernetes 资源清单(Kubernetes manifests),并不包含持久卷快照(Persistent Volume Snapshot)的数据内容——这一点在当前源码的命令长描述中也有明确说明(pkg/cmd/cli/backup/download.go):
Download all Kubernetes manifests for a backup. Contents of persistent volume snapshots are not included.
关于命令名的历史说明
v0.6.0 时期项目名为Ark,因此文档中命令为ark backup download。随着项目更名为Velero,当前仓库中对应的命令已演变为velero backup download(命令实现位于 pkg/cmd/cli/backup/download.go,Use: "download NAME")。下文同时给出两种命令形式,实际使用时以你安装的二进制名称为准。
命令语法
ark backup download NAME [flags]其中NAME为要下载的备份名称(必填,且只能传一个参数)。当前源码通过cobra.ExactArgs(1)严格校验参数个数(pkg/cmd/cli/backup/download.go),多传或少传都会报错。同时该命令注册了备份名自动补全(ValidArgsFunction = cli.CompleteBackupNames(f)),在支持补全的 Shell 中可直接 Tab 提示可下载的备份列表。
命令选项详解(Options)
原文档给出的命令级选项如下:
--force forces the download and will overwrite file if it exists already -h, --help help for download -o, --output string path to output file. Defaults to <NAME>-data.tar.gz in the current directory --timeout duration maximum time to wait to process download request (default 1m0s)逐一展开说明:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--force | bool | false | 强制下载:若目标文件已存在则直接覆盖。源码中对应flags.BoolVar(&o.Force, "force", ...)(download.go) |
-h, --help | - | - | 显示 download 子命令的帮助信息 |
-o, --output string | string | <NAME>-data.tar.gz(当前目录) | 指定输出文件路径。不指定时,源码会在Complete阶段通过os.Getwd()取得当前目录,并拼接为<当前目录>/<NAME>-data.tar.gz(download.go) |
--timeout duration | duration | 1m0s | 等待下载请求处理完成的最大时间。默认 1 分钟,源码中NewDownloadOptions将其初始化为time.Minute(download.go) |
默认文件名与防覆盖机制
当--output未指定时,默认输出文件名为<NAME>-data.tar.gz。注意文件名中内嵌的是备份名称,例如备份名为daily-2026-09-16,则默认输出daily-2026-09-16-data.tar.gz。
关于是否覆盖已有文件,源码采用 Unix 文件打开标志来控制:
- 未加
--force时使用os.O_RDWR | os.O_CREATE | os.O_EXCL,其中O_EXCL保证"若文件已存在则打开失败",从而天然防止误覆盖; - 加了
--force后改用os.O_TRUNC,直接截断覆盖已存在文件(download.go)。
此外,打开文件时使用权限位0600,即下载到本地的备份归档默认仅当前用户可读写。
继承自父命令的选项(Options inherited from parent commands)
以下选项并非 download 子命令独有,而是继承自ark根命令的全局日志与连接配置(原文档完整列出,此处原样继承):
--alsologtostderr log to standard error as well as files --kubeconfig string Path to the kubeconfig file to use to talk to the Kubernetes apiserver. If unset, try the environment variable KUBECONFIG, as well as in-cluster configuration --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) --log_dir string If non-empty, write log files in this directory --logtostderr log to standard error instead of files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level log level for V logs --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging其中--kubeconfig是连接 Kubernetes API Server 的关键选项:若未显式指定,则依次尝试环境变量KUBECONFIG与集群内配置(in-cluster configuration)。
当前源码新增的 TLS 相关选项
原 v0.6.0 文档未包含、但当前仓库实现中已具备的额外选项(download.go):
| 选项 | 说明 |
|---|---|
--insecure-skip-tls-verify | 为true时不校验对象存储的 TLS 证书有效性。源码注释明确警告该行为不安全、易受中间人攻击,不建议在生产环境使用 |
--cacert | 指定用于校验 TLS 连接的 CA 证书包路径;若未指定,则优先使用 BackupStorageLocation 配置中携带的 CA 证书(通过cacert.GetCACertFromBackup从 Backup 关联的 BSL 获取,见 download.go) |
使用示例
基本下载
ark backup download daily-2026-09-16命令执行成功后会在当前目录生成daily-2026-09-16-data.tar.gz,并输出提示:
Backup daily-2026-09-16 has been successfully downloaded to .../daily-2026-09-16-data.tar.gz指定输出路径并覆盖已有文件
ark backup download daily-2026-09-16 --output /data/backups/daily.tar.gz --force调整等待超时
当备份存储位置(如对象存储)响应较慢时,可放宽超时时间:
ark backup download daily-2026-09-16 --timeout 5m校验 TLS(当前版本)
velero backup download daily-2026-09-16 --cacert /etc/ssl/my-ca.pem下载产物内容说明
下载得到的*-data.tar.gz是备份内容的归档包,主要包含:
- 备份执行时从集群中采集的所有 Kubernetes 资源清单(如 Deployment、Pod、ConfigMap、Namespace 等,依据备份时配置的资源过滤规则);
- 与备份相关的元数据文件(如资源列表、卷快照清单等)。
不包含的内容:
- 持久卷(PV)的快照数据本身——卷快照数据在备份时由对象存储插件单独保存,通常不是以这种归档形式直接下发的;
- 备份日志(日志需使用
ark backup logs命令获取,参见 ark_backup_logs.md)。
底层实现原理:一次下载背后的完整链路
ark backup download并不是简单地从对象存储拉文件,而是走了一条"CLI 提交请求 → 服务端控制器处理 → 返回预签名 URL → CLI 拉取数据"的异步链路。以下结合源码逐层拆解。
第一步:参数校验与文件准备(Validate / Complete)
执行流程依次为Complete→Validate→Run(download.go):
Complete负责填充选项:将参数args[0]写入o.Name、设置文件打开标志、计算默认输出路径;Validate通过 Kubernetes client(controller-runtime 的KubebuilderClient)在 Velero 命名空间中查询该 Backup 对象,确认备份确实存在,不存在则直接报错返回(download.go);Run执行真正的下载逻辑。
第二步:创建 DownloadRequest 自定义资源
CLI 在下载前会以备份名加随机 UUID 命名,创建一个DownloadRequest自定义资源,其Target.Kind为BackupContents(downloadrequest.go):
reqName := fmt.Sprintf("%s-%s", name, uuid.String()) created := builder.ForDownloadRequest(namespace, reqName).Target(kind, name).Result() kbClient.Create(ctx, created, ...)DownloadTargetKind是一组枚举值,除BackupContents外还包括BackupLog、RestoreLog、BackupVolumeSnapshots、BackupResourceList等,完整定义见 pkg/apis/velero/v1/download_request_types.go。download 命令使用的正是BackupContents。
第三步:服务端控制器生成预签名下载 URL
Velero 服务端的 download-request 控制器(pkg/controller/download_request_controller.go)会监听这类DownloadRequest对象:
- 若请求已过期(超过
Status.Expiration时间),控制器直接删除该请求,避免无效重试(download_request_controller.go); - 若处理完成(
DownloadRequestPhaseProcessed)且未过期,则跳过(download_request_controller.go); - 正常情况下,控制器从备份存储中取出对应备份内容,为对象生成预签名(pre-signed)下载 URL,写入
Status.DownloadURL字段。
第四步:CLI 轮询等待并流式下载
创建DownloadRequest后,CLI 进入一个最长不超过--timeout(默认 1 分钟)的轮询循环(downloadrequest.go):
- 每 25ms 查询一次该
DownloadRequest对象; - 一旦
Status.DownloadURL非空,立即拿到 URL 退出循环; - 若在超时前仍未等到 URL,返回
download request download url timeout, check velero server logs for errors. backup storage location may not be available(提示检查 Velero 服务端日志与存储位置可用性); - 若请求状态为
Failed且带错误信息,则直接返回该信息(这比无谓等到超时更有诊断价值)。
拿到 URL 后,CLI 通过标准 HTTP GET 请求流式下载数据(downloadrequest.go):
- TLS 校验:默认使用系统 CA 证书池;若指定了
--cacert则追加该证书;若--cacert读取失败但 BSL 配置了 CA 证书,会回退使用 BSL 的证书;--insecure-skip-tls-verify可完全跳过校验(不推荐生产使用)。若因未知 CA 导致握手失败,错误信息还会贴心地提示可用--insecure-skip-tls-verify绕过; - 错误响应:HTTP 404 返回
file not found;其他非 200 状态返回响应体中的错误文本; - 解压处理:
BackupContents类型的下载不做 gzip 解压,直接原样写入文件(日志等其他类型的下载才会流式解压,且解压数据受 1GB 上限保护,防止解压炸弹,见 downloadrequest.go)。
第五步:失败清理与成功提示
如果下载过程中出错,Run会调用os.Remove(o.Output)删除半成品文件,避免留下残缺归档(download.go);成功后则输出:
Backup <NAME> has been successfully downloaded to <output path>测试佐证
仓库中的单元测试 pkg/cmd/cli/backup/download_test.go 验证了完整流程:构造 mock Factory 与 fake controller-runtime client,预置备份对象后执行NewDownloadCommand,覆盖--output、--force、--timeout、--insecure-skip-tls-verify、--cacert各选项的绑定与解析,并断言各选项最终落到DownloadOptions字段的预期值;随后实际执行命令,验证真实场景下能走到"download request download url timeout"(说明已成功创建 DownloadRequest 并进入轮询等待)或成功下载两条路径。
常见问题与排错
| 现象 | 可能原因与排查方向 |
|---|---|
报错file ... already exists | 目标文件已存在且未加--force,这是O_EXCL防覆盖机制的预期行为;确认无碍后加--force重试 |
报错download request download url timeout | --timeout内服务端未生成下载 URL。检查 Velero 服务端日志、BackupStorageLocation 指向的对象存储是否可达、凭据是否有效 |
报错file not found | HTTP 404,说明备份内容在存储中不存在,可能是备份已被删除或存储中数据不完整 |
| 下载大备份时中断 | 适当调大--timeout;该超时同时约束请求处理与下载过程本身 |
| 自签证书的对象存储报 TLS 校验失败 | 通过--cacert指定对应 CA 证书包;仅对可信环境可用--insecure-skip-tls-verify临时绕过 |
关联命令
ark backup download是ark backup子命令族的一员,兄弟命令包括(参见 ark_backup.md):
- ark backup create:创建备份
- ark backup describe:查看备份详情
- ark backup get:列出备份
- ark backup logs:获取备份日志
典型组合场景:先用ark backup get确认备份状态,再用ark backup download将清单归档拉到本地离线分析,用ark backup logs排查备份执行过程中的异常。对于需要还原的场景,则使用ark restore系列命令完成。
总结
ark backup download(现行版本中为velero backup download)看似只是一个"下载文件"的简单命令,实际上背后是一套完整的异步请求链路:CLI 以DownloadRequest自定义资源为载体,由 Velero 服务端控制器负责从备份存储生成预签名 URL,CLI 再轮询获取并流式下载。理解这条链路,能够帮助你在遇到超时、TLS 校验失败或下载内容缺失时快速定位问题——所有相关参数(--output、--force、--timeout)及其默认行为均可直接对照 pkg/cmd/cli/backup/download.go 与 pkg/cmd/util/downloadrequest/downloadrequest.go 中的实现进行验证。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考