2. Velero 基础架构:组件、存储后端与 CRD 资源模型

Velero 是一个云原生的备份与迁移工具,其架构设计遵循 Kubernetes 的 Operator 模式。理解 Velero 的组件构成、存储后端集成方式以及核心的 CRD 资源模型,是掌握增量备份与蓝绿发布回滚策略的基础。本章将拆解 Velero 的运行时架构,并深入其数据模型。

2.1 Velero 核心组件

Velero 由三个主要组件构成:运行在集群内的 Server、用于扩展能力的 Plugin,以及用于交互的 CLI。三者协同工作,完成备份、恢复和调度任务。

组件 部署位置 核心职责 关键特性
Server Kubernetes 集群内(Deployment) 监听 Backup/Schedule/Restore 等 CRD 对象,执行实际的数据备份与恢复操作 无状态设计;通过 Controller 模式驱动工作流;支持并发备份
Plugin 集群内(作为 Server 的 sidecar 或独立进程) 提供与特定云存储、CSI 快照、自定义动作的集成能力 支持 Object Store、Volume Snapshot、Backup Item Action 三类插件
CLI 客户端(用户本地或 CI/CD 环境) 创建备份/恢复任务、管理调度、查看状态、与 Server 通信 通过 velero 命令操作;支持 JSON 输出;可集成到自动化脚本
架构要点: Velero Server 本身不存储备份数据,它只负责编排。所有备份数据(包括 Kubernetes 资源清单和卷快照)都会传输到配置的远端存储后端。这种设计使得 Velero 本身具备高可用性,即使集群完全损坏,备份数据依然安全。
Velero 组件交互架构 用户 / CLI velero backup create Kubernetes API CRD 资源对象 Velero Server Controller / 工作流 Plugin 存储 / 快照 / 动作 MinIO / S3 备份数据流:CLI → API → Server → Plugin → 远端存储后端

2.2 备份存储后端:MinIO / S3

Velero 使用对象存储作为备份数据的持久化层。它通过 Object Store Plugin 与后端交互,将备份文件(.tar.gz 格式的资源清单和卷快照数据)上传到指定的 Bucket 中。

2.2.1 支持的存储后端

  • AWS S3:原生支持,兼容 S3 协议的所有对象存储(如 MinIO、Ceph RGW、DigitalOcean Spaces)。
  • MinIO:本地部署的 S3 兼容存储,常用于开发、测试或离线环境。本课程后续实验将使用 MinIO 作为存储后端。
  • Azure Blob Storage / GCP Cloud Storage:通过对应的 Velero Plugin 支持。

2.2.2 存储后端配置要点

配置项 说明 示例值(MinIO)
provider 存储提供商名称 aws(兼容 S3 协议)
bucket 存储桶名称 velero-backup
prefix 可选,备份文件存放的路径前缀 production/
config.region 区域(MinIO 可忽略或填 minio) us-east-1
config.s3Url S3 兼容服务的访问地址 http://minio.minio:9000
config.publicUrl 可选,公网访问地址 https://minio.example.com
MinIO 部署提示: 在 Kubernetes 集群内部署 MinIO 时,建议使用 StatefulSet 并挂载持久卷。Velero 通过 --bucket 和 --s3-url 参数连接 MinIO。确保 MinIO 的访问密钥(Access Key / Secret Key)以 Secret 形式注入到 Velero 的命名空间中。
备份数据在 MinIO/S3 中的组织结构 Bucket: velero-backup Prefix: backups/ backup-20250321-120000/ velero-backup.json resources.tar.gz vol1-snap-xxxxx.vddk vol2-snap-yyyyy.vddk velero-backup.json 备份元数据(资源列表、 时间戳、标签等) *.tar.gz / *.vddk 资源清单与卷快照数据

2.3 CRD 资源模型

Velero 通过自定义资源定义(CRD)扩展 Kubernetes API,将备份、恢复、调度等操作抽象为声明式资源对象。用户通过创建、更新或删除这些 CRD 对象来管理备份生命周期。

2.3.1 核心 CRD 资源

CRD 名称 API 版本 用途 关键字段(Spec)
Backup velero.io/v1 定义一次备份操作,包含备份范围、存储位置、TTL 等 IncludedNamespaces, ExcludedResources, StorageLocation, TTL
Restore velero.io/v1 定义一次恢复操作,指定从哪个 Backup 恢复,以及恢复策略 BackupName, NamespaceMapping, RestorePVs
Schedule velero.io/v1 定义定时备份计划,基于 Cron 表达式自动创建 Backup 对象 Schedule (Cron), Template (Backup 模板)
BackupStorageLocation velero.io/v1 定义备份存储后端的连接信息(Bucket、Prefix、Provider 等) Provider, Bucket, Config, AccessMode
VolumeSnapshotLocation velero.io/v1 定义卷快照存储后端的连接信息(用于 CSI 或原生快照) Provider, Config

2.3.2 资源模型工作流示例

以下是一个典型的备份创建流程,展示了 CRD 对象如何驱动 Velero 工作:

  1. 用户通过 velero backup create my-backup --include-namespaces app 命令,或直接编写 YAML 创建 Backup CRD 对象。
  2. Velero Server 中的 BackupController 监听到新的 Backup 对象,开始执行备份流程。
  3. Controller 读取 BackupStorageLocation 对象,获取存储后端连接信息。
  4. Controller 调用 Plugin 将 Kubernetes 资源清单打包上传,并根据配置触发卷快照。
  5. 备份完成后,Backup 对象的 Status 字段更新为 Completed,并记录备份文件在存储后端的位置。
CRD 版本兼容性: 不同版本的 Velero 可能引入新的 CRD 字段或废弃旧字段。在升级 Velero 时,务必检查 CRD 的 API 版本变化。建议使用 velero install 命令自动安装匹配的 CRD,避免手动管理。

2.3.3 关键 CRD 对象 YAML 示例

以下是一个 Backup 资源的定义示例,展示了如何通过 YAML 声明式地创建备份任务:

apiVersion: velero.io/v1
kind: Backup
metadata:
  name: my-app-backup
  namespace: velero
spec:
  # 备份范围:只备份 app 命名空间下的资源
  includedNamespaces:
  - app
  # 排除 ConfigMap 资源
  excludedResources:
  - configmaps
  # 存储位置引用
  storageLocation: default
  # 卷快照位置引用(可选)
  volumeSnapshotLocations:
  - default
  # 备份数据保留时间
  ttl: 72h
  # 是否包含集群资源(如 ClusterRole)
  includeClusterResources: false
  # 标签选择器,只备份匹配标签的资源
  labelSelector:
    matchLabels:
      app: my-app
  # 备份卷快照
  snapshotVolumes: true