4. Velero 安装配置:使用 Helm 部署 Velero、配置 MinIO 作为备份存储、验证安装状态

本章将指导你使用 Helm 3 在生产环境中部署 Velero,并配置 MinIO 作为 S3 兼容的备份后端。完成部署后,通过一系列验证命令确认组件运行正常、存储连接可用,为后续的蓝绿发布灾备演练奠定基础。

4.1 环境准备与前置检查

在部署 Velero 之前,请确保集群满足以下条件:

检查项 要求 验证命令
Kubernetes 版本 ≥ 1.16 kubectl version --short
Helm 版本 ≥ 3.8.0 helm version
集群节点 ≥ 3 个 worker 节点 kubectl get nodes
MinIO 服务 已部署且可访问 curl -I http://minio-endpoint:9000
DNS 解析 集群内可解析 MinIO 域名 kubectl run -it --rm dns-test --image=busybox -- nslookup minio.minio.svc.cluster.local
推荐实践:建议在独立的 velero-system 命名空间中部署 Velero,与业务命名空间隔离,便于权限管理和灾备策略的独立运维。

4.2 使用 Helm 部署 Velero

Velero 官方 Helm Chart 托管在 VMware Tanzu 仓库。以下是完整的部署步骤:

4.2.1 添加 Helm 仓库并更新

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

# 更新仓库索引
helm repo update

# 查看可用的 Velero Chart 版本
helm search repo vmware-tanzu/velero --versions

4.2.2 创建 MinIO 访问凭证 Secret

Velero 需要访问 MinIO 的 Access Key 和 Secret Key。创建一个包含凭证的 Secret 文件:

# 创建 MinIO 凭证文件(示例值,生产环境请替换为实际密钥)
cat > credentials-velero <<EOF
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin
EOF

# 在 velero-system 命名空间中创建 Secret
kubectl create namespace velero-system
kubectl create secret generic cloud-credentials \
  --namespace velero-system \
  --from-file=cloud=credentials-velero
安全提醒:切勿将 MinIO 凭证硬编码在 Helm values 文件中。始终使用 Kubernetes Secret 管理敏感信息,并考虑使用 Sealed Secrets 或 External Secrets Operator 进行加密存储。

4.2.3 准备 Helm Values 配置文件

创建 velero-values.yaml 文件,配置 MinIO 作为备份存储:

# velero-values.yaml
namespace: velero-system
configuration:
  provider: aws
  backupStorageLocation:
    - name: default
      provider: aws
      bucket: velero-backups
      config:
        region: minio
        s3ForcePathStyle: "true"
        s3Url: http://minio.minio.svc.cluster.local:9000
        publicUrl: http://minio.minio.svc.cluster.local:9000
  volumeSnapshotLocation:
    - name: default
      provider: aws
      config:
        region: minio
        s3ForcePathStyle: "true"
        s3Url: http://minio.minio.svc.cluster.local:9000
credentials:
  useSecret: true
  name: cloud-credentials
initContainers:
  - name: velero-plugin-for-aws
    image: velero/velero-plugin-for-aws:v1.7.0
    volumeMounts:
      - mountPath: /target
        name: plugins
deployNodeAgent: true
nodeAgent:
  podVolumePath: /var/lib/kubelet/pods
  privileged: true
metrics:
  enabled: true
  serviceMonitor:
    enabled: false
schedules:
  # 可选:创建默认备份计划
  # daily-backup:
  #   schedule: "0 2 * * *"
  #   template:
  #     ttl: "720h"

4.2.4 执行 Helm 安装

# 使用 Helm 安装 Velero
helm install velero vmware-tanzu/velero \
  --namespace velero-system \
  --values velero-values.yaml \
  --version 5.1.0

# 查看部署状态
helm status velero -n velero-system

4.3 验证安装状态

部署完成后,通过以下步骤全面验证 Velero 组件运行状态和存储连接:

4.3.1 检查 Pod 运行状态

# 查看 Velero 相关 Pod
kubectl get pods -n velero-system -l app.kubernetes.io/name=velero

