3. Velero 安装与配置:使用 Helm 部署 Velero 到 K8s 集群、配置 MinIO 作为备份存储、验证安装

本章将指导你使用 Helm 3 在 Kubernetes 集群中部署 Velero,并配置 MinIO 作为兼容 S3 的备份后端。完成部署后,通过运行一次简单的备份与恢复操作来验证整个链路是否正常。

3.1 环境准备与前提条件

在开始安装之前,请确保满足以下条件:

组件 版本/要求 说明
Kubernetes 集群 v1.20+ 建议使用 1.24+ 以获得最佳兼容性
Helm v3.8+ 确保已安装并配置好 Helm 仓库
kubectl 与集群版本匹配 已配置正确的 kubeconfig 上下文
MinIO RELEASE.2023-12-09T18-57-40Z+ 运行在集群内或外部可访问
存储类 支持 ReadWriteOnce 用于 MinIO 的持久卷
提示: 如果你还没有 MinIO 实例,可以使用以下命令快速在集群内部署一个单节点 MinIO 用于测试:
helm repo add minio https://charts.min.io/
helm install minio minio/minio --set rootUser=admin,rootPassword=password123 --set persistence.enabled=false --set service.type=ClusterIP

3.2 使用 Helm 部署 Velero

Velero 官方 Helm Chart 托管在 vmware-tanzu 仓库中。以下是完整的安装步骤:

3.2.1 添加 Helm 仓库并更新

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

# 更新本地仓库索引
helm repo update

3.2.2 创建命名空间与 MinIO 凭证 Secret

Velero 需要访问 MinIO 的凭证来读写备份数据。创建一个包含 cloud 键的 Secret:

# 创建 velero 命名空间
kubectl create namespace velero

# 创建 MinIO 凭证 Secret(替换为你的实际密钥)
kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-literal=cloud="[default]
aws_access_key_id=admin
aws_secret_access_key=password123"
注意: 虽然 MinIO 是 S3 兼容存储,但 Velero 的凭证文件格式仍然使用 [default] 段和 aws_ 前缀。这是 Velero 内部统一使用 AWS SDK 处理 S3 兼容存储所致。

3.2.3 使用 Helm 安装 Velero

以下是最小化配置的安装命令,适用于 MinIO 部署在同一集群内的情况:

helm install velero vmware-tanzu/velero \
  --namespace velero \
  --create-namespace \
  --set configuration.provider=aws \
  --set configuration.backupStorageLocation.name=default \
  --set configuration.backupStorageLocation.bucket=velero-backups \
  --set configuration.backupStorageLocation.config.region=us-east-1 \
  --set configuration.backupStorageLocation.config.s3Url=http://minio.minio.svc.cluster.local:9000 \
  --set configuration.backupStorageLocation.config.publicUrl=http://minio.minio.svc.cluster.local:9000 \
  --set configuration.backupStorageLocation.config.s3ForcePathStyle=true \
  --set configuration.volumeSnapshotLocation.name=default \
  --set configuration.volumeSnapshotLocation.config.region=us-east-1 \
  --set credentials.useSecret=true \
  --set credentials.secretContents.cloud="[default]
aws_access_key_id=admin
aws_secret_access_key=password123" \
  --set initContainers[0].name=velero-plugin-for-aws \
  --set initContainers[0].image=velero/velero-plugin-for-aws:v1.9.0 \
  --set initContainers[0].volumeMounts[0].mountPath=/target \
  --set initContainers[0].volumeMounts[0].name=plugins
关键参数说明:
  • configuration.provider=aws — 使用 AWS S3 兼容 API 驱动,适用于 MinIO
  • s3Url — MinIO 服务的内部 DNS 地址和端口
  • s3ForcePathStyle=true — MinIO 必须启用路径风格访问
  • initContainers — 加载 Velero 的 AWS 插件,使 Velero 能识别 S3 兼容存储

3.3 配置 MinIO 作为备份存储

MinIO 的配置主要涉及 Bucket 创建和访问策略。Velero 安装时指定的 Bucket 必须预先存在。

3.3.1 在 MinIO 中创建备份 Bucket

使用 MinIO 客户端 mc 或通过 MinIO Web 控制台创建:

# 使用 mc 客户端(假设 MinIO 服务已暴露)
mc alias set myminio http://minio.minio.svc.cluster.local:9000 admin password123
mc mb myminio/velero-backups

3.3.2 验证 Bucket 可访问性

从 Velero Pod 内部测试连通性:

# 进入 Velero Pod
kubectl exec -n velero deploy/velero -- /bin/bash -c "velero backup-location get"

如果配置正确,输出应显示 PHASE: Available。

3.4 验证安装:执行备份与恢复测试

安装完成后,通过一个端到端的备份-恢复测试来验证整个链路是否正常工作。

3.4.1 创建测试应用

# 创建一个简单的 Nginx 部署
kubectl create deployment nginx-test --image=nginx:alpine --replicas=2
kubectl expose deployment nginx-test --port=80 --target-port=80 --name=nginx-svc

3.4.2 执行增量备份

# 对 default 命名空间执行备份
velero backup create test-backup-01 \
  --include-namespaces default \
  --default-volumes-to-fs-backup \
  --wait
说明: --default-volumes-to-fs-backup 参数启用文件系统级别的卷备份,适用于非 CSI 驱动的存储。对于 CSI 快照,应使用 --snapshot-volumes。

3.4.3 模拟故障并恢复

# 删除测试应用
kubectl delete deployment nginx-test
kubectl delete svc nginx-svc

# 从备份恢复
velero restore create --from-backup test-backup-01 --wait

# 验证恢复结果
kubectl get deployment nginx-test
kubectl get svc nginx-svc

恢复完成后,Nginx 应用应重新运行,且 Service 的 ClusterIP 可能与原 IP 不同,但功能正常。

3.5 架构总览:Velero + MinIO 部署关系

下图展示了 Velero、Kubernetes API Server、MinIO 以及插件之间的交互关系:

Velero + MinIO 部署架构图 Velero + MinIO 部署架构与备份数据流 Kubernetes 集群 Velero 组件 Velero Server AWS 插件 备份/恢复控制器 MinIO 存储 S3 API 端点 Bucket velero-backups S3 兼容 API Kubernetes API Server Watch/List 测试应用 nginx-test (default NS) 备份数据流 图例 Velero 核心组件 MinIO 存储后端

3.6 验证清单与常见问题

安装完成后,使用以下清单逐项确认:

检查项 验证命令 预期结果
Velero Pod 运行中 kubectl get pods -n velero velero-xxx 状态为 Running
备份存储位置可用 velero backup-location get PHASE 为 Available
MinIO Bucket 存在 mc ls myminio/velero-backups 列出备份文件
备份成功 velero backup get STATUS 为 Completed
恢复成功 velero restore get STATUS 为 Completed
常见问题排查:
  • 备份状态为 Failed — 检查 Velero Pod 日志:kubectl logs -n velero deploy/velero,常见原因为 MinIO 地址不可达或凭证错误。
  • VolumeSnapshot 失败 — 确认集群已安装 CSI 驱动或使用 --default-volumes-to-fs-backup 绕过。
  • 恢复后 Pod 无法启动 — 检查 PVC 是否绑定,存储类是否匹配。

3.7 清理测试环境

完成验证后,可以清理测试资源:

# 删除测试应用
kubectl delete deployment nginx-test
kubectl delete svc nginx-svc

# 删除备份(保留备份数据在 MinIO 中)
velero backup delete test-backup-01

# 如需完全卸载 Velero
helm uninstall velero -n velero
kubectl delete namespace velero