2. Velero 架构解析:组件、数据流与工作流程

Velero 采用 客户端-服务端 架构,通过清晰的组件分工和标准化的插件机制,实现 Kubernetes 集群资源与持久化卷的备份与恢复。理解其核心组件、数据流向与工作流程,是后续优化镜像拉取依赖图的基础。

2.1 核心组件

Velero 由三个主要组件构成:Server、Plugin 和 CLI。下表总结了各组件的职责与部署形态:

组件 部署形态 核心职责
Server Kubernetes Deployment 编排备份/恢复任务、管理自定义资源(CRD)、调度控制器循环
Plugin Sidecar 容器 / 独立二进制 对接对象存储、块存储快照、自定义动作(备份前/后钩子)
CLI 客户端二进制(velero) 用户交互入口:创建备份、触发恢复、查看状态、安装/卸载
关键设计原则: Server 不直接操作存储后端,所有存储交互通过 Plugin 抽象层完成。这种设计使得 Velero 可以支持 AWS S3、Azure Blob、GCS、MinIO 等多种对象存储,以及不同云厂商的快照 API。

2.2 组件交互与数据流

下图展示了 Velero 各组件之间的交互关系与备份数据的主要流向:

Velero 组件交互与数据流 CLI velero backup create Kubernetes API Server 创建 Backup CR Velero Server 控制器循环 创建 Backup CR Watch / Informer Plugin 层(Sidecar / 独立进程) 对象存储插件 S3 / GCS / Azure 快照插件 EBS / PD / 本地快照 动作插件 备份前/后钩子 调用插件接口 对象存储 / 快照后端 备份文件 + 卷快照 上传备份数据 / 创建快照 数据流:CLI → API Server → Velero Server → Plugin → 存储后端
数据流要点: 备份数据(Kubernetes 资源清单 + 卷数据)由 Velero Server 通过 Plugin 写入对象存储;卷快照由快照插件直接调用云厂商 API 完成,不经过 Velero Server 内存中转,避免性能瓶颈。

2.3 备份工作流程

一次完整的 Velero 备份操作包含以下步骤:

  1. 用户发起备份: 通过 velero backup create 命令指定备份名称、命名空间、标签选择器等参数。
  2. 创建 Backup CR: CLI 将请求转换为 Backup 自定义资源(CR)并提交到 Kubernetes API Server。
  3. 控制器感知: Velero Server 中的 Backup Controller 通过 Informer 机制监听到新的 Backup CR。
  4. 执行备份流程:
    • 调用 动作插件 执行备份前钩子(如:冻结数据库、刷新缓存)。
    • 调用 对象存储插件 上传 Kubernetes 资源清单(YAML/JSON)。
    • 调用 快照插件 对 PVC 引用的持久化卷创建快照。
  5. 更新状态: 备份完成后,Velero Server 更新 Backup CR 的状态为 Completed,并记录备份元数据到对象存储。
  6. 清理: 根据保留策略(TTL)自动清理过期备份。
镜像拉取依赖的关键点: 在步骤 4 中,Velero Server 本身以及所有 Plugin 容器都需要从镜像仓库拉取镜像。如果镜像拉取存在依赖关系(例如:Plugin 镜像依赖基础镜像层),且拉取顺序不当,会导致备份任务启动延迟。这正是本课程后续章节要优化的核心问题。

2.4 恢复工作流程

恢复流程与备份流程对称,但数据流向相反:

阶段 操作 涉及组件
1. 触发恢复 velero restore create --from-backup <name> CLI → API Server
2. 创建 Restore CR API Server 持久化 Restore 自定义资源 Kubernetes API Server
3. 控制器处理 Restore Controller 监听到新 CR,开始恢复逻辑 Velero Server
4. 恢复资源与卷 从对象存储拉取资源清单 → 重建 Kubernetes 资源;从快照恢复卷数据 对象存储插件 + 快照插件
5. 执行恢复后钩子 调用动作插件执行自定义恢复后操作(如:重建索引) 动作插件
6. 完成 更新 Restore CR 状态为 Completed Velero Server

2.5 关键自定义资源(CRD)

Velero 在 Kubernetes 中注册了多个 CRD,用于描述备份/恢复任务及其状态。以下是核心 CRD 及其用途:

  • Backup:描述一次备份操作,包含源命名空间、资源类型、标签选择器、存储位置、TTL 等。
  • Restore:描述一次恢复操作,引用 Backup 名称,可指定恢复映射(如:命名空间重命名)。
  • Schedule:定义定时备份策略,基于 Cron 表达式自动创建 Backup CR。
  • BackupStorageLocation:配置对象存储的访问信息(Bucket、Region、凭证引用)。
  • VolumeSnapshotLocation:配置卷快照的云提供商区域与凭证。
  • DeleteBackupRequest:用于请求删除备份及其关联的快照。
架构启示: Velero 将所有状态持久化到 Kubernetes 资源中(而非自身数据库),这使得备份/恢复任务具备声明式、可审计、可重入的特性。同时,CRD 机制也方便用户通过 kubectl 直接查看和管理备份状态。

2.6 组件部署拓扑

下图展示了 Velero 在 Kubernetes 集群中的典型部署拓扑:

Velero 典型部署拓扑 Kubernetes 集群 velero Pod Server 容器 + Plugin Sidecar 用户工作负载 应用 Pod 挂载 PVC 读取资源 对象存储 S3 / MinIO / GCS 备份文件 上传备份数据 快照后端 EBS / PD / 本地 卷快照 velero CLI kubectl 插件模式 kubectl apply 拓扑要点:Velero Server 与用户工作负载同集群部署,通过 ServiceAccount 权限访问 API Server 和 PVC
部署建议: 在生产环境中,建议将 Velero Server 部署在独立的命名空间(如 velero-system),并通过 RBAC 严格控制其权限。Plugin 通常以 Sidecar 模式注入 Velero Pod,或通过 --plugins 参数指定镜像。