• velero介绍
  • 环境安装
  • 备份与恢复
  • 专题备份恢复
  • 注意事项

velero介绍

· 什么是velero?

Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。

Velero 是一种云原生的Kubernetes优化方法,支持标准的K8S集群,既可以是私有云平台也可以是公有云。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。

Velero 目前包含以下特性

  • 支持 Kubernetes 集群数据备份和恢复
  • 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群(跨集群恢复)

Velero 组件分为是服务端和客户端

  • 服务端:运行在你 Kubernetes 的集群中
  • 客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上

支持备份存储方式


适用场景

  • 灾备场景:提供备份恢复k8s集群的能力
  • 迁移场景:提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)

· 它是怎么工作的?

简单的理解就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。

可以从官方文档查看可接收的对象存储,本地存储可以使用Minio。
k8s集群备份工具 - velero - 图1
k8s集群备份工具 - velero - 图2

备份过程:

  • 本地 Velero 客户端发送备份指令。
  • Kubernetes 集群内就会创建一个 Backup 对象。
  • BackupController 监测 Backup 对象并开始备份过程。
  • BackupController 会向 API Server 查询相关数据。
  • BackupController 将查询到的数据备份到远端的对象存储。

环境安装

安装当前velero环境需准备好:

  • 一个健康的k8s集群;
  • k8s集群里准备好storageClassName;
  • helm工具;

本文使用本地Minio作为备份文件的存储之所。

  • 安装minio
  • 安装velero

一、安装minio

此处用helm部署minio。
部署helm工具(略)。

1、创建命名空间

  1. kubectl create ns velero

2、部署minio pvc
vim minio-pvc.yaml

  1. ---
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5. name: minio-pvc
  6. namespace: velero
  7. spec:
  8. accessModes:
  9. - ReadWriteMany
  10. resources:
  11. requests:
  12. storage: 10Gi
  13. storageClassName: nfs
  14. volumeMode: Filesystem

kubectl apply -f minio-pvc.yaml

3、部署minio

百度网盘下载minio-5.0.5.tgz:
链接:https://pan.baidu.com/s/1odBJO2Fk5LfjZ63hLPOFvQ
提取码:eu3u

  1. tar -xvf minio-5.0.5.tgz
  2. cd minio
  3. # 执行创建minio命令:
  4. helm install velero-minio \
  5. --set service.enabled=true \
  6. --set persistence.enabled=true \
  7. --set persistence.existingClaim=minio-pvc \
  8. --set open.MINIO_ACCESS_KEY=minio \
  9. --set open.MINIO_SECRET_KEY=minio123 \
  10. --set accessKey=minio \
  11. --set secretKey=minio123 \
  12. --set ingress.enabled=true \
  13. --set image.tag=RELEASE.2021-02-14T04-01-33Z \
  14. --set service.type=NodePort \
  15. --set service.nodePort=32005 \
  16. --namespace velero .
  17. helm list -n velero

4、部署Minio job
vim minio-job.yaml

  1. ---
  2. apiVersion: batch/v1
  3. kind: Job
  4. metadata:
  5. namespace: velero
  6. name: minio-setup
  7. labels:
  8. component: minio-setup
  9. spec:
  10. template:
  11. metadata:
  12. name: minio-setup
  13. spec:
  14. restartPolicy: OnFailure
  15. volumes:
  16. - name: config
  17. persistentVolumeClaim:
  18. claimName: minio-job-config
  19. containers:
  20. - name: mc
  21. image: minio/mc:latest
  22. imagePullPolicy: IfNotPresent
  23. command:
  24. - /bin/sh
  25. - -c
  26. - "mc --config-dir=/config config host add velero http://velero-minio:9000 minio minio123 && mc --config-dir=/config mb -p velero/velero"
  27. volumeMounts:
  28. - name: config
  29. mountPath: "/config"

kubectl apply -f minio-job.yaml
kubec get pods,svc -n velero

浏览器登录minio:
http://nodeIp:port,我此处为[http://192.168.255.120:32005](http://192.168.255.120:32005)
用户名密码为:minio/minio123
查看velero/velero的bucket

image.png

二、安装velero

百度网盘下载velero-v1.8.1-linux-amd64.tar.gz:
链接:https://pan.baidu.com/s/1VTePgx6rjemP3qy84RfA5g
提取码:rv4o

1、安装velero客户端

  1. tar -zxvf velero-v1.8.1-linux-amd64.tar.gz
  2. mv velero /usr//local/bin/

2、创建velero登录minio的密钥

  1. cat > credentials-velero <<EOF
  2. [default]
  3. aws_access_key_id = minio
  4. aws_secret_access_key = minio123
  5. EOF

3、安装velero服务端

  1. # 启用快速补全
  2. velero completion bash
  3. velero install \
  4. --provider aws \
  5. --plugins velero/velero-plugin-for-aws:v1.0.0 \
  6. --bucket velero \
  7. --secret-file ./credentials-velero \
  8. --use-volume-snapshots=false \
  9. --use-restic \
  10. --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://velero-minio:9000
  11. # 如果s3Url=http://velero-minio:9000不通,就换成s3Url=http://nodeIP:port模式
  12. kubectl get crds -l component=velero
  13. kubectl api-versions | grep velero
  14. kubectl get pod -n velero

