4. Velero 备份与恢复工具:Velero 架构、安装配置、备份 PV/PVC、跨集群迁移
4.1 Velero 概述与核心架构
Velero(原 Heptio Ark)是 VMware 开源的 Kubernetes 集群备份、恢复与迁移工具。它能够将集群资源(Deployment、Service、ConfigMap 等)与持久卷数据(PV/PVC)备份到对象存储中,并支持按需恢复或定时备份。Velero 是云原生灾备体系的事实标准,也是跨集群迁移和蓝绿发布回滚的关键依赖。
核心能力: 备份整个命名空间或指定标签的资源;备份 PV 数据(支持 CSI 快照、Restic/Kopia 文件级备份);跨集群迁移资源与数据;定时备份(Cron 表达式);恢复时支持资源映射(如改名、改命名空间)。
4.2 安装与配置 Velero
4.2.1 前提条件
- Kubernetes 集群版本 ≥ 1.16(推荐 1.24+)
- 集群节点可访问对象存储(S3/MinIO/GCS/Azure Blob)
- 如需备份 PV 数据,集群需安装 CSI 驱动或启用 Restic/Kopia 集成
- 安装
veleroCLI 工具(版本 ≥ 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 可能无法绑定。
- 使用
- 跨云迁移时,需确保对象存储可被目标集群访问(公网或专线)。
- 迁移有状态应用(如数据库)前,建议先停止写入或使用应用级快照。
- 目标集群的 StorageClass 必须与源集群兼容,否则 PVC 可能无法绑定。
- 使用
--storage-class-mapping 参数映射 StorageClass:--storage-class-mapping standard:fast-ssd- 跨云迁移时,需确保对象存储可被目标集群访问(公网或专线)。
- 迁移有状态应用(如数据库)前,建议先停止写入或使用应用级快照。
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 的
- 每天全量备份 + 每小时增量备份(Restic/Kopia 支持)。
- 备份保留 30 天,异地存储保留 90 天。
- 使用 Velero 的
--ordered-resources 参数控制资源恢复顺序(如先恢复数据库,再恢复应用)。