news 2026/9/16 11:10:38

Velero VolumeSnapshotLocation 配置指南:为 Kubernetes 备份卷快照定义云存储位置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Velero VolumeSnapshotLocation 配置指南:为 Kubernetes 备份卷快照定义云存储位置

Velero VolumeSnapshotLocation 配置指南:为 Kubernetes 备份卷快照定义云存储位置

【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero

VolumeSnapshotLocation(卷快照位置)是 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,并带有ProviderPhaseAge三个打印列(见 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.go):

  • provider:提供卷快照能力的云厂商名称;
  • config:provider 专属的键值配置,如 AWS 的region、Azure 的resourceGroup
  • credential(可选):指定该位置使用的凭据 Secret,优先级高于全局凭据。

Status 中仅有一个Phase字段,取值AvailableUnavailable(源码),用来标记该位置当前是否可用。

设计要点:每个 provider 至少一个位置

Velero 可以为多个云厂商分别配置卷快照位置;对同一个 provider,也可以配置多个候选 VSL,但在执行一次备份时,每个 provider 最多只能选中一个位置。也就是说:

  • 如果集群中有 AWS、Azure、GCP 的卷,每个涉及的 provider 都需要至少一个 VSL;
  • 同 provider 下可以有多个 VSL(例如按区域划分aws-us-east-1aws-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/v1
  • metadata.namespace:通常与 Velero 安装在同一命名空间(默认velero),备份控制器只会在该命名空间内查找 VSL;
  • spec.provider:云厂商标识,Velero 原生支持awsgcpazure,其他厂商通过外部插件提供;
  • spec.config:provider 专属键值对,可空。

如需为同一位置单独指定凭据(不依赖全局--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配置键,防止路径穿越攻击。

参数参考

主配置参数

KeyTypeDefaultMeaning
providerString(Velero 原生支持awsgcpazure,其他 provider 可通过外部插件获得)必填实际用于存储卷快照的云厂商名称
config见下文各 provider 专属配置或对应 provider 插件的文档可选provider 专属键值配置
credentialSecretKeySelector可选该 VSL 使用的凭据引用,优先级高于全局凭据

AWS

config
KeyTypeDefaultMeaning
regionstring示例"us-east-1"。完整区域列表参考 AWS 官方文档;若未提供,将从 AWS S3 API 查询得到

region决定快照创建在哪个区域。若省略,Velero 会尝试从 AWS 侧查询默认区域,因此只要集群节点具备相应的 IAM 权限,即使不显式写region也能工作;但显式配置仍是更可控、可复现的做法。

Azure

config
KeyTypeDefaultMeaning
apiTimeoutmetav1.Duration2m0sAzure API 请求的超时等待时间
resourceGroupstring可选卷快照的存放资源组;不填时使用集群所在的资源组
  • apiTimeout控制 Velero 调用 Azure 快照相关 API 的最长等待时间,格式遵循 Kubernetes 的metav1.Duration表示法(如3m90s);
  • 当你的快照需要存放在与集群不同的资源组时,通过resourceGroup指定。

GCP

GCP 的 VSL无需任何 config 参数,仅声明provider: gcp即可,插件所需的项目、区域等上下文来自 GCP 凭据与目标卷本身。

注意:上述 AWS/Azure/GCP 参数表来自 v0.11.0 版本文档,属于该版本语境下的原生 provider 配置。当前仓库中具体 provider 插件的参数实现已随插件独立演进,建议以你所安装的 provider 插件版本文档为准;本指南中的 CRD 结构与 CLI 用法对当前仓库仍然成立。

用 CLI 管理 VolumeSnapshotLocation

除了直接kubectl applyYAML,Velero CLI 提供了一组专门命令(实现在 pkg/cmd/cli/snapshotlocation 包中,注册为snapshot-location子命令)。

创建:velero snapshot-location create

velero snapshot-location create <NAME> \ --provider <PROVIDER> \ --config <KEY1=VALUE1,KEY2=VALUE2> \ [--credential <SECRET_NAME=SECRET_KEY>] \ [--labels <K=V,...>]

创建命令支持的完整参数(见 create.go):

Flag说明
--provider卷快照 provider 名称(如awsazuregcp),必填,源码中缺失时校验直接报错--provider is required
--config配置键值对,如region=us-west-2apiTimeout=3m
--labels附加到 VSL 上的标签
--credential该位置使用的凭据,格式Secret名=Secret内数据键名只能含 1 个键值对(源码 Validate 强制约束)

示例:

velero snapshot-location create aws-default \ --provider aws \ --config region=us-west-2 velero snapshot-location create azure-default \ --provider azure \ --config apiTimeout=3m,resourceGroup=my-backup-rg \ --credential azure-vsl-creds=cloud

查看:velero snapshot-location get

velero snapshot-location get # 列出当前命名空间下全部 VSL velero snapshot-location get aws-default # 查看指定 VSL velero snapshot-location get -l tier=prod # 按标签选择器过滤

get命令支持按名称精确获取、按--selector/-l标签过滤,并支持-o输出格式控制(见 get.go),同时具备 VSL 名称的 shell 自动补全。

设置凭据:velero snapshot-location set

对已存在的 VSL 更新凭据引用:

velero snapshot-location set <NAME> --credential <SECRET_NAME=SECRET_KEY>

实现上会先Get出目标 VSL,再写入Spec.CredentialUpdate回集群(见 set.go),同样限制为单个键值对。

安装时自动创建:velero install

velero install也支持通过参数直接生成 VSL(见 pkg/cmd/cli/install/install.go):

velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.0.0 \ --bucket backups \ --secret-file ./aws-iam-creds \ --backup-location-config region=us-east-2 \ --snapshot-location-config region=us-east-2
  • --snapshot-location-config:格式key1=value1,key2=value2,用于生成 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 apiTimeout=<YOUR_TIMEOUT>,resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP

备份时如何选择 VSL:校验与加载流程

当一次备份开始执行时,备份控制器会按以下流程处理 VSL(核心实现在 pkg/controller/backup_controller.go 的validateAndGetSnapshotLocations):

  1. 名称加载:读取backup.Spec.VolumeSnapshotLocationsBackupAPI 中以字符串列表形式保存位置名,见 backup_types.go),逐个Get对应的 VSL;
  2. 存在性校验:某个 VSL 不存在时,报错并提示"该备份执行前必须先创建对应的 VolumeSnapshotLocation CRD";
  3. 单 provider 唯一性校验:同一 provider 被指定了多个位置时直接报错(上文提到的more than one VolumeSnapshotLocation...);
  4. 凭据注入:调用UpdateVolumeSnapshotLocationWithCredentialConfig,把 VSL 指定的 Secret 凭据落盘路径写入config["credentialsFile"]传给快照插件,并删除用户自定义的credentialsFile键以防止路径穿越;
  5. 按 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-snapshots=false--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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 11:09:03

基于SpringBoot与Uniapp的博物馆预约系统设计与实现

1. 项目背景与核心需求博物馆预约系统在数字化时代已成为文化场馆的标配基础设施。传统线下排队购票方式存在诸多痛点&#xff1a;旺季游客集中导致排队时间过长、人工核验效率低下、难以实时掌握场馆人流数据等。而基于移动互联网的预约系统能有效解决这些问题&#xff0c;实现…

作者头像 李华
网站建设 2026/9/16 11:08:51

XML Schema复合空元素详解与应用实践

1. XML Schema 复合空元素概述XML Schema 复合空元素是 XML 文档中一种特殊的元素类型&#xff0c;它同时具备复合类型和空元素的特性。这类元素在 XML 数据建模中扮演着重要角色&#xff0c;特别是在需要表达结构化属性但不需要内容体的场景下。复合空元素的关键特征在于&…

作者头像 李华
网站建设 2026/9/16 11:08:09

硬件面试电路分析新范式:动态失效归因与三维物理直觉训练

1. 这不是题库&#xff0c;是电路工程师的实战思维训练场“硬件笔试面试2026年通关秘籍&#xff1a;电路分析核心问题深度剖析”——看到这个标题&#xff0c;别急着去翻往年真题集。我带过三十多届校招候选人&#xff0c;也作为主考官参与过上百场硬件岗终面&#xff0c;最常听…

作者头像 李华
网站建设 2026/9/16 11:06:33

PyTorch DDP分布式训练实战:从进程模型到性能调优的完整排坑指南

单卡训练一切正常&#xff0c;loss听话地往下掉&#xff0c;显存也够用。你为了赶进度把模型塞到两张甚至四张卡上&#xff0c;启动命令从python train.py改成torchrun ...&#xff0c;然后噩梦就开始了&#xff1a;进程直接卡死、NCCL报错、loss曲线像心跳图一样震荡、GPU利用…

作者头像 李华
网站建设 2026/9/16 11:05:09

自考论文写作全流程工具指南与高效方法

1. 项目概述&#xff1a;论文写作工具的实用价值对于自考学生而言&#xff0c;毕业论文往往是求学路上最大的拦路虎之一。不同于全日制学生有导师定期指导&#xff0c;自考同学通常需要独立完成从选题到答辩的全过程。时间管理困难、学术资源有限、写作经验不足这三大痛点&…

作者头像 李华
网站建设 2026/9/16 11:05:01

电商双头垄断格局的形成与应对策略

1. 电商平台品类竞争的终极形态在电商行业摸爬滚打十几年&#xff0c;我观察到一个有趣的现象&#xff1a;几乎所有成熟品类最终都会演变成"双头垄断"格局。就像亚马逊平台上&#xff0c;每个品类经过充分竞争后&#xff0c;最终往往只剩下两个主要玩家占据主导地位。…

作者头像 李华