Velero VolumeSnapshotLocation 配置指南为 Kubernetes 备份卷快照定义云存储位置【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/veleroVolumeSnapshotLocation卷快照位置是 Velero 中用于定义把备份产生的卷快照存到哪里的核心 CRD 资源。本篇指南以 v0.11.0 文档为骨架结合仓库中 VolumeSnapshotLocation API 定义 与 backup 控制器 的实现系统讲解 VSL 的 YAML 结构、provider 配置参数、CLI 管理命令以及备份时的选择与校验机制帮助你为多云环境正确规划并落地卷快照存储位置。VolumeSnapshotLocation 是什么在 Velero 中卷快照位置Volume Snapshot Location简称 VSL是备份过程中所创建的卷快照的存储位置。当一次备份包含 PV/PVC 卷时Velero 会调用云厂商的快照 API如 AWS EBS、Azure Managed Disk、GCP PD为卷创建快照而每个 VSL 就描述了用哪个云厂商、在哪个区域/资源组存放这些快照。从源码看VSL 是注册在velero.io分组下的标准 CRD拥有短名vsl并带有Provider、Phase、Age三个打印列见 volume_snapshot_location_type.go// VolumeSnapshotLocation is a location where Velero stores volume snapshots. type VolumeSnapshotLocation struct { metav1.TypeMeta json:,inline metav1.ObjectMeta json:metadata,omitempty Spec VolumeSnapshotLocationSpec json:spec,omitempty Status VolumeSnapshotLocationStatus json:status,omitempty }其 Spec 由三部分组成见 pkg/apis/velero/v1/volume_snapshot_location_type.goprovider提供卷快照能力的云厂商名称configprovider 专属的键值配置如 AWS 的region、Azure 的resourceGroupcredential可选指定该位置使用的凭据 Secret优先级高于全局凭据。Status 中仅有一个Phase字段取值Available或Unavailable源码用来标记该位置当前是否可用。设计要点每个 provider 至少一个位置Velero 可以为多个云厂商分别配置卷快照位置对同一个 provider也可以配置多个候选 VSL但在执行一次备份时每个 provider 最多只能选中一个位置。也就是说如果集群中有 AWS、Azure、GCP 的卷每个涉及的 provider 都需要至少一个 VSL同 provider 下可以有多个 VSL例如按区域划分aws-us-east-1、aws-us-west-2但备份时按名称指定后同名 provider 只能生效一个。这一点在备份控制器的校验逻辑中体现得很清楚validateAndGetSnapshotLocations会按备份指定的 VSL 名称逐个加载一旦发现同一 provider 被指定了多个位置就会报错more than one VolumeSnapshotLocation name specified for provider %s见 pkg/controller/backup_controller.go。VSL YAML 结构示例一个最典型的 AWS VSL 定义如下原文档中的标准示例apiVersion: velero.io/v1 kind: VolumeSnapshotLocation metadata: name: aws-default namespace: velero spec: provider: aws config: region: us-west-2要点说明apiVersionvelero.io/v1metadata.namespace通常与 Velero 安装在同一命名空间默认velero备份控制器只会在该命名空间内查找 VSLspec.provider云厂商标识Velero 原生支持aws、gcp、azure其他厂商通过外部插件提供spec.configprovider 专属键值对可空。如需为同一位置单独指定凭据不依赖全局--secret-file可在 Spec 中追加spec: provider: aws config: region: us-west-2 credential: name: aws-vsl-creds key: cloud其中credential是一个标准的SecretKeySelector指向某 Secret 中的某个数据键。备份执行时控制器会通过 internal/volume/snapshotlocation.go 的UpdateVolumeSnapshotLocationWithCredentialConfig将该 Secret 落盘路径写入config[credentialsFile]再传给插件同时出于安全考虑该函数会主动删除用户自定义的credentialsFile配置键防止路径穿越攻击。参数参考主配置参数KeyTypeDefaultMeaningproviderStringVelero 原生支持aws、gcp、azure其他 provider 可通过外部插件获得必填实际用于存储卷快照的云厂商名称config见下文各 provider 专属配置或对应 provider 插件的文档可选provider 专属键值配置credentialSecretKeySelector可选该 VSL 使用的凭据引用优先级高于全局凭据AWSconfigKeyTypeDefaultMeaningregionstring空示例us-east-1。完整区域列表参考 AWS 官方文档若未提供将从 AWS S3 API 查询得到region决定快照创建在哪个区域。若省略Velero 会尝试从 AWS 侧查询默认区域因此只要集群节点具备相应的 IAM 权限即使不显式写region也能工作但显式配置仍是更可控、可复现的做法。AzureconfigKeyTypeDefaultMeaningapiTimeoutmetav1.Duration2m0sAzure API 请求的超时等待时间resourceGroupstring可选卷快照的存放资源组不填时使用集群所在的资源组apiTimeout控制 Velero 调用 Azure 快照相关 API 的最长等待时间格式遵循 Kubernetes 的metav1.Duration表示法如3m、90s当你的快照需要存放在与集群不同的资源组时通过resourceGroup指定。GCPGCP 的 VSL无需任何 config 参数仅声明provider: gcp即可插件所需的项目、区域等上下文来自 GCP 凭据与目标卷本身。注意上述 AWS/Azure/GCP 参数表来自 v0.11.0 版本文档属于该版本语境下的原生 provider 配置。当前仓库中具体 provider 插件的参数实现已随插件独立演进建议以你所安装的 provider 插件版本文档为准本指南中的 CRD 结构与 CLI 用法对当前仓库仍然成立。用 CLI 管理 VolumeSnapshotLocation除了直接kubectl applyYAMLVelero CLI 提供了一组专门命令实现在 pkg/cmd/cli/snapshotlocation 包中注册为snapshot-location子命令。创建velero snapshot-location createvelero snapshot-location create NAME \ --provider PROVIDER \ --config KEY1VALUE1,KEY2VALUE2 \ [--credential SECRET_NAMESECRET_KEY] \ [--labels KV,...]创建命令支持的完整参数见 create.goFlag说明--provider卷快照 provider 名称如aws、azure、gcp必填源码中缺失时校验直接报错--provider is required--config配置键值对如regionus-west-2、apiTimeout3m--labels附加到 VSL 上的标签--credential该位置使用的凭据格式Secret名Secret内数据键名只能含 1 个键值对源码 Validate 强制约束示例velero snapshot-location create aws-default \ --provider aws \ --config regionus-west-2 velero snapshot-location create azure-default \ --provider azure \ --config apiTimeout3m,resourceGroupmy-backup-rg \ --credential azure-vsl-credscloud查看velero snapshot-location getvelero snapshot-location get # 列出当前命名空间下全部 VSL velero snapshot-location get aws-default # 查看指定 VSL velero snapshot-location get -l tierprod # 按标签选择器过滤get命令支持按名称精确获取、按--selector/-l标签过滤并支持-o输出格式控制见 get.go同时具备 VSL 名称的 shell 自动补全。设置凭据velero snapshot-location set对已存在的 VSL 更新凭据引用velero snapshot-location set NAME --credential SECRET_NAMESECRET_KEY实现上会先Get出目标 VSL再写入Spec.Credential并Update回集群见 set.go同样限制为单个键值对。安装时自动创建velero installvelero install也支持通过参数直接生成 VSL见 pkg/cmd/cli/install/install.govelero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.0.0 \ --bucket backups \ --secret-file ./aws-iam-creds \ --backup-location-config regionus-east-2 \ --snapshot-location-config regionus-east-2--snapshot-location-config格式key1value1,key2value2用于生成 VSL 的config--use-volume-snapshots默认开启设为false时不自动创建快照位置同时--snapshot-location-config必须为空否则安装校验报错见 install.go。Azure 示例velero install \ --provider azure \ --plugins velero/velero-plugin-for-microsoft-azure:v1.0.0 \ --bucket $BLOB_CONTAINER \ --secret-file ./credentials-velero \ --backup-location-config resourceGroup$AZURE_BACKUP_RESOURCE_GROUP,storageAccount$AZURE_STORAGE_ACCOUNT_ID \ --snapshot-location-config apiTimeoutYOUR_TIMEOUT,resourceGroup$AZURE_BACKUP_RESOURCE_GROUP备份时如何选择 VSL校验与加载流程当一次备份开始执行时备份控制器会按以下流程处理 VSL核心实现在 pkg/controller/backup_controller.go 的validateAndGetSnapshotLocations名称加载读取backup.Spec.VolumeSnapshotLocationsBackupAPI 中以字符串列表形式保存位置名见 backup_types.go逐个Get对应的 VSL存在性校验某个 VSL 不存在时报错并提示该备份执行前必须先创建对应的 VolumeSnapshotLocation CRD单 provider 唯一性校验同一 provider 被指定了多个位置时直接报错上文提到的more than one VolumeSnapshotLocation...凭据注入调用UpdateVolumeSnapshotLocationWithCredentialConfig把 VSL 指定的 Secret 凭据落盘路径写入config[credentialsFile]传给快照插件并删除用户自定义的credentialsFile键以防止路径穿越按 provider 分组最终以provider - VolumeSnapshotLocation的映射交付给快照执行逻辑供后续对不同厂商的卷分别打快照。对应的测试用例可在 backup_controller_test.go 中看到覆盖了VSL 不存在报错同一 provider 指定两个位置报错合法场景下按 provider 正确分组等典型场景。在备份/定时备份命令中指定 VSL创建备份或 Schedule 时通过--volume-snapshot-locations指定要使用的 VSL 名称可多个但同一 provider 只能一个velero backup create my-backup \ --include-namespaces default \ --volume-snapshot-locations aws-default velero schedule create daily-backup \ --schedule 0 2 * * * \ --include-namespaces default \ --volume-snapshot-locations aws-default该参数在 backup/create.go 中被定义为StringSlice并支持 VSL 名称自动补全若不指定则使用安装时配置的默认 VSL。服务端还支持通过--default-volume-snapshot-locations格式provider1:location-01,provider2:location-02为各 provider 配置默认位置见 pkg/cmd/server/config/config.go。常见问题与排查备份一直卡在 New 阶段并提示 VSL 缺失检查backup.Spec.VolumeSnapshotLocations中引用的 VSL 是否真实存在、命名空间是否正确必须与 Velero 同一命名空间。错误信息会直接给出缺失的 VSL 名见上文步骤 2。同一 provider 被指定多个位置--volume-snapshot-locations中每个 provider 只能出现一次若集群卷分布在多个区域请为每个区域各建一个 VSL 并把不同区域做成不同的备份任务而不是在同一个备份里传多个同 provider 位置。快照凭据不符合预期优先检查 VSL 是否配置了credential字段它优先于全局凭据以及velero snapshot-location set是否正确更新另外任何用户配置的credentialsFile键都会被服务端删除请通过credential字段注入凭据。velero install报--snapshot-location-config must be empty说明同时指定了--use-volume-snapshotsfalse和--snapshot-location-config二者互斥。小结VolumeSnapshotLocation 是 Velero 卷快照能力的地基它把卷快照存到哪里从备份逻辑中解耦出来使同一套备份流程可以对接多个云厂商、多区域、多资源组的快照后端。配置 VSL 只需三件事选好 provider、填对 config、必要时挂上专属凭据然后通过--volume-snapshot-locations在备份时按需引用。结合本仓库的 API 类型定义、CLI 实现 与 备份控制器校验逻辑你可以快速定位配置问题并设计出适合多集群、多云场景的快照存储方案。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考