【Kubernetes】Velero - K8s集群数据保护与容灾方案

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
相关推荐
A-刘晨阳16 小时前
K8S 之 DaemonSet
运维·云原生·容器·kubernetes·daemonset
切糕师学AI19 小时前
Kubernetes 中的 Volume(存储卷)
云原生·容器·kubernetes
ghostwritten21 小时前
worker01 NotReady 排查与修复步骤
云原生·kubernetes
zmjjdank1ng1 天前
创建 NodePort 类型的 Service
运维·kubernetes
努力搬砖的咸鱼2 天前
Kubernetes Service :ClusterIP、NodePort、LoadBalancer
微服务·云原生·容器·架构·kubernetes
文静小土豆2 天前
K8s Gateway API 全面指南:从入门到实践
kubernetes·gateway
only_Klein2 天前
Ansible自动化部署Kubernetes
kubernetes·自动化·ansible
还是转转2 天前
像 K8S 一样部署 EC2:Launch Template + Auto Scaling 实践
云原生·容器·kubernetes
zmjjdank1ng2 天前
Ingress理解
linux·运维·kubernetes