使用Velero备份、恢复的备份、恢复、迁移K8S集群上的资源

开源地址:GitHub - vmware-tanzu/velero: Backup and migrate Kubernetes applications and their persistent volumes

https://github.com/vmware-tanzu/velero
官网:https://velero.io/

Velero 的基本原理就是将Kubernetes 集群资源对象数据备份到对象存储中,并能从对象存储中拉取备份数据来恢复集群资源对象数据。不同于etcd 备份——将集群的全部资源备份起来——Velero 是对Kubernetes 集群内资源对象级别进行备份,可以通过对Type、Namespace、Label等对象进行分类备份或者恢复。


使用Velero备份k8S资源到Minio,阿里云oss,七牛云Kodo等对象储存(S3或兼容S3储存)

  • 备份集群并在丢失时进行恢复

  • 将集群资源迁移到其他集群。(将生产集群复制到开发和测试集群)

    直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。
    除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label、Pod
    等对象进行分类备份或者恢复。

velero备份流程

velero客户端调用kubernetes API Server创建backup任务
Backup控制器基于watch机制通过Api Server获取到备份任务
Backup控制器开始执行备份动作,会通过请求Api Server获取到需要备份的数据
Backup 控制器将获取到的数据备份到指定的对象存储server端

恢复工作流程

当你运行时 velero restore create:
Velero 客户端调用 Kubernetes API 服务器来创建一个 Restore 对象。
RestoreController 通知新的 Restore 对象并执行验证。
从对象存储服务中 RestoreController 获取备份信息。然后它对备份的资源进行一些预处理,以确保这些资源可以在新集群上运行。例如,使用 备份的 API 版本来验证还原资源是否可以在目标集群上运行。
RestoreController 启动还原过程,一次还原每个符合条件的资源。
默认情况下,Velero 执行非破坏性恢复,这意味着它不会删除目标集群上的任何数据。如果备份中的资源已存在于目标集群中,Velero 将跳过该资源。您可以将 Velero 配置为使用更新策略,而不是使用
–existing-resource-policy 恢复标志。当此标志设置为 时 update,Velero 将尝试更新目标集群中的现有资源以匹配备份中的资源。

部署Minio 存储

# 使用docker 部署minio
docker run -p 9000:9000 -p 9090:9090 --name minio -d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=Lahmy1c!" \
-e MINIO_JAVA_OPTS="-Xms2g -Xmx4g" \
-v /home/minio/data:/data minio/minio server /data \
--console-address ":9090" --address ":9000"



在K8S master-01 安装 velero 客户端

wget https://mirror.ghproxy.com/https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz
tar -zxvf  velero-v1.14.0-linux-amd64.tar.gz
cp velero-v1.14.0-linux-amd64/velero /usr/local/bin/
velero version

创建velero 使用minio的密钥

[root@k8s-master-01 ~]# cat >>credentials-velero <EOF
[default]
aws_access_key_id = admin
aws_secret_access_key = Lahmy1c!
EOF

在K8S中安装 velero服务器端


velero install \
  --image registry.aliyuncs.com/elvin/velero:v1.14.0 \
  --plugins registry.aliyuncs.com/elvin/velero-plugin-for-aws:v1.9.2 \
  --provider aws \
  --bucket velero \
  --use-volume-snapshots=false \
  --secret-file /root/credentials-velero \
  --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.61.233:9000
                 

备份k8s test 命名空间

velero backup create data-backup --include-namespaces test -n velero


删除test命名空间,并且恢复

kubectl delete ns test
#恢复
velero restore  create --from-backup backup-test  --wait


定时任务自动备份
[root@k8s-master-01 ~]# cat velero-k8s-backup.sh 
#!/bin/bash
NS_NAME=$(kubectl get ns |awk '{if(NR>1){print $1}}') 
DATE=$(date +%Y%m%d%H%M%S)
cd /data/velero/

for i in $NS_NAME;do
  /usr/local/bin/velero backup create ${i}-ns-backup-${DATE} \
  --include-cluster-resources=true \
  --include-namespaces ${i} \
  --kubeconfig=/root/.kube/config \
  --namespace velero-system
done


crontab -u root -e

*/5 * * * * /usr/bin/bash /data/velero/velero-k8s-backup.sh  >> /data/velero/velero-k8s-backup.log 2>&1  #每五分钟备份一次

备份恢复

[root@k8s-master-01 ~]# velero restore create --from-backup myserver-backup-20240724202021 --wait --kubeconfig=/root/.kube/config --namespace velero-system
Restore request "myserver-backup-20240724202021-20240724203424" submitted successfully.

velero --kubeconfig /root/.kube/config uninstall --namespace velero-system
You are about to uninstall Velero.
Are you sure you want to continue (Y/N)? y
Waiting for velero namespace "velero-system" to be deleted

备份命令:velero create backup NAME [flags]
backup选项:

--exclude-namespaces stringArray : 要从备份中排除的名称空间
--exclude-resources stringArray: 要从备份中排除的资源,如storageclasses.storage.k8s.io
--include-cluster-resources optionalBool[=true]: 包含集群资源类型
--include-namespaces stringArray: 要包含在备份中的名称空间(默认'*')
--include-resources stringArray: 备份中要包括的资源
--labels mapStringString: 给这个备份加上标签
-o, --output string: 指定输出格式,支持'table'、'json'和'yaml';
-l, --selector labelSelector: 对指定标签的资源进行备份
--snapshot-volumes optionalBool[=true]: 对 PV 创建快照
--storage-location string: 指定备份的位置
--ttl duration: 备份数据多久删掉
--volume-snapshot-locations strings: 指定快照的位置,也就是哪一个公有云驱动
posted @ 2024-07-23 18:31  一毛丶丶  阅读(277)  评论(0编辑  收藏  举报