# 预期输出示例:
# NAME                     READY   STATUS    RESTARTS   AGE
# velero-7d8b9c6f8f-abc12   1/1     Running   0          2m
# node-agent-5x4k7          1/1     Running   0          2m
# node-agent-9m2n3          1/1     Running   0          2m
# node-agent-3p1q8          1/1     Running   0          2m

4.3.2 验证 Backup Storage Location

# 查看 Velero 备份存储位置状态
velero backup-location get

# 预期输出示例:
# NAME      PROVIDER   BUCKET/PATH      PHASE       LAST VALIDATED
# default   aws        velero-backups   Available   2024-01-15 10:30:00 +0000 UTC
关键指标:PHASE 字段必须为 Available,表示 Velero 成功连接到 MinIO 并验证了存储桶的可读写性。如果显示 Unavailable,请检查网络连通性和凭证配置。

4.3.3 验证 Volume Snapshot Location

# 查看卷快照位置状态
velero snapshot-location get

# 预期输出示例:
# NAME      PROVIDER   PHASE
# default   aws        Available

4.3.4 执行测试备份验证端到端连通性

# 创建一个测试备份(不包含实际卷快照)
velero backup create test-backup --include-namespaces default --ttl 24h

# 查看备份状态
velero backup get

# 查看备份日志(确认无错误)
velero backup logs test-backup | tail -20

# 清理测试备份
velero backup delete test-backup --confirm

4.4 Velero 组件架构与数据流

下图展示了 Velero 部署后的核心组件及其与 MinIO 的交互关系:

Velero 组件架构与备份数据流 Kubernetes 集群 Velero 主控制器 velero-xxxxx Pod Node Agent DaemonSet (每个节点) Kubernetes API 备份/恢复 CRD MinIO 对象存储 velero-backups 桶 S3 兼容 API BackupStorageLocation default → MinIO VolumeSnapshotLocation default → MinIO 备份数据上传 存储位置注册 快照位置注册 CRD 操作 验证要点 ① Pod 全部 Running ② BackupLocation Available ③ 测试备份成功

4.5 常见问题排查

问题现象 可能原因 解决方案
BackupLocation 显示 Unavailable MinIO 网络不可达或凭证错误 检查 s3Url 是否正确;验证 Secret 中的凭证与 MinIO 一致;使用 kubectl exec 进入 Velero Pod 测试连通性
Velero Pod CrashLoopBackOff 插件版本不兼容或配置错误 查看 Pod 日志 kubectl logs -n velero-system velero-xxxx;确认 initContainers 中的插件版本与 Velero 版本匹配
备份成功但恢复失败 卷快照存储位置未正确配置 执行 velero snapshot-location get 确认状态;检查 MinIO 桶是否存在且可写
Node Agent 未就绪 特权模式未启用或卷挂载路径错误 确认 deployNodeAgent: true;检查 podVolumePath 是否匹配集群 kubelet 路径

4.6 部署后配置检查清单

完成部署后,使用以下清单逐项确认配置正确性:

  1. 命名空间隔离:Velero 组件运行在 velero-system 命名空间,与业务资源分离。
  2. 存储桶存在性:MinIO 中已创建 velero-backups 桶,且权限正确。
  3. 凭证安全:MinIO 凭证存储在 Kubernetes Secret 中,未明文出现在 ConfigMap 或 Helm values 中。
  4. 插件加载:AWS 插件作为 initContainer 成功加载,Velero 日志中无插件相关错误。
  5. 备份位置可用:velero backup-location get 输出 PHASE 为 Available。
  6. 快照位置可用:velero snapshot-location get 输出 PHASE 为 Available。
  7. 测试备份通过:执行测试备份后,velero backup get 显示状态为 Completed。
  8. 日志无异常:检查 Velero 主控制器和 Node Agent 的日志,无 ERROR 或 FATAL 级别输出。
生产建议:将上述检查清单集成到 CI/CD 流水线中,每次 Velero 升级或配置变更后自动执行验证,确保灾备基础设施始终处于健康状态。