2. Velero 架构解析:组件、数据流与 Restic/Kopia 集成
在生产环境中实施灾备准入,首先需要深入理解 Velero 的架构设计。本章将拆解 Velero 的核心组件(Server / CLI / Plugin)、控制面与数据面的数据流,以及 Restic 和 Kopia 两种备份引擎的集成原理。掌握这些底层机制,是后续进行架构选型与故障排查的基础。
2.1 核心组件:Server、CLI 与 Plugin
Velero 采用 “客户端-服务端-插件” 三层架构。CLI 负责触发操作,Server 负责调度与协调,Plugin 负责与具体存储后端及 Kubernetes 资源交互。
| 组件 | 部署形态 | 核心职责 | 关键说明 |
|---|---|---|---|
| Velero CLI | 客户端二进制(本地或 CI/CD) | 发起备份/恢复/调度命令;解析 YAML 参数;调用 API Server | 不直接操作数据,仅作为控制面入口 |
| Velero Server | Kubernetes Deployment(velero namespace) | 监听 CRD(Backup/Schedule/Restore);协调工作流;调用插件 | 核心控制器,负责状态机转换与重试逻辑 |
| Plugin | Sidecar 容器或独立二进制 | 对接对象存储(AWS S3 / Azure Blob / GCS);执行 Volume 快照 | 分为 Object Store Plugin 与 Volume Snapshotter Plugin |
架构要点: Velero Server 本身不存储任何备份数据,所有备份产物(JSON 描述文件 + Volume 数据)均通过 Plugin 写入外部对象存储。这种设计使得 Velero 天然具备无状态特性,便于灾备场景下的快速重建。
2.2 数据流:控制面与数据面分离
Velero 严格遵循 控制面(Control Plane) 与 数据面(Data Plane) 分离的架构模式。控制面负责编排与状态管理,数据面负责实际的数据传输与存储。
数据流关键路径:
- 控制面触发: 用户通过
velero backup createCLI 命令向 Kubernetes API Server 提交 Backup CRD 对象。 - 控制面协调: Velero Server 的 Backup Controller 监听到新 CRD,开始解析备份范围(Namespace、Label Selector、Volume 列表)。
- 数据面执行: Server 通过 gRPC 调用 Object Store Plugin 将 Kubernetes 资源清单(JSON/YAML)上传至对象存储;同时调用 Volume Snapshotter Plugin 对 PVC 进行快照或文件级备份。
- 状态回写: 备份完成后,Plugin 将结果(存储路径、校验和、快照 ID)返回给 Server,Server 更新 Backup CRD 的状态为
Completed。
2.3 Restic 与 Kopia 集成原理
Velero 支持两种文件级备份引擎:Restic(传统方案)和 Kopia(新一代方案)。两者均以 DaemonSet 或 Sidecar 形式运行在数据面,负责将 Pod 的 Volume 数据备份到对象存储。
2.3.1 两种引擎的架构对比
| 特性 | Restic | Kopia |
|---|---|---|
| 集成方式 | Velero 内置 Restic 作为默认文件备份器 | 通过 Velero Plugin for Kopia 集成(v1.12+) |
| 数据去重 | 基于内容分块(CDC)去重 | 基于内容分块(CDC)+ 可变分块大小,去重效率更高 |
| 增量备份 | 支持,但需扫描全部文件 | 支持,使用索引加速增量扫描 |
| 备份速度 | 中等,大量小文件场景性能下降 | 较快,针对小文件场景有优化 |
| 存储格式 | Restic Repository(.restic 目录) | Kopia Repository(.kopia 目录) |
| 推荐场景 | 传统环境、已有 Restic 经验 | 新部署、追求性能与存储效率 |
关键区别: Restic 和 Kopia 均不依赖 CSI 快照,而是通过直接读取文件系统进行备份。这意味着它们可以备份任何类型的 Volume(包括 hostPath、NFS 等 CSI 不支持的存储),但备份期间 Volume 必须处于只读或一致状态。在生产环境中,建议结合
fsfreeze 或应用侧停写来保证一致性。
2.3.2 引擎选择建议
- 新项目选 Kopia: 如果集群版本 ≥ v1.12,且对备份速度、存储效率有较高要求,优先选择 Kopia。其索引机制在增量备份场景下优势明显。
- 存量环境保留 Restic: 如果已有大量基于 Restic 的备份仓库,或团队对 Restic 运维经验丰富,无需强制迁移。Velero 会长期同时支持两种引擎。
- 混合使用: 同一集群内可以同时部署 Restic 和 Kopia,通过 Backup 的 Annotation(
velero.io/backup-engine)指定使用哪种引擎。
故障排查提示: 当文件级备份失败时,首先检查 Backup Pod 的日志:
# 查看 Restic 备份 Pod 日志
kubectl logs -n velero -l app.kubernetes.io/name=restic --tail=50
# 查看 Kopia 备份 Pod 日志
kubectl logs -n velero -l app.kubernetes.io/name=kopia --tail=50
常见错误包括:Volume 挂载超时、对象存储认证失败、磁盘空间不足导致分块缓存溢出。