3. Velero 安装与配置:Helm安装、MinIO/S3兼容存储配置、RBAC权限设置、Velero CLI安装

Velero 的安装与配置是灾备体系落地的第一步。本章围绕生产级部署所需的核心组件展开:使用 Helm 进行声明式安装、对接 MinIO 作为 S3 兼容的后端存储、配置最小权限的 RBAC 策略,以及安装 Velero CLI 用于日常操作。以下内容按实际部署顺序组织,确保每一步都可独立验证。

3.1 整体架构与组件关系

在开始安装之前,理解 Velero 各组件的协作关系至关重要。下图展示了 Velero 在 Kubernetes 集群中的部署架构,包括控制平面组件、存储后端以及 CLI 工具的交互路径。

Velero 安装架构与组件关系图 Velero 安装架构与组件关系 Kubernetes 集群 Velero 控制器 Deployment (velero) Node Agent DaemonSet (node-agent) CRDs Backup / Restore / Schedule RBAC 权限 MinIO / S3 对象存储后端 (Bucket: velero) velero CLI 备份/恢复数据流 API 调用 安装顺序 1. MinIO 部署 2. Helm 安装 Velero 3. CLI 配置验证
架构要点:Velero 控制器以 Deployment 形式运行,负责编排备份/恢复任务;Node Agent 以 DaemonSet 形式运行在每个节点上,负责执行卷快照和数据传输;CRDs 定义了 Backup、Restore、Schedule 等资源对象;所有备份数据最终写入 S3 兼容的对象存储(如 MinIO)。CLI 工具通过 API Server 与控制器交互,不直接访问存储后端。

3.2 部署 MinIO 作为 S3 兼容存储后端

MinIO 是生产环境中广泛使用的 S3 兼容对象存储,适合在本地或私有云环境中为 Velero 提供后端存储。以下步骤在 Kubernetes 集群内部署 MinIO。

3.2.1 创建 MinIO 部署与 Service

# 创建命名空间
kubectl create namespace minio

# 创建 MinIO 部署
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
  namespace: minio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
      - name: minio
        image: quay.io/minio/minio:latest
        args:
        - server
        - /data
        - --console-address
        - ":9001"
        env:
        - name: MINIO_ROOT_USER
          value: "admin"
        - name: MINIO_ROOT_PASSWORD
          value: "password123"
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: minio
  namespace: minio
spec:
  type: ClusterIP
  ports:
  - port: 9000
    targetPort: 9000
    name: api
  - port: 9001
    targetPort: 9001
    name: console
  selector:
    app: minio
EOF

3.2.2 创建 Bucket 与访问凭证

MinIO 启动后,需要创建 Velero 专用的 Bucket 和访问密钥。使用 MinIO Client(mc)或直接通过 API 完成初始化。

# 使用 mc 客户端配置 MinIO
kubectl run mc --image=minio/mc --rm -it --restart=Never -- \
  /bin/sh -c "
  mc alias set myminio http://minio.minio.svc.cluster.local:9000 admin password123
  mc mb myminio/velero
  mc admin user add myminio velero-user velero-secret-key
  mc admin policy set myminio readwrite user=velero-user
  "
生产环境注意:MinIO 的 root 密码和 Velero 访问密钥应使用 Kubernetes Secret 管理,避免明文硬编码。建议为 MinIO 配置持久卷(PVC)和 TLS 证书,确保数据持久性和传输安全。

3.3 使用 Helm 安装 Velero

Helm 是部署 Velero 的推荐方式,支持参数化配置和版本管理。以下步骤使用 Helm 3 安装 Velero,并配置 MinIO 作为后端存储。

3.3.1 添加 Helm 仓库并准备配置

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

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

# 创建存储凭证 Secret
kubectl create secret generic velero-minio-credentials \
  --namespace velero \
  --from-literal=aws_access_key_id=velero-user \
  --from-literal=aws_secret_access_key=velero-secret-key

3.3.2 使用 Helm 安装 Velero

helm install velero vmware-tanzu/velero \
  --namespace velero \
  --set-file credentials.secretContents.cloud=velero-minio-credentials \
  --set configuration.provider=aws \
  --set configuration.backupStorageLocation.name=default \
  --set configuration.backupStorageLocation.bucket=velero \
  --set configuration.backupStorageLocation.config.region=minio \
  --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.kmsKeyId= \
  --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.9.0 \
  --set initContainers[0].volumeMounts[0].mountPath=/target \
  --set initContainers[0].volumeMounts[0].name=plugins
