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 各组件之间的交互关系与备份数据的主要流向:
数据流要点: 备份数据(Kubernetes 资源清单 + 卷数据)由 Velero Server 通过 Plugin 写入对象存储;卷快照由快照插件直接调用云厂商 API 完成,不经过 Velero Server 内存中转,避免性能瓶颈。
2.3 备份工作流程
一次完整的 Velero 备份操作包含以下步骤:
- 用户发起备份: 通过
velero backup create命令指定备份名称、命名空间、标签选择器等参数。 - 创建 Backup CR: CLI 将请求转换为
Backup自定义资源(CR)并提交到 Kubernetes API Server。 - 控制器感知: Velero Server 中的 Backup Controller 通过 Informer 机制监听到新的 Backup CR。
- 执行备份流程:
- 调用 动作插件 执行备份前钩子(如:冻结数据库、刷新缓存)。
- 调用 对象存储插件 上传 Kubernetes 资源清单(YAML/JSON)。
- 调用 快照插件 对 PVC 引用的持久化卷创建快照。
- 更新状态: 备份完成后,Velero Server 更新 Backup CR 的状态为
Completed,并记录备份元数据到对象存储。 - 清理: 根据保留策略(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 Server 部署在独立的命名空间(如
velero-system),并通过 RBAC 严格控制其权限。Plugin 通常以 Sidecar 模式注入 Velero Pod,或通过 --plugins 参数指定镜像。