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 本身具备高可用性,即使集群完全损坏,备份数据依然安全。
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 的命名空间中。
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 工作:
- 用户通过
velero backup create my-backup --include-namespaces app命令,或直接编写 YAML 创建BackupCRD 对象。 - Velero Server 中的
BackupController监听到新的Backup对象,开始执行备份流程。 - Controller 读取
BackupStorageLocation对象,获取存储后端连接信息。 - Controller 调用 Plugin 将 Kubernetes 资源清单打包上传,并根据配置触发卷快照。
- 备份完成后,
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