2. Velero 基础架构:组件、工作流程与 API 交互原理

Velero 是专为 Kubernetes 设计的开源备份与迁移工具,其核心架构围绕 Server、Plugin 和 CLI 三大组件构建。理解这三者的职责划分以及它们与 Kubernetes API 的交互方式,是掌握增量备份与灾备回滚的基础。

2.1 三大核心组件

组件 部署形态 核心职责 关键说明
Server Kubernetes Deployment 编排备份/恢复任务、管理调度、维护备份对象状态 运行在集群内,通过 CRD 与 API Server 交互
Plugin Sidecar / 独立二进制 对接存储后端(S3/GCS/Azure)、扩展备份对象类型 支持 CSI、Restic、自定义 Provider
CLI 客户端二进制 用户操作入口:创建备份、触发恢复、查看状态 通过 API Server 间接控制 Velero Server
架构要点: Velero Server 本身不直接读写存储后端,所有数据平面操作(上传快照、下载备份文件)均委托给 Plugin 完成。这种设计使得存储后端切换时无需重建 Server。

2.2 组件交互工作流程

一次完整的备份操作涉及 CLI、API Server、Velero Server 和 Plugin 四个角色的协作:

  1. 用户发起:通过 velero backup create CLI 命令指定备份范围(命名空间、标签选择器等)。
  2. API 写入:CLI 将请求转换为 Backup CRD 对象,通过 Kubernetes API 写入集群。
  3. Controller 监听:Velero Server 中的 Backup Controller Watch 到新 Backup 对象,进入协调循环。
  4. 数据收集:Server 调用 Kubernetes API 获取目标资源清单(Deployment、PVC、ConfigMap 等)。
  5. 快照委托:对于 PVC 卷,Server 调用 Volume Snapshot Plugin 创建 CSI 快照;对于文件系统备份,调用 Restic Plugin 读取数据。
  6. 上传存储:Plugin 将备份数据(资源清单 JSON + 卷快照)上传至对象存储(S3/MinIO/GCS)。
  7. 状态更新:Server 更新 Backup 对象状态为 Completed,并记录备份元数据。
关键路径: 步骤 4 和步骤 5 是性能瓶颈所在。增量备份的核心优化就在于步骤 5 中仅传输变化的数据块,而非全量卷数据。

2.3 与 Kubernetes API 的交互原理

Velero 与 Kubernetes API 的交互分为 控制面 和 数据面 两个层面:

2.3.1 控制面交互(CRD + Watch)

  • 自定义资源定义:Velero 注册了 Backup、Restore、Schedule、BackupStorageLocation、VolumeSnapshotLocation 等 CRD。
  • 声明式协调:Velero Server 通过 Informer 监听这些 CRD 的变化,将用户声明(Spec)转换为实际备份/恢复操作。
  • 状态持久化:操作结果写入 CRD 的 Status 字段,CLI 和 UI 通过读取 Status 获取进度。

2.3.2 数据面交互(API 读取 + 卷操作)

  • 资源枚举:备份时,Server 使用 List / Get 接口拉取目标资源(支持 --include-namespaces 和 --selector 过滤)。
  • 卷快照:通过 CSI 或 VolumeSnapshot API 创建快照,快照句柄由 Plugin 传递给存储后端。
  • 恢复时重建:恢复操作通过 Create 接口重建资源,并依赖 Velero 的 restore-hook 机制进行初始化。
权限注意: Velero Server 需要 ClusterRole 级别的权限(读取所有资源、创建 VolumeSnapshot、管理 CRD)。在生产环境中应使用最小权限原则,通过 RBAC 限制其作用范围。

2.4 架构总览图

下图展示了 Velero 各组件的部署位置、通信路径以及数据流向:

Velero 基础架构组件交互图 Velero 基础架构组件交互图 用户 (velero CLI) Kubernetes API Server CRD: Backup / Restore / Schedule etcd 持久化 Velero Server (Controller Manager) Backup Controller / Restore Controller / Schedule Controller CSI Plugin 卷快照 Restic Plugin 文件级备份 对象存储 S3/MinIO/GCS 对象存储 S3/MinIO/GCS 数据流路径 CLI → API Server → CRD → Velero Server → Plugin → 对象存储

2.5 备份工作流程时序图

以下时序图聚焦于一次备份操作中各组件的调用顺序与数据流向:

Velero 备份工作流程时序图 Velero 备份工作流程时序图 CLI API Server Velero Server Plugin 对象存储 1. 创建 Backup CR 2. 写入 etcd 3. Watch 通知 4. List/Get 资源 5. 调用快照 6. 上传数据 7. 上传完成 8. 更新 Status 9. 查询状态

2.6 关键设计要点

  • 无状态 Server:Velero Server 不存储任何备份数据,所有状态通过 CRD 持久化在 etcd 中,备份数据由 Plugin 写入对象存储。这使得 Server 可以随时重启或扩缩容。
  • Plugin 热插拔:备份/恢复操作通过 Plugin 接口抽象,社区已提供 AWS/GCP/Azure/CSI/Restic 等官方 Plugin,用户也可实现自定义 Plugin 对接私有存储。
  • API 兼容性:Velero 使用 Kubernetes 标准 API 进行资源发现和操作,因此兼容所有 CNCF 认证的 Kubernetes 发行版(包括 OpenShift、Rancher、K3s 等)。
  • 增量备份基础:Restic Plugin 支持文件级别的增量备份,通过跟踪文件 inode 和修改时间,仅上传变化的数据块。CSI Plugin 则依赖存储后端的快照差异能力。
生产建议: 在部署 Velero 时,务必为 BackupStorageLocation 和 VolumeSnapshotLocation 配置独立的存储桶。前者存放资源清单和 Restic 数据,后者存放 CSI 卷快照。分离存储可以避免单一存储故障导致备份完全不可用。