Velero/Ark `backup download` 命令完全指南:下载备份内容的原理与实战
Velero/Arkbackup download命令完全指南下载备份内容的原理与实战【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本文档原始出处为仓库中的 ArkVelero 前身CLI 参考页 site/content/docs/v0.7.1/cli-reference/ark_backup_download.md以下内容以其为骨架并结合当前仓库的pkg/cmd/cli/backup/download.go、pkg/cmd/util/downloadrequest/、pkg/controller/download_request_controller.go等源码实现进行深度扩充。ark backup download用于将一次备份中包含的**全部 Kubernetes 资源清单Kubernetes manifests**从对象存储下载到本地便于人工审计、离线排障或手工恢复。它下载的是备份的“内容”归档不包含持久卷快照的数据本身。读完本文你将掌握该命令的完整参数用法、下载产物格式以及它背后的 DownloadRequest 控制器、预签名 URL 签名与 TLS 校验的完整链路。命令概览与定位在 ArkHeptio Ark的命令体系中backup download属于 ark backup 子命令组专门用于处理“下载备份内容”这一类操作ark backup download NAME [flags]其中NAME是备份的名称必填且只接受一个参数。与同组的ark backup get列出备份、ark backup describe查看备份详情、ark backup logs获取备份日志不同download直接拉取的是对象存储中该备份的数据归档文件。需要特别说明的是当前文档对应 Ark v0.7.1 时代的 CLI。而仓库中的现代实现pkg/cmd/cli/backup/download.go将命令演进为velero backup download NAME命令定位描述为Download all Kubernetes manifests for a backup. Contents of persistent volume snapshots are not included.即下载一次备份包含的全部 Kubernetes 清单不包含持久卷快照的内容。这与文档中 Download a backup 的语义完全一致只是命令行前缀从ark改成了velero默认命名空间从heptio-ark变成了velero。命令参数详解子命令专属参数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布尔false强制下载若目标文件已存在则直接覆盖-h, --help布尔—显示帮助信息-o, --output字符串NAME-data.tar.gz输出文件路径不指定时默认写入当前目录下的NAME-data.tar.gz--timeout时长1m0s处理下载请求的最大等待时间在现代实现中download还额外增加了两个与对象存储 TLS 认证相关的参数pkg/cmd/cli/backup/download.go--insecure-skip-tls-verify若为true下载时不校验对象存储的 TLS 证书有效性。该方式不安全容易遭受中间人man-in-the-middle攻击不建议在生产环境使用--cacert指定用于校验 TLS 连接的 CA 证书包路径。若未指定则优先使用该备份所属 BackupStorageLocation 中配置的 CA 证书如果可用。从父命令继承的全局参数Options inherited from parent commands--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 -n, --namespace string The namespace in which Ark should operate (default heptio-ark) --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 patternN settings for file-filtered logging这些参数中与日常使用最相关的是--kubeconfig指定连接 Kubernetes apiserver 所用的 kubeconfig 文件路径。若未设置会依次尝试环境变量KUBECONFIG和集群内配置in-cluster configuration-n, --namespaceArk 操作的命名空间v0.7.1 时代默认是heptio-ark现代 Velero 版本默认是velero-v设置 V 日志级别便于排查下载过程中遇到的问题。实际用法示例1. 基本用法下载到默认位置ark backup download my-backup执行后Ark 会在当前工作目录下生成my-backup-data.tar.gz文件。默认输出路径由源码中的逻辑确定pkg/cmd/cli/backup/download.go当--output为空时取当前工作目录拼接NAME-data.tar.gz。2. 指定输出路径ark backup download my-backup -o /tmp/my-backup-contents.tar.gz3. 强制覆盖已存在的文件ark backup download my-backup --force默认情况下若输出文件已存在下载会失败源码使用os.O_CREATE | os.O_EXCL独占创建语义pkg/cmd/cli/backup/download.go加上--force后改为os.O_TRUNC语义直接截断并覆盖原文件。4. 调整下载超时时间ark backup download my-backup --timeout 5m下载的超时时间默认是 1 分钟。对于大集群备份资源清单非常多、对象存储响应慢或远端对象存储建议适当调大。5. 使用自定义 CA 证书访问 HTTPS 对象存储velero backup download my-backup --cacert /path/to/ca-bundle.crt若对象存储使用自签名证书且未在 BackupStorageLocation 中配置 CA 证书可用此参数显式指定 CA 证书包。下载产物NAME-data.tar.gz里有什么backup download下载的是该备份的BackupContents备份内容归档文件。从源码可以看出命令行通过velerov1api.DownloadTargetKindBackupContents这一目标类型发起下载pkg/cmd/cli/backup/download.go对应的对象存储键由 pkg/persistence/object_store.go 中的getBackupContentsKey决定实际归档格式为.tar.gz。需要特别强调的是该归档只包含 Kubernetes 资源清单如 Deployment、ConfigMap、PVC 的定义等不包含持久卷快照的实际数据内容。若需要恢复卷数据应依赖快照或文件系统备份机制而非本命令。在对象存储的对象键布局中BackupContents与BackupLog、BackupVolumeSnapshots、BackupResults、BackupResourceList等属于同一批可下载的“备份工件artifacts”完整的目标类型枚举定义在 pkg/apis/velero/v1/download_request_types.goBackupLog | BackupContents | BackupVolumeSnapshots | BackupItemOperations | BackupResourceList | BackupResults | RestoreLog | RestoreResults | RestoreResourceList | RestoreItemOperations | CSIBackupVolumeSnapshots | CSIBackupVolumeSnapshotContents | BackupVolumeInfos | RestoreVolumeInfo底层原理DownloadRequest 与预签名 URL 机制backup download并非由客户端直接访问对象存储而是通过一个名为DownloadRequest的自定义资源与download-request 控制器协作完成。整个过程可以概括为以下三步第一步客户端创建 DownloadRequest命令运行时客户端会为本次下载生成一个随机 UUID并创建一个DownloadRequestCR命名形如backup-name-uuid其Spec.Target.Kind为BackupContents、Spec.Target.Name为备份名pkg/cmd/util/downloadrequest/downloadrequest.go。第二步控制器签名预签名 URL集群内的 download-request 控制器pkg/controller/download_request_controller.go监听到新的 DownloadRequest 后会依次校验备份对应的目标工件是否已生成——若备份仍处于New、Queued、ReadyToStart、FailedValidation等尚未产出工件的阶段控制器会直接把请求置为Failed并附上原因而不是签名一个注定 404 的 URL根据备份的StorageLocation找到对应的 BackupStorageLocation通过插件管理器获得对应对象存储的 backup store调用backupStore.GetDownloadURL()生成一个预签名 URL写入Status.DownloadURL并把阶段置为Processed。预签名 URL 的有效期为DownloadURLTTL即10 分钟pkg/persistence/object_store.go。控制器的轮询逻辑会每 25 毫秒检查一次 DownloadRequest 状态一旦看到Failed阶段就立即停止等待避免把真实的失败原因误报为“存储位置不可用”的超时pkg/cmd/util/downloadrequest/downloadrequest.go。第三步客户端用 HTTP GET 拉取文件拿到预签名 URL 后客户端发起 HTTP GET 请求将响应体流式写入目标文件。由于BackupContents本身就是 tar.gz 归档源码中的解压分支pkg/cmd/util/downloadrequest/downloadrequest.go会跳过gzip 解压处理——只有下载日志类工件如 BackupLog时才需要客户端解压且解压大小被限制在 1GB 以内以防资源耗尽。TLS 证书校验与 CA 证书回退链对于使用 HTTPS 的对象存储如自签名的 MinIO、内部 S3下载时的证书校验按以下优先级回退pkg/cmd/util/downloadrequest/downloadrequest.go若指定了--cacert优先从该文件加载 CA 证书若文件读取失败则回退使用 BackupStorageLocation 中的 CA 证书两者都不可用时返回“无法打开 cacert”错误若未指定--cacert使用 BackupStorageLocation 配置中的 CA 证书若有最后系统 CA 证书池始终作为基础--insecure-skip-tls-verify可以关闭校验但源码会明确提示其面临中间人攻击风险。此外命令运行时会先从 Backup 对象反查其所属 BackupStorageLocation 的 CA 证书pkg/cmd/cli/backup/download.go即使命令行没有显式传参也能自动兼容配了自定义 CA 的对象存储。这一行为在 pkg/cmd/util/downloadrequest/downloadrequest_test.go 中有专门的端到端测试覆盖如TestStreamWithBSLCACertEndToEnd、TestCACertFallback、TestBSLUpgradeScenario验证了带/不带 BSL CA 证书、HTTP/HTTPS 混合环境、以及老备份升级等场景的兼容性。错误处理与失败排查整个下载链路存在多层错误兜底理解它们有助于快速定位问题场景行为提示信息输出文件已存在且未加--force下载失败不覆盖原文件文件已存在的系统错误预签名 URL 等待超过--timeout返回超时错误download request download url timeout, check velero server logs for errorspkg/cmd/util/downloadrequest/downloadrequest.go控制器判定备份尚无工件DownloadRequest 置为Failed并带消息消息写明备份所处阶段pkg/controller/download_request_controller.go服务器返回 404返回ErrNotFoundfile not foundpkg/cmd/util/downloadrequest/downloadrequest.goTLS 证书不受信任返回带提示的错误提示可使用--insecure-skip-tls-verify但不建议下载中途失败客户端删除已创建的半成品文件—同时下载成功后会打印确认信息Backup my-backup has been successfully downloaded to /path/to/my-backup-data.tar.gz若下载失败客户端会删除可能已创建的不完整文件pkg/cmd/cli/backup/download.go避免留下损坏的归档误导后续操作。相关命令与延伸阅读ark backup create创建备份ark backup describe查看备份详情ark backup logs获取备份日志走同一套 DownloadRequest 机制但目标类型为BackupLogDownloadRequest 类型与各阶段定义pkg/apis/velero/v1/download_request_types.godownload-request 控制器实现pkg/controller/download_request_controller.go客户端下载链路与 TLS 处理pkg/cmd/util/downloadrequest/downloadrequest.go。小结ark backup download现代版本为velero backup download是运维人员在排查备份内容、验证备份完整性时最常用的命令之一。掌握其参数--output、--force、--timeout、--cacert、--insecure-skip-tls-verify、理解其“客户端创建 DownloadRequest → 控制器签名预签名 URL → 客户端 HTTP 拉取”的完整链路以及 TLS 证书回退规则可以帮助你在私有云对象存储、自签名证书等复杂环境中顺利拉取备份内容进行离线审计或恢复演练。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考