文档 · 2024年3月19日 0

Velero-k8s资源备份还原工具

一、安装

1.1 环境

  • k8s:rke 1.26.6
  • velero:1.9.1

1.2 资源包

velero:https://github.com/vmware-tanzu/velero/releases/tag/v1.9.1

1.3 步骤

1.3.1 安装minio对象存储

  1. 下载velero安装包,上传到可以使用kubectl的节点
  2. 解压
    tar xf velero-v1.9.1-linux-amd64.tar.gz
    
  3. 安装对象存储minio,在k8s集群内安装,yaml文件在velero的examples文件夹下
    kubectl apply -f velero-v1.9.1-linux-amd64/examples/minio/00-minio-deployment.yaml
    

安装完成会有两个pod,一个svc,如下:

[root@master98 velero]# k get po -n velero 
NAME                      READY   STATUS      RESTARTS   AGE
minio-8649b94fb5-br9rk    1/1     Running     0          21m
minio-setup-gfdgd         0/1     Completed   1          21m

要想访问minio web控制界面,可以查看minio pod 的日志,会有一个动态的端口。再创建一个nodeport将该端口放出来即可。

[root@master98 ~]# k logs -n velero minio-7f46d5bc87-l96bb 
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
         Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
API: http://10.42.1.144:9000  http://127.0.0.1:9000 

Console: http://10.42.1.144:35051 http://127.0.0.1:35051 

Documentation: https://docs.min.io

WARNING: Console endpoint is listening on a dynamic port (35051), please use --console-address ":PORT" to choose a static port.

 You are running an older version of MinIO released 2 years ago 
 Update: 
Run `mc admin update` 

[root@master98 ~]# cat minio-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:
  namespace: velero
  name: minio-nodeport
  labels:
    component: minio
spec:
  type: NodePort
  ports:
    - port: 35051
      targetPort: 35051
      protocol: TCP
  selector:
    component: minio

也可以在安装时通过 –console-address “:PORT” 命令去指定控制端口,但目前指定了暂未生效。

1.3.2 安装velero

  1. 创建minio访问文件,存放账密,用于velero访问minio。
    cat credentials-velero
    
    [default]
    aws_access_key_id=minio
    aws_secret_access_key=minio123
    
  2. 安装velero,生成yaml。 内网可以自己改镜像,修改restic pod定义中的hostPath。原因是restic pod中需要配置宿主机kubelet pods路径,默认/var/lib/kubelet/pods,如果kubelet实际安装的不是该路径,则需要修改。
    velero install    \
    --image velero/velero:v1.9.1 \
    --plugins velero/velero-plugin-for-aws:v1.5.0 \
    --provider aws   \
    --bucket velero   \
    --namespace velero  \
    --secret-file ./credentials-velero  \
    --velero-pod-cpu-request 200m   \
    --velero-pod-mem-request 200Mi   \
    --velero-pod-cpu-limit 1000m  \
    --velero-pod-mem-limit 1000Mi   \
    --use-volume-snapshots=false   \
    --use-restic   \
    --restic-pod-cpu-request 200m   \
    --restic-pod-mem-request 200Mi   \
    --restic-pod-cpu-limit 1000m  \
    --restic-pod-mem-limit 1000Mi  \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000 \
    --dry-run -o yaml > velero.yaml
    
  3. 创建资源
    kubectl apply -f velero.yaml
    

安装完成后出现restic、velero两个pod可以正常running,如下:

[root@master98 velero-v1.9.1-linux-amd64]# k get po -n velero 
NAME                      READY   STATUS      RESTARTS   AGE
minio-8649b94fb5-br9rk    1/1     Running     0          31m
minio-setup-gfdgd         0/1     Completed   1          31m
restic-mnp7r              1/1     Running     0          26m
velero-564df46b89-lqrcm   1/1     Running     0          26m

可以查看pod日志,看是否正常启动。

1.3.3 自定义存储位置

获取安装好的crd

[root@node-131 ~]# k get crd
NAME                                          CREATED AT
alertmanagers.monitoring.coreos.com           2021-07-14T15:23:57Z
backups.velero.io                             2023-10-30T02:52:13Z
backupstoragelocations.velero.io              2023-10-30T02:52:13Z
bgpconfigurations.crd.projectcalico.org       2021-07-14T15:14:52Z
bgppeers.crd.projectcalico.org                2021-07-14T15:14:52Z
blockaffinities.crd.projectcalico.org         2021-07-14T15:14:52Z
clusterinformations.crd.projectcalico.org     2021-07-14T15:14:52Z
deletebackuprequests.velero.io                2023-10-30T02:52:13Z

可以看到backupstoragelocations资源,使用如下可以直接编辑

[root@node-131 ~]# k edit backupstoragelocations.velero.io -n velero

...
spec:
  config:
    region: minio
    s3ForcePathStyle: "true"
    s3Url: http://minio.velero.svc:9000
  default: true
  objectStorage:
    bucket: velero
  provider: aws
...

修改 s3Url 字段即可

1.4 问题总结

