Velero 为企业提供可靠的Kubernetes集群备份与跨环境迁移方案。通过声明式备份、存储快照与一致性保障,实现应用数据的完整保护与灵活迁移。一起来看看如何使用吧!
1、Velero 是什么
1.1、简介
- Velero 是 Kubernetes 集群的备份和迁移工具,由 VMware 开发并开源
- 主要用于:灾难恢复、集群迁移、环境复制、备份与恢复
1.2、核心特点
- 资源备份:备份 Kubernetes 资源(YAML/JSON 格式)
- 卷快照:集成云厂商的卷快照功能(AWS EBS、GCP PD、Azure Managed Disks 等)
- 应用一致性:支持 pre/post 备份 hook 确保数据一致性
- 选择性备份:按命名空间、标签、资源类型过滤
- 计划备份:支持定时自动备份
- 集群迁移:跨集群恢复
1.3、 组件
- 服务端:运行在 K8s 集群中
- 客户端:一些运行在本地的命令行工具,需在已配置好 kubectl 及集群 kubeconfig 的机器上
**2、**Velero 与 ETCD 备份对比
|-----------|-----------------------|--------------------------|
| 维度 | Velero | ETCD |
| 主要用途 | 应用级备份恢复和迁移 | Kubernetes 集群的数据存储和键值数据库 |
| 备份粒度 | 按命名空间、资源、标签选择 | 全集群 etcd 快照 |
| 恢复级别 | 精细恢复(单个应用/资源) | 全集群恢复 |
| 跨集群能力 | 支持跨集群迁移 | 仅限本集群 |
| 存储位置 | 对象存储(S3、GCS 等) | 本地磁盘或 etcd 集群间复制 |
| 备份内容 | Kubernetes 资源 + 持久卷数据 | 所有 Kubernetes 状态(包括系统组件) |
| 易用性 | 用户友好,CLI 操作简单 | 需要更深的 K8s 运维知识 |
| 典型场景 | 应用迁移、环境复制、定期应用备份 | 集群灾难恢复、集群升级回滚 |
2.1、使用场景总结
2.1.1、使用 Velero 的场景
- 将应用从开发环境迁移到生产环境
- 备份特定业务应用(而非整个集群)
- 需要保留持久卷数据
- 多云环境下的应用迁移
- 日常应用备份(保留策略管理)
2.1.2、使用 etcd 备份的场景
- 整个集群的灾难恢复
- 集群升级前的全量备份
- 集群配置完全回滚
- 需要备份系统组件状态
3、安装 Velero
3.1、安装 CLI 工具
bash
# 下载包进行解压(具体使用版本可根据当前集群版本选择)
wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.0/velero-v1.10.0-linux-amd64.tar.gz
tar -zxvf velero-v1.10.0-linux-amd64.tar.gz
# 移入可执行目录
mv velero-v1.10.0-linux-amd64/velero /usr/local/bin/
# 验证安装
velero version
3.2、安装服务器端
3.2.1、使用 MinIO 进行存储
bash
# 编辑 velero-v1.10.0-linux-amd64/examples/minio/00-minio-deployment.yaml 文件
# 若需要持久化,需要修改 volume,修改后 kubectl apply -f 00-minio-deployment.yaml
----
apiVersion: v1
kind: Namespace
metadata:
name: velero
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
strategy:
type: Recreate
selector:
matchLabels:
component: minio
template:
metadata:
labels:
component: minio
spec:
volumes:
- name: storage # 若需持久化,需使用实际目录挂载
emptyDir: {}
- name: config
emptyDir: {}
containers:
- name: minio
image: minio/minio:latest
imagePullPolicy: IfNotPresent
args:
- server
- /storage
- --config-dir=/config
- --console-address # 添加
- ":30605" # 添加
env:
- name: MINIO_ACCESS_KEY # minio 用户名
value: "minio"
- name: MINIO_SECRET_KEY # minio 密码
value: "minio123"
ports:
- name: web
containerPort: 9000
- name: console # 添加
containerPort: 30605
volumeMounts:
- name: storage
mountPath: "/storage"
- name: config
mountPath: "/config"
---
apiVersion: v1
kind: Service
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
# ClusterIP is recommended for production environments.
# Change to NodePort if needed per documentation,
# but only if you run Minio in a test/trial environment, for example with Minikube.
type: NodePort # 修改
ports:
- name: web # 修改
port: 9000
targetPort: 9000
nodePort: 31900
protocol: TCP
- name: console # 添加
port: 30605
targetPort: 30605
nodePort: 30605
protocol: TCP
selector:
component: minio
---
apiVersion: batch/v1
kind: Job
metadata:
namespace: velero
name: minio-setup
labels:
component: minio
spec:
template:
metadata:
name: minio-setup
spec:
restartPolicy: OnFailure
volumes:
- name: config
emptyDir: {}
containers:
- name: mc
image: minio/mc:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "mc --config-dir=/config alias set velero http://minio:9000 minio minio123 && mc --config-dir=/config mb -p velero/velero"
volumeMounts:
- name: config
mountPath: "/config"
----
# 部署成功后,浏览器访问 http://x.x.x.x:31900,用户名账密:minio/minio123
3.2.2、部署客户端
bash
# 创建 velero-v1.10.0-linux-amd64/cred-velero 文件
vi velero-v1.10.0-linux-amd64/cred-velero
----
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
----
# 在目录 velero-v1.10.0-linux-amd64,执行下方命令
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket velero \
--secret-file ./cred-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc.cluster.local.:9000
# 验证安装,pod -> velero运行
kubectl get pods -n velero
velero backup location get
4、常见命令
bash
### 基本备份 ###
# 备份整个集群
velero backup create full-cluster-backup
# 备份特定命名空间
velero backup create nginx-backup --include-namespaces nginx
# 备份特定标签的资源
velero backup create app-backup --selector app=myapp
# 查看备份详情
velero backup describe <backup-name> --details
### 定时备份 ###
# 创建定期备份(每天凌晨2点)
velero schedule create daily-backup --schedule="0 2 * * *" --include-namespaces production
# 每小时备份特定命名空间
velero schedule create hourly-app --schedule="@hourly" --include-namespaces myapp
# 查看定时任务
velero schedule get
velero schedule describe daily-backup
### 恢复备份 ##
# 恢复整个备份
velero restore create --from-backup full-cluster-backup
# 恢复到不同命名空间
velero restore create --from-backup nginx-backup --namespace-mappings old-ns:new-ns
5、使用案例
5.1、例子1:备份指定命名空间
bash
### 例子1:备份指定命名空间 ###
# 备份命名空间 nginx-example 中的内容
velero backup create nginx-backup --include-namespaces nginx-example --wait
# 查看备份的 nginx-backup
velero backup describe nginx-backup
# 查看备份位置
velero backup-location get
# 查看备份文件
kubectl get backups.velero.io -n velero
# 恢复到原来的 nginx-example 命名空间
velero restore create --from-backup nginx-backup
# 恢复到新的 nginx-example-new 命名空间
velero restore create --from-backup nginx-backup --namespace-mappings nginx-example:nginx-example-new
5.2、例子2:在其他 k8s 集群中部署 velero 及恢复应用
bash
### 例子2:在其他 k8s 集群中部署 velero 及恢复应用 ###
# 在 A 集群节点上,其中 192.168.10.160 为 B 集群节点
scp -r velero-v1.11.0-linux-amd64 192.168.10.160:/root
# 在 B 集群节点上,安装 velero cli
cp velero-v1.11.0-linux-amd64/velero /usr/bin/
# 在 B 集群节点上,安装 velero 服务端,修改 minio 的连接地址为 A 集群访问的外部地址(s3Url=http://x.x.x.x:31900)
---
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket velero \
--secret-file ./cred-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://x.x.x.x:31900
---
# 在 B 集群节点上,查看备份位置/文件
velero backup-location get
kubectl get backups.velero.io -n velero
# 在 B 集群节点上,恢复应用
velero restore create --namespace velero --from-backup nginx-backup --wait