4. Velero 备份与恢复基础:创建第一个备份、查看备份状态、从备份中恢复应用、备份文件结构解析

Velero 是 Kubernetes 生态中最成熟的备份与恢复工具之一。本章将带你从零开始完成第一个备份操作,掌握备份状态查看、应用恢复以及备份文件底层结构。这些操作是后续蓝绿发布灾备切换的基石。

4.1 环境准备与 Velero 安装验证

在创建备份之前,请确认以下条件已满足:

  • Kubernetes 集群:版本 ≥ 1.16,具备集群管理员权限。
  • Velero CLI:已安装并与集群版本兼容。
  • 对象存储:MinIO / AWS S3 / GCS 等,用于存放备份文件。
  • Velero 服务端:已在集群中部署并关联存储位置。
快速验证命令:
velero version —— 确认客户端与服务端版本一致。
velero backup-location get —— 确认存储位置状态为 Available。

4.2 创建第一个备份

假设我们有一个名为 wordpress 的命名空间,包含 WordPress 应用及其 MySQL 数据库。执行以下命令创建全量备份:

velero backup create wordpress-backup-20250401 \
  --include-namespaces wordpress \
  --default-volumes-to-fs-backup \
  --ttl 720h

参数说明:

参数 含义 推荐值
--include-namespaces 指定要备份的命名空间 wordpress
--default-volumes-to-fs-backup 使用文件系统级备份持久卷(避免快照依赖) 推荐开启
--ttl 备份保留时长(小时) 720h(30天)
生产建议:首次备份建议先使用 --dry-run 参数预览将要备份的资源列表,确认无误后再执行实际备份。

4.3 查看备份状态

备份创建后,Velero 会经历 New → InProgress → Completed / Failed 几个阶段。使用以下命令跟踪状态:

# 查看所有备份
velero backup get

# 查看特定备份详情
velero backup describe wordpress-backup-20250401

# 实时查看备份日志
velero backup logs wordpress-backup-20250401

备份状态字段解读:

状态 含义 常见原因
Completed 备份成功完成 —
Failed 备份过程中出现错误 存储权限不足、PVC 挂载失败
PartiallyFailed 部分资源备份失败 某些 CRD 不支持备份
InProgress 备份正在执行 等待数据上传完成
Velero 备份状态机与生命周期 New InProgress Completed Failed PartiallyFailed 关键说明 • Completed 是成功状态 • Failed 需查看日志定位 • PartiallyFailed 可部分恢复

4.4 从备份中恢复应用

当应用出现故障或需要回滚时,使用 velero restore 命令从备份中恢复。恢复操作支持全量恢复、选择性恢复以及命名空间映射。

4.4.1 基本恢复命令

# 从备份恢复整个命名空间
velero restore create --from-backup wordpress-backup-20250401

# 恢复时重命名命名空间(避免与现有资源冲突)
velero restore create --from-backup wordpress-backup-20250401 \
  --namespace-mappings wordpress:wordpress-restored

4.4.2 恢复策略对比

恢复方式 适用场景 注意事项
全量恢复 灾难恢复、环境迁移 会覆盖同名资源(默认行为)
命名空间映射恢复 蓝绿发布、A/B 测试 需提前创建目标命名空间
选择性资源恢复 仅恢复特定 Deployment 或 PVC 使用 --include-resources 参数
重要:恢复操作默认会尝试创建或更新资源。如果目标集群中已存在同名资源,Velero 会使用备份中的版本覆盖。在生产环境中,建议先使用 --namespace-mappings 恢复到隔离命名空间进行验证。

4.5 备份文件结构解析

Velero 将备份数据存储在对象存储中,目录结构清晰可读。理解文件结构有助于手动排查问题或进行跨集群迁移。

4.5.1 存储目录层级

backups/
└── wordpress-backup-20250401/
    ├── velero-backup.json          # 备份元数据(资源列表、参数、时间戳)
    ├── wordpress/
    │   ├── namespaces/
    │   │   └── wordpress.json      # 命名空间定义
    │   ├── deployments/
    │   │   └── wordpress.json      # Deployment 资源
    │   ├── services/
    │   │   └── wordpress-svc.json  # Service 资源
    │   ├── persistentvolumeclaims/
    │   │   └── wp-pvc.json         # PVC 定义
    │   └── configmaps/
    │       └── wp-config.json      # ConfigMap 资源
    └── volumes/
        └── wordpress/
            └── pvc-xxxxx/
                ├── backup.tar.gz   # 卷数据文件(文件系统级备份)
                └── backup.json     # 卷备份元数据

4.5.2 关键文件说明

文件/目录 内容 用途
velero-backup.json 备份的完整元数据,包含资源列表、备份选项、存储位置 恢复时 Velero 读取此文件确定要恢复的资源
namespaces/ 每个命名空间的 JSON 定义 确保目标集群中存在对应命名空间
deployments/ Deployment、StatefulSet 等工作负载资源 恢复应用运行状态
volumes/ 持久卷的文件系统快照(tar.gz 格式) 恢复应用数据
Velero 备份文件结构(对象存储视角) backups/ wordpress-backup-20250401/ velero-backup.json wordpress/ volumes/ deployments/ services/ pvc-xxxxx/ backup.tar.gz 文件结构要点 • JSON 文件存储 K8s 资源 • tar.gz 存储卷数据 • 结构可手动浏览排查 • 支持跨集群直接拷贝

4.6 备份与恢复的常见问题

经验总结:
  • 备份失败:检查存储桶权限、网络连通性、PVC 是否处于挂载状态。
  • 恢复后 Pod 无法启动:检查镜像拉取策略、存储类是否匹配、PV 回收策略。
  • 备份文件过大:使用 --exclude-resources 排除不需要备份的资源(如 Events)。
  • 跨集群恢复:确保目标集群的 StorageClass 与备份时一致,或使用 --storage-class-mappings 进行映射。

4.7 本章小结