2. Velero 架构深度解析:核心组件、数据流与备份恢复流程

Velero 是云原生场景下 Kubernetes 集群备份与迁移的事实标准工具。理解其架构是开发自定义插件(尤其是镜像拉取加速插件)的前提。本章从核心组件、数据流和备份恢复流程三个维度进行深度拆解。

2.1 核心组件架构

Velero 采用 Controller-Worker 模式,由三个主要组件构成:Server(主控制器)、Restic(文件级备份守护进程)和 Plugin(扩展接口)。三者协作完成对 Kubernetes 资源对象和持久卷数据的保护。

架构要点: Server 负责编排与 API 交互;Restic 负责持久卷文件级备份;Plugin 提供对象存储、卷快照和自定义动作的扩展能力。
Velero 核心组件架构图 Kubernetes API Server Velero Server Plugin 插件层 对象存储插件 卷快照插件 自定义动作插件 Restic Daemon 文件级备份 本地缓存管理 增量快照 对象存储 (S3/GCS/Azure) 持久卷 (PV) 组件间通过 gRPC 与 Kubernetes API 通信

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 备份数据流

  1. 用户创建 Backup CR:通过 velero backup create 或直接 apply YAML。
  2. Server 控制器监听:Backup Controller 发现新 CR,开始编排。
  3. 资源快照:Server 通过 API 获取指定 namespace 下的资源清单(YAML),序列化为 JSON。
  4. 卷数据备份:若包含持久卷,Server 调用 Restic 或 CSI 快照插件进行数据备份。
  5. 数据上传:Plugin 将资源清单和卷数据写入对象存储(如 S3、GCS)。
  6. 状态更新:备份完成后,Server 更新 Backup CR 状态为 Completed。
关键优化点: 步骤 4 和 5 是镜像拉取加速插件的切入点。传统流程中,Restic 需要从 PV 读取完整数据;加速插件可在步骤 4 之前注入镜像层缓存,避免重复拉取。

2.3.2 恢复数据流

  1. 用户创建 Restore CR:指定要恢复的备份名称和过滤规则。
  2. Server 控制器监听:Restore Controller 开始解析备份元数据。
  3. 资源重建:Server 从对象存储下载资源清单,通过 API 重建 Kubernetes 资源(Deployment、Service 等)。
  4. 卷数据恢复:Restic 或 CSI 插件从对象存储拉取卷快照,写入目标 PV。
  5. Pod 启动:资源重建完成后,Pod 开始调度,容器运行时拉取镜像。
  6. 状态更新:恢复完成后,Server 更新 Restore CR 状态为 Completed。
备份与恢复数据流对比 备份流程 ① 创建 Backup CR ② Server 编排任务 ③ 资源快照 (API) ④ 卷数据备份 (Restic/CSI) ⑤ 上传至对象存储 ⑥ 状态更新 Completed 恢复流程 ① 创建 Restore CR ② Server 解析元数据 ③ 资源重建 (API) ④ 卷数据恢复 (Restic/CSI) ⑤ Pod 启动 & 镜像拉取 ⑥ 状态更新 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
}