基于Velero的K8s集群备份恢复方案

科技   2024-10-21 07:31   广东  
‍‍近期刚好在工作中用到了Velero来进行集群的备份恢复操作,因此花时间整理了一个文档,有需要的读者可以参考下。

一. 什么是Velero

Velero(原名 Heptio Ark)是一个开源的 Kubernetes 备份与恢复工具,支持对整个集群或选定资源进行备份、恢复,以及在不同 Kubernetes 集群之间迁移资源。
它是由 VMware 开发的,现已成为 CNCF(Cloud Native Computing Foundation)的成员。
Velero 的主要功能包括:
  • 集群备份:Velero 允许您对 Kubernetes 集群中的所有资源(如 Deployment、Service、ConfigMap 等)以及数据卷(PVC)进行备份。您可以执行一次性备份,或通过定期任务实现自动备份,确保集群始终有最新的可用备份。
  • 灾难恢复:如果集群由于硬件故障、系统崩溃或误操作而丢失数据或配置,Velero 可以快速恢复之前备份的资源和数据,减少宕机时间和业务损失。
  • 数据迁移:Velero 可以在不同的 Kubernetes 集群之间迁移资源和数据。例如,您可以将开发环境中的工作负载迁移到生产环境,或者将工作负载从一个云服务商迁移到另一个云服务商。这使得多集群环境下的工作负载迁移更加轻松。
二. 安装Minio
MinIO 是一个高性能的开源对象存储解决方案,主要用于处理大规模数据存储。它与 Amazon S3 兼容,使其成为 S3 兼容的云存储服务的一个轻量级替代品。
在本案例中,我们使用minio来保存Velero备份后的数据。
1. 创建velero的命名空间
$ kubectl create ns velero
2. 创建存储卷
此处使用NFS格式的存储卷,读者可根据实际环境自行修改PersistentVolume配置。
资源清单文件:
# storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: velero-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.10    #按实际环境为修改 
    path: /velero-backups/k8s-dev  #按实际环境为修改
    readOnly: false
  persistentVolumeReclaimPolicy: Retain
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: velero-pvc
  namespace: velero
spec:
  storageClassName: ""
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  volumeName: velero-pv
执行创建
$ kubectl create -f storage.yaml
3. 安装minio
资源清单文件:
# minio.yaml
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
        persistentVolumeClaim:
          claimName: velero-pvc
      - name: config
        emptyDir: {}
      containers:
      - name: minio
        image: minio/minio:RELEASE.2023-03-20T20-16-18Z
        imagePullPolicy: IfNotPresent
        args:
        - server
        - /data
        - --config-dir=/config
        - --console-address=:9001
        env:
        - name: MINIO_ROOT_USER
          value: "admin"
        - name: MINIO_ROOT_PASSWORD
          value: "minio123"
        ports:
        - containerPort: 9000
        - containerPort: 9001
        volumeMounts:
        - name: storage
          mountPath: /data
        - name: config
          mountPath: "/config"
        resources:
          limits:
            cpu: "2"
            memory: 4Gi
          requests:
            cpu: "0.5"
            memory: 0.5Gi
---
apiVersion: v1
kind: Service
metadata:
  namespace: velero
  name: minio
  labels:
    component: minio
spec:
  type: LoadBalancer # 对于不支持LoadBalancer的环境,可使用Nodeport。
  ports:
  - name: port-9000
    port: 9000
    protocol: TCP
    targetPort: 9000
  - name: console
    port: 9001
    protocol: TCP
    targetPort: 9001
  selector:
    component: minio
执行创建
$ kubectl create -f minio.yaml
4. 创建Bucket
部署完成后,打开minio控制台登录,本示例中使用账号密码为:
账号:admin
密码:minio123
登录完成后,创建名为velero的Bucket(存储桶)。

三. 部署Velero

在部署Velero前需要注意,Velero与k8s集群有兼容性要求,因此需要选择与集群相对应的Velero版本。

