4. Velero 备份与恢复工具:Velero 架构、安装配置、备份 PV/PVC、跨集群迁移

4.1 Velero 概述与核心架构

Velero(原 Heptio Ark)是 VMware 开源的 Kubernetes 集群备份、恢复与迁移工具。它能够将集群资源(Deployment、Service、ConfigMap 等)与持久卷数据(PV/PVC)备份到对象存储中,并支持按需恢复或定时备份。Velero 是云原生灾备体系的事实标准,也是跨集群迁移和蓝绿发布回滚的关键依赖。

核心能力: 备份整个命名空间或指定标签的资源;备份 PV 数据(支持 CSI 快照、Restic/Kopia 文件级备份);跨集群迁移资源与数据;定时备份(Cron 表达式);恢复时支持资源映射(如改名、改命名空间)。
Velero 核心架构图 Velero 核心架构 源 Kubernetes 集群 Velero 客户端 (velero CLI) Velero 服务端 (Deployment) 节点代理 (DaemonSet / Restic) 目标存储 / 目标集群 对象存储 (S3/MinIO/GCS) CSI 快照 / 文件级备份 目标集群 (恢复/迁移) 备份数据流 备份文件:.tar.gz 格式 包含资源清单 + PV 数据

4.2 安装与配置 Velero

4.2.1 前提条件

  • Kubernetes 集群版本 ≥ 1.16(推荐 1.24+)
  • 集群节点可访问对象存储(S3/MinIO/GCS/Azure Blob)
  • 如需备份 PV 数据,集群需安装 CSI 驱动或启用 Restic/Kopia 集成
  • 安装 velero CLI 工具(版本 ≥ 1.12)

4.2.2 安装 Velero 服务端(使用 MinIO 作为存储后端)

以下示例使用 MinIO 作为 S3 兼容的对象存储,通过 Helm 安装 Velero:

# 添加 Velero Helm 仓库
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update

# 创建命名空间
kubectl create namespace velero

# 安装 Velero(使用 MinIO 存储)
helm install velero vmware-tanzu/velero \
  --namespace velero \
  --set-file credentials.secretContents.cloud=./credentials-velero \
  --set configuration.provider=aws \
  --set configuration.backupStorageLocation.name=default \
  --set configuration.backupStorageLocation.bucket=velero-backups \
  --set configuration.backupStorageLocation.config.region=minio \
  --set configuration.backupStorageLocation.config.s3Url=http://minio.minio:9000 \
  --set configuration.backupStorageLocation.config.publicUrl=http://localhost:9000 \
  --set configuration.volumeSnapshotLocation.name=default \
  --set configuration.volumeSnapshotLocation.config.region=minio \
  --set initContainers[0].name=velero-plugin-for-aws \
  --set initContainers[0].image=velero/velero-plugin-for-aws:v1.8.0 \
  --set initContainers[0].volumeMounts[0].mountPath=/target \
  --set initContainers[0].volumeMounts[0].name=plugins
凭证文件 credentials-velero 格式:
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin

4.2.3 验证安装

# 检查 Pod 状态
kubectl get pods -n velero

# 检查备份存储位置
velero backup-location get

# 检查快照位置
velero snapshot-location get

4.3 备份 PV/PVC 数据

Velero 支持两种方式备份持久卷数据:CSI 快照(需 CSI 驱动支持 VolumeSnapshotClass)和 文件级备份(通过 Restic 或 Kopia 集成)。推荐优先使用 CSI 快照,性能更高且对应用透明。

4.3.1 备份整个命名空间(含 PV 数据)

# 备份 default 命名空间,包含 PV 数据(使用 CSI 快照)
velero backup create my-backup \
  --include-namespaces default \
  --snapshot-volumes \
  --wait

# 查看备份状态
velero backup describe my-backup --details

4.3.2 使用 Restic 进行文件级备份(无 CSI 环境)

# 安装时启用 Restic
helm install velero vmware-tanzu/velero \
  --namespace velero \
  --set-file credentials.secretContents.cloud=./credentials-velero \
  --set configuration.provider=aws \
  --set configuration.backupStorageLocation.name=default \
  --set configuration.backupStorageLocation.bucket=velero-backups \
  --set configuration.backupStorageLocation.config.region=minio \
  --set configuration.backupStorageLocation.config.s3Url=http://minio.minio:9000 \
  --set snapshotsEnabled=true \
  --set deployNodeAgent=true \
  --set nodeAgent.podVolumePath=/var/lib/kubelet/pods