1.4.1 使用velero v1.11.1安装会报

An error occurred: unknown flag: --use-restic

尝试解决: velero安装命令去掉该参数。

velero修改velero的deployment参数,注释掉相关参数。

**后续问题:**velero pod无法正常启动,查看日志报如下:

Waited for 1.04571947s due to client-side throttling, not priority and fairness, request: GET:https://10.43.0.1:443/apis/coordination.k8s.io/v1?timeout=32s
An error occurred: [custom resource ResticRepository not found in Velero API group velero.io/v1, Velero custom resources not found - apply examples/common/00-prereqs.yaml to update the custom resource definitions]

**再次尝试解决:**怀疑是版本问题,导致使用不同的参数,所以换velero版本到1.9.1,成功running!

二、使用

2.1 单次备份

2.1.1 备份k8s基础资源(不包括持久卷)

单次备份执行以下命令

velero backup create <backupName>

该命令会默认备份集群所有资源(持久卷不会备份),如果需要备份指定namespace下的资源,则可以加–include-namespaces参数,例如

velero backup create <backupName> --include-namespaces ns1,ns2

其他参数如下:

  • –include-namespaces:备份该命名空间下的所有资源,不包括集群资源。
  • –include-resources:要备份的资源类型。
  • –include-cluster-resources:是否备份集群资源此选项可以具有三个可能的值: true:包括所有群集范围的资源; false:不包括群集范围内的资源; nil (“自动”或不提供)

备份或还原所有命名空间时,将包括集群范围的资源,默认值:true;
使用命名空间过滤时,不包括集群范围的资源,默认值:false;

有些特定的命名空间下的资源(例如PV),在备份pvc时仍会触发备份PV操作,除非使用–include-cluster-resources=false指明不备份集群资源

–selector:通过标签选择匹配的资源备份

命名执行后,客户端会将备份任务提交给服务端执行,可通过下面命令查看任务状态

velero backup get

备份有效期默认是30天,到期自动删除,可以通过参数–ttl指定。如果需要手动删除,则执行命令

velero backup delete <backupName>

如果当前备份任务正在执行,删除操作不会立即执行,它会等到任务结束(无论成功或失败)才会执行。如果在测试阶段需要立即停止任务,则可以执行以下命令,但该命令不会删除在Minio中已经备份好的部分数据,需要手动删除

kubectl delete backup <backupName> -n velero

其他备份参数可执行–help命令查看

2.1.2 备份持久卷

Velero持久卷备份有两种模式:opt-in和opt-out

  1. opt-out就是默认备份所有持久卷,对于不要备份需要指明
  2. opt-in就是默认不备份任何持久卷,对于要备份的需要指明

这里主要介绍常用的opt-in模式,opt-out模式参考https://link.zhihu.com/?target=https%3A//velero.io/docs/v1.9/restic/%23backup 官方文档,使用方法类似。

首先对需要备份的持久卷对应的pod添加annotation

kubectl -n <namespace> annotate pod/<pod> backup.velero.io/backup-volumes=<volume_name1>,<volume_name2>

然后执行备份命令即可

velero backup create <backupName>

2.2 周期备份

Velero提供周期备份的命令,参数与单次备份基本一致,这里不再赘述,详细参数可通过–help查看。

velero schedule create <backupName> --schedule="0 */12 * * *"

2.3 灾难恢复

  1. 将备份存储位置更新为只读模式(这可以防止在还原过程中在备份存储中创建或删除备份对象)
    kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
        --namespace velero \
        --type merge \
        --patch '{"spec":{"accessMode":"ReadOnly"}}'
    
  2. 使用最新的Velero备份还原还原数据:
    velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
    
  3. 还原任务完成后,将备份位置修改为读写模式
    kubectl patch backupstoragelocation <STORAGE LOCATION NAME> \
       --namespace velero \
       --type merge \
       --patch '{"spec":{"accessMode":"ReadWrite"}}'
    

2.4 集群迁移

2.4.1 前提条件

将每个velero实例指向相同的对象存储

2.4.2 步骤

  1. 集群1 创建备份
    velero backup create <BACKUP-NAME>
    
  2. 集群2 使用和配置BackupStorageLocationsVolumeSnapshotLocations指向集群1使用的minio位置,并将使用模式配置为只读,可在创建存储位置时以--access-mode=ReadOnly参数指定模式。
  3. 集群2 确保已在集群1创建Velero Backup对象,Velero资源与云存储中的备份文件已同步。
    velero backup describe <BACKUP-NAME>
    
  4. 集群2 确认<BACKUP-NAME>的备份存在且任务执行完成后,就可以使用以下方法还原所有内容:
    velero restore create --from-backup <BACKUP-NAME>
    
  5. 验证迁移结果检查集群2的还原任务是否完成
    velero restore get
    velero restore describe <RESTORE-NAME-FROM-GET-COMMAND>
    

三、卸载

执行以下命令卸载velero

注意:如果minio也在velero名称空间下,会把minio也删掉!

kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero 转载来自:

Velero-k8s资源备份还原工具

打赏