Velero version
Expected Kubernetes version compatibility
Tested on Kubernetes version
1.14
1.18-latest
1.27.9, 1.28.9, and 1.29.4
1.13
1.18-latest
1.26.5, 1.27.3, 1.27.8, and 1.28.3
1.12
1.18-latest
1.25.7, 1.26.5, 1.26.7, and 1.27.3
1.11
1.18-latest
1.23.10, 1.24.9, 1.25.5, and 1.26.1
1.1
1.18-latest
1.22.5, 1.23.8, 1.24.6 and 1.25.1
1. 安装Velero客户端
下载二进制文件
版本 :velero-v1.10.3-linux-amd64.tar.gz
项目地址:https://github.com/vmware-tanzu/velero
下载链接:https://github.com/vmware-tanzu/velero/releases/download/v1.12.4/velero-v1.12.4-linux-amd64.tar.gz
解压安装
$ tar xvf velero-v1.12.4-linux-amd64.tar.gz
$ mv velero-v1.12.4-linux-amd64/velero /usr/bin/
$ chmod +x /usr/bin/velero
验证客户端
$ velero version
Client:
    Version: v1.12.4
    Git commit: 7d8417b2c58792422ed6dd4b4c0cf3848b0beb56
2. 创建密钥文件
创建velero访问对象存储的密钥文件,名称为credentials-velero。相关id和key为minio的账号密码。
# credentials-velero
[default]
aws_access_key_id = admin
aws_secret_access_key = minio123
3. 安装velero服务端
velero install \
    # 指定存储提供商,minio用的是s3,所以这里是aws
    --provider aws \
    # 指定aws插件
    --plugins velero/velero-plugin-for-aws:v1.8.2 \
    # 指定velero镜像
    --image velero/velero:v1.12.4 \
    # 指定命名空间
    --namespace velero \
    # 指定bucket名称
    --bucket velero \
    # 默认以文件系统方式备份持久化卷
    --default-volumes-to-fs-backup \
    # 禁用卷快照功能
    --use-volume-snapshots=false \
    # 指定S3存储桶凭证
    --secret-file ./credentials-velero \
    # 启用node agent 用于文件系统的备份/恢复操作 (可选)
    --use-node-agent \
    # 配置备份存储位置的详细信息,填写minio的api地址。
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000
velero-plugin-for-aws插件版本需要兼容velero版本,如下表所示:
查看部署情况,已正常运行。
$ kubectl get pod -n velero
NAME                      READY   STATUS    RESTARTS   AGE
minio-6d47959c59-9s5z6    1/1     Running   0          6h32m
node-agent-c7lql          1/1     Running   0          6h11m
node-agent-fh5jt          1/1     Running   0          6h11m
node-agent-gvd5l          1/1     Running   0          6h11mvelero-5cc44ff6c7-hb8gn   1/1     Running   0          6h11m
四. 备份/恢复操作
1. 备份数据
Velero可对整个集群的数据进行备份,也可以针对特定命名空间和资源进行备份,方式很灵活。
备份整个集群
velero backup create k8s-dev-backup 
注:命令不指定Namespace和资源的情况下,将备份整个集群的所有资源。
备份指定的命名空间
以default命名空间为例,命令如下:
$ velero backup create default-backup --include-namespaces default 
备份指定的资源
以deployment资源为例,命令如下:
$ velero backup create deployment-backup --include-resources deployment

备份挂载卷数据

默认情况下,Velero不会备份Pod挂载的PVC卷数据。如果需要进行存储卷备份,需要安装node agent,并在对应的Pod按添加注释:

$ kubectl annotate pod <pod_name> backup.velero.io/backup-volumes=<volume_name>

2. 恢复数据

Velero默认情况下不会对现有资源进行修改,如果目标集群中资源已经存在,则在恢复过程中会跳过该资源。但对于SA(Service Accounts)资源除外,此时Velero 会尝试将备份内容与目标集群中的SA资源进行差异合并。

集群级别恢复

$ velero restore create --from-backup k8s-dev-backup 

命名空间恢复

$ velero restore create --from-backup k8s-dev-backup --include-namespaces default

恢复某个类型的资源

$ velero restore create --from-backup k8s-dev-backup  --include-namespaces default --include-resources persistentvolumeclaims,persistentvolumes

3. 设置定时备份任务

当搭建好Velero后,可以配置定时任务,这样即可以每天自动进行备份。

$ velero schedule create k8s-dev --schedule="0 1 * * *"  --exclude-resources pods --ttl 240h


全文结束,如果觉得有收获,可以随手点个“赞”或者“在看”,也欢迎分享文章到朋友圈和技术群。

推荐专栏

------------------ END ------------------

关注公众号,获取更多精彩内容

DevOps实战派
DevOps、SRE和运维领域资深技术老鸟;公众号主要分享相关领域的专业知识。
 最新文章