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
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 用户凭证:
- 创建 S3 存储桶: 例如
velero-backup-prod,区域选择与集群相近的 Region。 - 创建 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/*"
]
}
]
}
- 创建 IAM 用户: 附加上述策略,生成 Access Key ID 与 Secret Access Key。
- 创建 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(开发环境)。
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
apiGroups 和 resources 的权限。
3.5 验证配置:创建测试备份
安装完成后,执行一次手动备份以验证整个链路是否正常:
velero backup create test-backup --include-namespaces default
查看备份状态:
velero backup get
velero backup describe test-backup
若状态为 Completed,则说明 Velero 安装、对象存储配置、RBAC 权限均正确无误。
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 版本兼容。
--set-file 参数引用外部文件,或集成外部密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)。