2. Velero 架构速览:核心组件、数据流路径与缓存层定位

在深入排查缓存命中故障之前,必须建立 Velero 架构的全局视图。本章从三个维度展开:核心组件(Server、Plugin、Restic)、数据流路径(备份与恢复两条主线)、以及缓存层在灾备链路中的位置。理解这些是后续分析缓存未命中、性能瓶颈和调优策略的基础。

2.1 核心组件与职责

Velero 采用控制器模式,由以下三大组件协同工作:

组件 进程/形态 核心职责 缓存关联点
Velero Server Deployment(velero) 调度备份/恢复任务、管理 Backup/Restore CRD、协调插件调用、维护队列与缓存 维护 BackupStore 缓存、对象列表缓存、Volume 快照元数据缓存
Velero Plugin Sidecar 或内置进程 对接对象存储(AWS S3 / Azure Blob / GCS)、对接快照 API(CSI / EBS / PD) 插件内部可能缓存存储桶列表、分页 ;影响对象存储读取性能
Restic / Kopia InitContainer + DaemonSet 执行文件系统级备份(PV 内容)、块级去重、增量快照 维护本地缓存目录(--cache-directory),存放索引、数据块、元数据
关键认知: Velero Server 是控制面,Plugin 是存储适配层,Restic 是数据面。缓存故障可能发生在任意一层:Server 的元数据缓存过期、Plugin 的列表缓存未命中、Restic 的本地缓存目录损坏或空间不足。

2.2 数据流路径:备份与恢复

备份和恢复两条路径的缓存访问点不同,下面分别拆解。

2.2.1 备份数据流

  1. API 触发 → Velero Server 创建 Backup CR。
  2. 控制器协调 → 读取 Backup CR,查询 BackupStore 缓存 获取已有备份列表(用于增量/去重判断)。
  3. 资源快照 → 调用 Plugin 对 PV 做 CSI 快照或 VolumeSnapshot,快照元数据写入对象存储。
  4. 文件级备份(可选)→ Restic 启动,读取 本地缓存目录 中的索引文件,决定哪些数据块需要上传。
  5. 上传对象存储 → Plugin 将备份文件(tarball / 数据块)写入远端桶。
  6. 更新缓存 → Server 更新内存中的备份列表缓存和对象存储元数据缓存。

2.2.2 恢复数据流

  1. API 触发 → Velero Server 创建 Restore CR。
  2. 查询缓存 → 从 BackupStore 缓存 获取目标备份的元数据(如备份时间、包含的资源列表、快照 ID)。
  3. 拉取元数据 → 若缓存未命中,回源对象存储读取 velero/backups/<name>/velero-backup.json。
  4. 恢复资源 → 重建 Kubernetes 资源(Deployment、PVC 等)。
  5. 恢复数据 → 若使用 Restic,从本地缓存目录读取索引,从对象存储拉取数据块重组文件。
  6. 清理缓存(可选)→ 恢复完成后,Restic 可能清理临时缓存。
性能关键路径: 步骤 2 和步骤 3 是缓存命中的核心战场。若 BackupStore 缓存未命中,每次恢复都需要一次额外的对象存储 GET 请求,延迟增加 200ms~2s(取决于网络和桶类型)。在批量恢复场景下,缓存未命中会放大延迟。

2.3 缓存层在灾备中的位置

下图展示了 Velero 灾备架构中缓存层的具体位置,以及数据流如何经过缓存。

Velero 灾备缓存层位置图 Velero 灾备缓存层位置图 用户 / API 触发 Velero Server(控制器) BackupStore 缓存 对象列表缓存 Velero Plugin(存储适配层) S3 / Azure Blob / GCS / CSI 对象存储(远端桶) 备份文件 / 快照元数据 / 数据块 Restic / Kopia 文件级备份/恢复 本地缓存目录 缓存层分布说明 ① Server 缓存:BackupStore 缓存、对象列表缓存(内存) ② Restic 缓存:本地磁盘缓存(索引、数据块、元数据)

2.4 缓存类型与失效场景

根据缓存所在层级和存储介质,可以归纳为以下三类:

缓存类型 存储位置 默认大小/策略 典型失效原因
BackupStore 缓存 Velero Server 内存 无上限(受 Pod 内存限制) Pod 重启、内存压力 GC、TTL 过期(默认 5 分钟)
对象列表缓存 Velero Server 内存 默认 1000 条 备份数量超过缓存上限、分页 失效
Restic 本地缓存 节点磁盘(/cache/restic) 默认 1GB(可通过 --cache-size 调整) 磁盘空间不足、Pod 漂移(缓存目录丢失)、权限变更
常见陷阱: 很多用户只关注对象存储的读写性能,却忽略了 Velero Server 内存缓存和 Restic 本地磁盘缓存。当 Velero Pod 因 OOMKilled 重启时,BackupStore 缓存全部丢失,后续第一个恢复请求必然回源,延迟飙升。这是缓存命中故障的典型根因之一。

2.5 架构小结

Velero 的灾备链路中,缓存层位于三个关键位置:

  • 控制面缓存(Server 内存)—— 加速备份列表查询和元数据读取。
  • 存储适配层缓存(Plugin 内部)—— 减少对象存储 API 调用次数。
  • 数据面缓存(Restic 本地磁盘)—— 避免重复拉取数据块,提升恢复速度。