2. Velero 架构深度解析:核心组件、数据流与备份恢复流程
Velero 是云原生场景下 Kubernetes 集群备份与迁移的事实标准工具。理解其架构是开发自定义插件(尤其是镜像拉取加速插件)的前提。本章从核心组件、数据流和备份恢复流程三个维度进行深度拆解。
2.1 核心组件架构
Velero 采用 Controller-Worker 模式,由三个主要组件构成:Server(主控制器)、Restic(文件级备份守护进程)和 Plugin(扩展接口)。三者协作完成对 Kubernetes 资源对象和持久卷数据的保护。
架构要点: Server 负责编排与 API 交互;Restic 负责持久卷文件级备份;Plugin 提供对象存储、卷快照和自定义动作的扩展能力。
2.2 核心组件职责对比
| 组件 | 部署形态 | 核心职责 | 数据通道 |
|---|---|---|---|
| Velero Server | Deployment(1 副本) | 编排备份/恢复任务、管理 CRD、调度插件 | Kubernetes API |
| Restic Daemon | DaemonSet(每节点 1 Pod) | 文件级持久卷备份、本地缓存、增量快照 | hostPath / CSI |
| Plugin | Sidecar 或独立进程 | 对象存储 I/O、卷快照、备份前/后 Hook | gRPC / 标准输出 |
2.3 数据流深度解析
Velero 的数据流分为 控制流 和 数据流 两条路径。控制流由 Server 通过 Kubernetes API 驱动;数据流则由 Plugin 和 Restic 直接操作存储后端。
2.3.1 备份数据流
- 用户创建 Backup CR:通过
velero backup create或直接 apply YAML。 - Server 控制器监听:Backup Controller 发现新 CR,开始编排。
- 资源快照:Server 通过 API 获取指定 namespace 下的资源清单(YAML),序列化为 JSON。
- 卷数据备份:若包含持久卷,Server 调用 Restic 或 CSI 快照插件进行数据备份。
- 数据上传:Plugin 将资源清单和卷数据写入对象存储(如 S3、GCS)。
- 状态更新:备份完成后,Server 更新 Backup CR 状态为
Completed。
关键优化点: 步骤 4 和 5 是镜像拉取加速插件的切入点。传统流程中,Restic 需要从 PV 读取完整数据;加速插件可在步骤 4 之前注入镜像层缓存,避免重复拉取。
2.3.2 恢复数据流
- 用户创建 Restore CR:指定要恢复的备份名称和过滤规则。
- Server 控制器监听:Restore Controller 开始解析备份元数据。
- 资源重建:Server 从对象存储下载资源清单,通过 API 重建 Kubernetes 资源(Deployment、Service 等)。
- 卷数据恢复:Restic 或 CSI 插件从对象存储拉取卷快照,写入目标 PV。
- Pod 启动:资源重建完成后,Pod 开始调度,容器运行时拉取镜像。
- 状态更新:恢复完成后,Server 更新 Restore CR 状态为
Completed。
2.4 备份恢复流程关键阶段
Velero 将一次备份或恢复操作划分为多个 阶段(Phase),每个阶段对应一个 CR 状态。理解这些阶段有助于定位插件注入时机。
| 阶段 | 备份状态 | 恢复状态 | 插件可介入点 |
|---|---|---|---|
| New | CR 刚创建,等待处理 | CR 刚创建,等待处理 | — |
| InProgress | 资源快照中 | 资源重建中 | BackupItemAction / RestoreItemAction |
| Uploading | 数据上传至对象存储 | 数据从对象存储下载 | VolumeSnapshotter |
| Completed | 备份成功 | 恢复成功 | — |
| Failed | 备份失败 | 恢复失败 | 错误处理 Hook |
2.5 Plugin 扩展机制
Velero 的插件系统基于 gRPC 通信,支持三种插件类型:
- BackupItemAction (BIA):在备份单个资源时执行自定义逻辑,如修改资源 YAML、注入注解。
- RestoreItemAction (RIA):在恢复单个资源时执行自定义逻辑,如替换镜像地址、调整资源规格。
- VolumeSnapshotter:对接不同存储后端的卷快照能力,如 AWS EBS、GCE PD。
开发注意事项: 插件必须实现 Velero 定义的 gRPC 接口,并注册到 Server 的插件注册表中。镜像拉取加速插件通常实现为 RestoreItemAction,在恢复阶段拦截 Pod 资源,注入镜像层缓存配置。
2.6 关键代码结构示例
以下是一个最小化的 RestoreItemAction 插件骨架,展示了插件与 Velero 的交互方式:
package main
import (
"github.com/vmware-tanzu/velero/pkg/plugin/velero"
"github.com/sirupsen/logrus"
)
// ImageAccelPlugin 实现 velero.RestoreItemAction 接口
type ImageAccelPlugin struct {
logger logrus.FieldLogger
}
// AppliesTo 指定该插件作用于哪些资源
func (p *ImageAccelPlugin) AppliesTo() (velero.ResourceSelector, error) {
return velero.ResourceSelector{
IncludedResources: []string{"pods"},
}, nil
}
// Execute 在恢复每个 Pod 时被调用
func (p *ImageAccelPlugin) Execute(input *velero.RestoreItemActionExecuteInput) (*velero.RestoreItemActionExecuteOutput, error) {
p.logger.Info("ImageAccelPlugin: 开始处理 Pod 恢复")
// 1. 从 input.Item 中提取 Pod 对象
// 2. 修改 Pod 的镜像拉取策略或注入 sidecar
// 3. 返回修改后的对象
return &velero.RestoreItemActionExecuteOutput{
UpdatedItem: input.Item, // 返回修改后的资源
}, nil
}