关键参数说明:
  • provider=aws:Velero 使用 AWS S3 API 协议与 MinIO 通信,MinIO 完全兼容 S3 接口。
  • s3Url:指定 MinIO 服务的内部 DNS 地址,确保集群内网络可达。
  • initContainers:加载 Velero 的 AWS 插件,使 Velero 能够识别 S3 兼容存储。
  • backupStorageLocation:定义备份数据的存储位置,可配置多个 Location 实现异地灾备。

3.4 RBAC 权限设置

Velero 需要访问 Kubernetes API 资源来执行备份和恢复操作。Helm 安装时会自动创建 ServiceAccount 和 ClusterRole,但生产环境中建议按最小权限原则进行定制。

3.4.1 默认 RBAC 资源清单

资源类型 名称 作用域 权限说明
ServiceAccount velero velero 命名空间 Velero 控制器使用的身份
ClusterRole velero-server 集群级别 对 Pod、PVC、Namespace 等资源的读写权限
ClusterRoleBinding velero-server 集群级别 将 velero ServiceAccount 绑定到 velero-server ClusterRole
Role velero-server velero 命名空间 对 Velero 自身 ConfigMap、Secrets 的管理权限
RoleBinding velero-server velero 命名空间 命名空间级别的权限绑定

3.4.2 自定义 RBAC 配置示例

如果需要对 Velero 的权限进行限制(例如仅允许备份特定命名空间),可以创建自定义 ClusterRole 并绑定。

# 创建限制范围的 ClusterRole
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: velero-restricted
rules:
- apiGroups: [""]
  resources: ["pods", "persistentvolumeclaims", "namespaces"]
  verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: ["velero.io"]
  resources: ["backups", "restores", "schedules"]
  verbs: ["*"]
EOF

# 绑定到 velero ServiceAccount
kubectl create clusterrolebinding velero-restricted-binding \
  --clusterrole=velero-restricted \
  --serviceaccount=velero:velero
权限验证:安装完成后,可以通过 kubectl auth can-i --list --as=system:serviceaccount:velero:velero 命令检查 Velero 的实际权限范围,确保最小权限原则得到落实。

3.5 安装 Velero CLI

Velero CLI 是管理员执行备份、恢复和状态检查的主要工具。CLI 通过 kubeconfig 与集群通信,不直接依赖 Velero 控制器。

3.5.1 下载与安装

# Linux 环境安装
wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz
tar -xzf velero-v1.14.0-linux-amd64.tar.gz
sudo mv velero-v1.14.0-linux-amd64/velero /usr/local/bin/
rm -rf velero-v1.14.0-linux-amd64*

# macOS 环境安装
brew install velero

# 验证安装
velero version

3.5.2 CLI 配置与验证

CLI 默认使用当前 kubeconfig 的上下文连接集群。安装完成后,可以通过以下命令验证 Velero 控制器的状态和存储后端配置。

# 查看 Velero 控制器状态
velero get backup-locations

# 查看备份存储位置详情
velero backup-location get default -o yaml

# 查看 Velero 控制器日志
kubectl logs -n velero deployment/velero --tail=50

3.6 安装后验证清单

完成所有安装步骤后,建议按照以下清单进行验证,确保每个组件都正常工作。

验证项 验证命令 预期结果
MinIO 服务可用 kubectl get svc -n minio minio 服务 ClusterIP 正常,端口 9000 和 9001 就绪
Velero Pod 运行 kubectl get pods -n velero velero Pod 状态为 Running,READY 为 1/1
Node Agent 运行 kubectl get pods -n velero -l app.kubernetes.io/name=node-agent 每个节点上有一个 Running 状态的 Pod
备份存储位置就绪 velero get backup-locations default 状态为 Available
CLI 版本匹配 velero version Client 和 Server 版本一致
RBAC 权限正确 kubectl auth can-i list backups -n velero --as=system:serviceaccount:velero:velero 返回 yes
常见安装问题:
  • 备份存储位置状态为 Unavailable:检查 MinIO 服务地址是否正确,以及 Secret 中的凭证是否匹配。使用 kubectl describe backupstoragelocation default -n velero 查看错误详情。
  • Velero Pod 启动失败:查看日志 kubectl logs -n velero deployment/velero,常见原因包括插件版本不兼容或存储后端连接超时。
  • CLI 无法连接集群:确认 kubeconfig 上下文正确,且当前用户有权限访问 velero 命名空间。

3.7 本章小结