附:卸载velero
会把velero命名空间及其所有资源删除。

  1. velero uninstall

至此,velero环境安装全部完成。

三、velero常用命令

  1. $ velero create backup NAME [flags]
  2. # 剔除 namespace
  3. --exclude-namespaces stringArray namespaces to exclude from the backup
  4. # 剔除资源类型
  5. --exclude-resources stringArray resources to exclude from the backup, formatted as resource.group, such as storageclasses.storage.k8s.io
  6. # 包含集群资源类型
  7. --include-cluster-resources optionalBool[=true] include cluster-scoped resources in the backup
  8. # 包含 namespace
  9. --include-namespaces stringArray namespaces to include in the backup (use '*' for all namespaces) (default *)
  10. # 包含 namespace 资源类型
  11. --include-resources stringArray resources to include in the backup, formatted as resource.group, such as storageclasses.storage.k8s.io (use '*' for all resources)
  12. # 给这个备份加上标签
  13. --labels mapStringString labels to apply to the backup
  14. -o, --output string Output display format. For create commands, display the object but do not send it to the server. Valid formats are 'table', 'json', and 'yaml'. 'table' is not valid for the install command.
  15. # 对指定标签的资源进行备份
  16. -l, --selector labelSelector only back up resources matching this label selector (default <none>)
  17. # 对 PV 创建快照
  18. --snapshot-volumes optionalBool[=true] take snapshots of PersistentVolumes as part of the backup
  19. # 指定备份的位置
  20. --storage-location string location in which to store the backup
  21. # 备份数据多久删掉
  22. --ttl duration how long before the backup can be garbage collected (default 720h0m0s)
  23. # 指定快照的位置,也就是哪一个公有云驱动
  24. --volume-snapshot-locations strings list of locations (at most one per provider) where volume snapshots should be stored
  25. # 删除某个备份
  26. velero backup delete backupName Delete velero resources
  27. # 查看某个备份
  28. velero backup describe backupName

备份恢复测试

velero非常的人性化,在安装包中已经为我们准备好了测试demo,我们可以利用测试demo来进行测试验证。

1、创建测试应用

  1. [root@master1 velero-v1.8.1-linux-amd64]# ls
  2. credentials-velero examples LICENSE minio minio-job.yaml minio-pvc.yaml velero
  3. [root@master1 velero-v1.8.1-linux-amd64]#
  4. [root@master1 velero-v1.8.1-linux-amd64]# kubectl apply -f examples/nginx-app/base.yaml

2、执行备份

  1. [root@master1 velero-v1.8.1-linux-amd64]# velero backup create nginx-backup --include-namespaces nginx-example
  2. Backup request "nginx-backup" submitted successfully.
  3. Run `velero backup describe nginx-backup` or `velero backup logs nginx-backup` for more details.
  4. [root@master velero-v1.4.2-linux-amd64]# velero backup describe nginx-backup
  5. Name: nginx-backup
  6. ···

3、查看备份信息

登录Minio查看备份结果。

  • backups是备份目录,restores是恢复日志及结果的目录。

image.png
image.png

4、恢复

  1. # 删除nginx服务
  2. kubectl delete -f examples/nginx-app/base.yaml
  3. # 等一会儿恢复服务
  4. velero restore create --from-backup nginx-backup --wait
  5. # 查看恢复结果
  6. kubectl get pods,svc -n nginx-example

专题备份恢复

一、针对有pvc数据的服务备份恢复

velero普通的备份恢复,只是把集群资源所有yaml文件整合下来存到对象存储中,并没有对 pvc 里的数据进行备份。
如果在云厂商环境,可以部署 VolumeSnapshotLocation CRD 来给 PV 做快照,需要云提供商提供对插件(aws gcp azure) 的支持。
私有云环境,可以通过专门的备份工具 Restic(安装velero时需要自定义选项—use-restic)。

  1. Restic 是一款 GO 语言开发的数据加密备份工具,顾名思义,可以将本地数据加密后传输到指定的仓库。
  2. 支持的仓库有 LocalSFTPAws S3MinioOpenStack SwiftBackblaze B2Azure BS
  3. Google Cloud storageRest Server
  4. 项目地址:https://github.com/restic/restic

本文中,我们将使用 Restic 来对 PV 进行备份,不过现阶段通过 Restic 备份会有一些限制。

  • 不支持备份 hostPath
  • 备份数据标志只能通过 Pod 来识别
  • 单线程操作大量文件比较慢

二、备份恢复指定命名空间

备份恢复测试 部分。

三、备份恢复整个集群

四、跨集群恢复服务、命名空间

五、在云厂商/公有云环境备份恢复

六、定时备份

注意事项

  1. 在velero备份的时候,备份过程中创建的对象是不会被备份的。
  2. velero restore 恢复不会覆盖已有的资源,只恢复当前集群中不存在的资源。已有的资源不会回滚到之前的版本,如需要回滚,需在restore之前提前删除现有的资源。
  3. 后期可以讲velero作为一个crontjob来运行,定期备份数据。