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 驱动,适用于 MinIOs3Url— 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 以及插件之间的交互关系:
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