# 备份时添加 --volume-path 注解(自动注入)
velero backup create my-backup-restic \
  --include-namespaces default \
  --default-volumes-to-restic \
  --wait

4.3.3 定时备份(Cron 表达式)

# 创建定时备份,每天凌晨 2 点执行
velero schedule create daily-backup \
  --schedule="0 2 * * *" \
  --include-namespaces default \
  --snapshot-volumes \
  --ttl 168h   # 保留 7 天

4.4 恢复与跨集群迁移

4.4.1 恢复备份到原集群

# 恢复整个备份
velero restore create --from-backup my-backup --wait

# 恢复指定命名空间(改名恢复)
velero restore create --from-backup my-backup \
  --namespace-mappings default:restored-default \
  --wait

4.4.2 跨集群迁移步骤

跨集群迁移的核心思路:在源集群备份,在目标集群恢复。目标集群需安装相同版本的 Velero 并配置访问同一对象存储。

步骤 操作 命令/说明
1 源集群备份 velero backup create migrate-backup --include-namespaces prod --snapshot-volumes --wait
2 验证备份完整性 velero backup describe migrate-backup --details
3 目标集群安装 Velero 配置相同的存储后端(MinIO/S3)和 Bucket
4 目标集群同步备份 velero backup get 应能看到源集群创建的备份
5 目标集群恢复 velero restore create --from-backup migrate-backup --wait
6 验证恢复结果 检查 Pod、Service、PVC 状态及数据完整性
跨集群迁移注意事项:
- 目标集群的 StorageClass 必须与源集群兼容,否则 PVC 可能无法绑定。
- 使用 --storage-class-mapping 参数映射 StorageClass:--storage-class-mapping standard:fast-ssd
- 跨云迁移时,需确保对象存储可被目标集群访问(公网或专线)。
- 迁移有状态应用(如数据库)前,建议先停止写入或使用应用级快照。
Velero 跨集群迁移流程图 Velero 跨集群迁移流程 源集群 velero backup create 对象存储 MinIO / S3 / GCS 目标集群 velero restore create 备份 恢复 迁移关键步骤 1. 源集群备份:velero backup create migrate-backup --include-namespaces prod --snapshot-volumes 2. 验证备份:velero backup describe migrate-backup --details 3. 目标集群安装 Velero,配置相同存储后端 4. 目标集群恢复:velero restore create --from-backup migrate-backup 5. 验证恢复:检查 Pod、PVC、Service 及数据完整性 6. 可选:使用 --namespace-mappings 和 --storage-class-mapping 适配目标环境

4.5 备份策略与最佳实践

4.5.1 备份策略对比

策略 适用场景 优点 缺点
CSI 快照 有 CSI 驱动的集群(云原生环境) 速度快、对应用透明、支持一致性组 依赖 CSI 驱动和 VolumeSnapshotClass
Restic 文件级 无 CSI 环境、NFS/本地存储 兼容性好、支持任意存储类型 备份速度较慢、占用节点资源
Kopia 文件级 替代 Restic(Velero 1.12+) 性能优于 Restic、支持增量备份 较新,社区文档较少

4.5.2 最佳实践清单

  • 定期验证恢复: 每月至少执行一次恢复演练,确保备份数据可用。
  • 备份保留策略: 使用 --ttl 参数设置备份过期时间,避免存储空间膨胀。
  • 标签选择器: 使用 --include-resources 和 --label-selector 精细控制备份范围。
  • 加密传输: 对象存储启用 HTTPS,敏感数据使用 Velero 的 --encryption-key 加密。
  • 监控告警: 监控 Velero Pod 状态和备份失败事件,集成到 Prometheus/Alertmanager。
  • 多区域冗余: 配置多个 BackupStorageLocation,实现跨区域备份冗余。
生产环境推荐配置:
- 每天全量备份 + 每小时增量备份(Restic/Kopia 支持)。
- 备份保留 30 天,异地存储保留 90 天。
- 使用 Velero 的 --ordered-resources 参数控制资源恢复顺序(如先恢复数据库,再恢复应用)。