3. Velero 安装与配置:使用 Helm 安装 Velero、配置对象存储(AWS S3/MinIO)、RBAC 权限设置

本章聚焦 Velero 在生产环境中的标准安装流程。我们将使用 Helm 作为包管理工具,分别配置 AWS S3 与 MinIO 两种对象存储后端,并严格遵循最小权限原则设置 RBAC。完成本章后,你将拥有一个可执行增量备份与灾难恢复的 Velero 实例。

3.1 环境准备与 Helm 仓库配置

在安装 Velero 之前,请确保你的 Kubernetes 集群版本 ≥ 1.16,并且已安装 Helm 3.8+。首先添加 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 查看可用版本,并通过 --version 参数指定,避免意外升级导致兼容性问题。

3.2 对象存储配置:AWS S3 与 MinIO

Velero 依赖对象存储来存放备份文件。以下分别说明 AWS S3(公有云)与 MinIO(私有化/本地开发)的配置方式。

3.2.1 AWS S3 配置

在 AWS 上创建专用 S3 存储桶,并生成一组仅具有最小权限的 IAM 用户凭证:

  1. 创建 S3 存储桶: 例如 velero-backup-prod,区域选择与集群相近的 Region。
  2. 创建 IAM 策略: 使用以下 JSON 定义最小权限,允许对指定桶进行读写和列举操作。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::velero-backup-prod",
        "arn:aws:s3:::velero-backup-prod/*"
      ]
    }
  ]
}
  1. 创建 IAM 用户: 附加上述策略,生成 Access Key ID 与 Secret Access Key。
  2. 创建 Secret: 将凭证存入 Kubernetes Secret,供 Velero 使用。
kubectl create namespace velero
kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-literal=aws_access_key_id=YOUR_ACCESS_KEY \
  --from-literal=aws_secret_access_key=YOUR_SECRET_KEY

3.2.2 MinIO 配置

MinIO 适用于本地开发、边缘或私有云场景。以下为 Docker Compose 快速启动示例:

version: '3.8'
services:
  minio:
    image: minio/minio:RELEASE.2024-01-01T00-00-00Z
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: velero
      MINIO_ROOT_PASSWORD: velero123
    volumes:
      - ./minio-data:/data

启动后,通过浏览器访问 http://localhost:9001,使用上述凭证登录,创建名为 velero-backup 的存储桶。MinIO 的 S3 兼容端点通常为 http://minio-service:9000(集群内)或 http://localhost:9000(开发环境)。

生产环境注意: MinIO 应部署为高可用模式(分布式),并配置 TLS 加密。上述示例仅用于快速验证,切勿直接用于生产。

3.3 使用 Helm 安装 Velero

根据你选择的对象存储后端,准备对应的 values.yaml 文件。以下为两种场景的配置模板。

3.3.1 AWS S3 场景 values.yaml

configuration:
  provider: aws
  backupStorageLocation:
    name: default
    bucket: velero-backup-prod
    config:
      region: us-east-1
  volumeSnapshotLocation:
    name: default
    config:
      region: us-east-1
credentials:
  useSecret: true
  secretContents:
    cloud: |
      [default]
      aws_access_key_id=YOUR_ACCESS_KEY
      aws_secret_access_key=YOUR_SECRET_KEY
initContainers:
  - name: velero-plugin-for-aws
    image: velero/velero-plugin-for-aws:v1.9.0
    volumeMounts:
      - mountPath: /target
        name: plugins

3.3.2 MinIO 场景 values.yaml

configuration:
  provider: aws
  backupStorageLocation:
    name: default
    bucket: velero-backup
    config:
      region: minio
      s3ForcePathStyle: true
      s3Url: http://minio-service:9000
  volumeSnapshotLocation:
    name: default
    config:
      region: minio
credentials:
  useSecret: true
  secretContents:
    cloud: |
      [default]
      aws_access_key_id=velero
      aws_secret_access_key=velero123
initContainers:
  - name: velero-plugin-for-aws
    image: velero/velero-plugin-for-aws:v1.9.0
    volumeMounts:
      - mountPath: /target
        name: plugins

执行安装命令:

helm install velero vmware-tanzu/velero \
  --namespace velero \
  --create-namespace \
  -f values.yaml

验证安装状态:

kubectl get pods -n velero
kubectl logs deployment/velero -n velero
安装验证清单:
  • Pod 状态为 Running,且无 CrashLoopBackOff。
  • 日志中无 error 或 failed 关键字。
  • 执行 velero backup-location get 显示 Available 状态。

3.4 RBAC 权限设置

Velero 需要对集群资源进行备份和恢复操作,因此需要创建专用的 ServiceAccount 并绑定适当的 ClusterRole。Helm Chart 默认会创建这些资源,但理解其结构有助于故障排查和自定义。

以下为手动创建 RBAC 的等效 YAML(Helm 会自动生成,此处供参考):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: velero
  namespace: velero
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: velero
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log", "namespaces", "persistentvolumes", "persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: ["apps"]
    resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: ["batch"]
    resources: ["jobs", "cronjobs"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: ["velero.io"]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: velero
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: velero
subjects:
  - kind: ServiceAccount
    name: velero
    namespace: velero
最小权限原则: 上述 ClusterRole 已按 Velero 官方推荐的最小权限设置。若你使用自定义插件或需要备份 CRD 资源,需额外添加对应 apiGroups 和 resources 的权限。

3.5 验证配置:创建测试备份

安装完成后,执行一次手动备份以验证整个链路是否正常:

velero backup create test-backup --include-namespaces default

查看备份状态:

velero backup get
velero backup describe test-backup

若状态为 Completed,则说明 Velero 安装、对象存储配置、RBAC 权限均正确无误。

Velero Helm 安装与对象存储配置流程 Velero Helm 安装与对象存储配置流程 1. 环境准备 2. 选择存储后端 AWS S3 MinIO 3. 创建 Secret 4. Helm Install 5. 验证备份

3.6 配置参数对比表

以下表格总结了 AWS S3 与 MinIO 在 Velero 配置中的关键差异:

配置项 AWS S3 MinIO
provider aws aws(兼容 S3 API)
backupStorageLocation.bucket 预创建的 S3 桶名 MinIO 中创建的桶名
config.region AWS Region(如 us-east-1) 任意标识(如 minio)
config.s3ForcePathStyle 不设置或 false true
config.s3Url 不设置 MinIO 服务地址(如 http://minio:9000)
凭证来源 AWS IAM User / IRSA MinIO Access Key & Secret Key
插件 velero-plugin-for-aws velero-plugin-for-aws

3.7 常见问题与排查

  • 备份状态为 Failed: 检查 Velero Pod 日志,确认对象存储端点是否可达、凭证是否正确、存储桶是否存在。
  • RBAC 权限不足: 若备份自定义资源(CRD)失败,需在 ClusterRole 中添加对应 apiGroups 的权限。
  • MinIO 连接超时: 确认 s3Url 使用正确的服务名和端口,且集群网络策略允许访问。
  • 插件加载失败: 检查 initContainers 镜像版本是否与 Velero 版本兼容。
安全提醒: 切勿将生产环境的 Access Key 直接写在 values.yaml 中。建议使用 Helm 的 --set-file 参数引用外部文件,或集成外部密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)。
Velero RBAC 权限结构 Velero RBAC 权限结构 ServiceAccount: velero ClusterRole: velero ClusterRoleBinding 核心资源 (Pod/PVC/NS) 工作负载 (Deploy/STS) Velero CRD Batch (Job/CronJob)