Velero结合minio实现备份和恢复
velero介绍
Velero支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。
Velero的工作方式就是把kubernetes中的数据备份到对象存储以实现高可用和持久化,默认的备份保存时间为720小时,并在需要的时候进行下载和恢复。
Velero可以有针对性的备份,比如按照namespace单独备份、只备份单独的资源对象等,在恢复的时候只恢复单独的namespace或资源对象,而不影响其它namespace中pod运行服务。
velero支持ceph、oss等对象存储,etcd快照是一个为本地文件。
velero支持任务计划实现周期备份,但etcd快照也可以基于cronjob实现。
备份流程图
Velero客户端调用Kubernetes API Server创建Backup任务。
Backup控制器基于watch机制通过API Server获取到备份任务。
Backup控制器开始执行备份动作,其会通过请求API Server获取需要备份的数据。
Backup控制器将获取到的数据备份到指定的对象存储server端。
部署minio
创建minio数据目录
root@deploy:~# mkdir /data/minio -p
dockerhub镜像地址:
https://hub.docker.com/r/minio/minio
root@deploy:~# docker pull minio/minio:RELEASE.2022-04-12T06-55-35Z
创建minio容器,如果不指定,则默认使用用户名和密码为minioadmin/minioadmin,可以通过环境变量自定义,如下:
docker run --name minio \ -p 9000:9000 \ -p 9999:9999 \ -d --restart=always \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=12345678" \ -v /data/minio/data:/data \ minio/minio:RELEASE.2022-04-12T06-55-35Z server /data \ --console-address '0.0.0.0:9999'
查看启动日志:
root@deploy:~# docker logs -f minio API: http://172.17.0.2:9000 http://127.0.0.1:9000 Console: http://0.0.0.0:9999 Documentation: https://docs.min.io Finished loading IAM sub-system (took 0.0s of 0.0s to load data). You are running an older version of MinIO released 3 months ago Update: Run `mc admin update`
浏览器访问:http://ip:9999
创建存储桶
创建存储桶
输入存储桶名称
创建完成
master节点部署velero
部署velero客户端
下载velero客户端
https://github.com/vmware-tanzu/velero/releases
解压velero到/usr/local/bin
root@master1:/usr/local/src# tar xf velero-v1.8.1-linux-amd64.tar.gz root@master1:/usr/local/src# cd velero-v1.8.1-linux-amd64/ root@master1:/usr/local/src/velero-v1.8.1-linux-amd64# cp velero /usr/local/bin/
测试使用
root@master1:~# velero --help
部署velero服务端控制器
创建工作配置目录:
root@deploy:~# mkdir /data/velero -p root@deploy:~# cd /data/velero/
创建访问minio的认证文件
root@deploy:/data/velero# vim velero-auth.txt [default] aws_access_key_id = admin aws_secret_access_key = 12345678
准备user-csr文件:如果不创建,也可以直接使用k8s的config文件
root@deploy:/data/velero# vim awsuser-csr.json { "CN": "awsuser", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] }
创建namespace
master1:/data/velero# kubectl create ns velero-system
执行安装velero
velero --kubeconfig /root/.kube/config \ install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.3.1 \ --bucket velerodata \ --secret-file ./velero-auth.txt \ --use-volume-snapshots=false \ --namespace velero-system \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.100.16:9000
查看velero pod运行状态日志
root@master1:/data/velero# kubectl logs deployment/velero -n velero-system
stroage location 必须是valid有效的
使用velero进行备份
查看velero备份帮助
root@master1:/data/velero# velero backup --help Available Commands: create Create a backup delete Delete backups describe Describe backups download Download all Kubernetes manifests for a backup get Get backups logs Get backup logs
常用命令:
1、查看已经备份的资源
root@master1:/data/velero# velero backup get --kubeconfig=/root/.kube/config --namespace velero-system
2、创建备份所有资源
root@master1:/data/velero# velero backup create all-backup --kubeconfig=/root/.kube/config --namespace velero-system
3、为ns1,ns2命名空间下的资源备份
velero backup create <backupname> --include-namespaces ns1,ns2
4、排除掉ns1,ns2的命名空间,创建备份
velero backup create <backupname> --exclude-namespaces ns1,ns2
5、创建指定资源备份
--ordered-resources
velero backup create <backupname> --include-resources resource1,resource2 #备份pod、pvc和pv velero backup create pod-pvc-pv-backup --include-cluster-resources=true --ordered-resources 'pods=myserver/net-test1,default/nginx;persistentvolumeclaims=ns/name; persistentvolumes=ns/name' --namespace velero-system --include-namespaces=defafut
6、更改默认--ttl数据备份保留期限为2个月(默认720h,30天)
root@master1:/data/velero# velero backup create default-backup-${DATE} \ --include-cluster-resources=true \ --include-namespaces default \ --kubeconfig=/root/.kube/config \ --namespace velero-system \ --ttl=1440h
备份指定namespace
创建对default namespace进行备份,--kubeconfig指定k8s集群认证文件
root@master1:/data/velero# DATE=`date +%Y%m%d%H%M%S` root@master1:/data/velero# velero backup create default-backup-${DATE} \ --include-cluster-resources=true \ --include-namespaces default \ --kubeconfig=/root/.kube/config \ --namespace velero-system
查看备份结果
root@master1:/data/velero# velero backup describe default-backup-20220801144107 -n velero-system #或者指定kubeconfig文件 root@master1:/data/velero# velero backup describe default-backup-20220801144107 --kubeconfig=/root/.kube/config -n velero-system
minio验证备份
备份特定对象
指定备份某一个pod
root@master1:/data/velero# DATE=`date +%Y%m%d%H%M%S` root@master1:/data/velero# velero backup create pod-backup-${DATE} \ --include-cluster-resources=true \ --ordered-resources 'pods=default/nginx' \ --namespace velero-system \ --include-namespaces=default
查看minio存储桶
批量备份所有namespace
编写shell批量备份脚本
root@master1:/data/velero# vim backup-namespace.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 velero backup create ${i}-ns-backup-${DATE} \ --include-cluster-resources=true \ --include-namespaces ${i} \ --kubeconfig=/root/.kube/config \ --namespace velero-system done
执行备份
root@master1:/data/velero# sh backup-namespace.sh Backup request "default-ns-backup-20220802105427" submitted successfully. Run `velero backup describe default-ns-backup-20220802105427` or `velero backup logs default-ns-backup-20220802105427` for more details. Backup request "kube-node-lease-ns-backup-20220802105427" submitted successfully. Run `velero backup describe kube-node-lease-ns-backup-20220802105427` or `velero backup logs kube-node-lease-ns-backup-20220802105427` for more details. Backup request "kube-public-ns-backup-20220802105427" submitted successfully. Run `velero backup describe kube-public-ns-backup-20220802105427` or `velero backup logs kube-public-ns-backup-20220802105427` for more details. Backup request "kube-system-ns-backup-20220802105427" submitted successfully. Run `velero backup describe kube-system-ns-backup-20220802105427` or `velero backup logs kube-system-ns-backup-20220802105427` for more details. Backup request "kubernetes-dashboard-ns-backup-20220802105427" submitted successfully. Run `velero backup describe kubernetes-dashboard-ns-backup-20220802105427` or `velero backup logs kubernetes-dashboard-ns-backup-20220802105427` for more details.
查看备份结果
使用velero进行数据恢复
恢复指定namespace
恢复default namespace
oot@master1:~# kubectl get pods
删除deployment模拟故障
root@master1:/data/velero# kubectl delete deployments.apps web deployment.apps "web" deleted
velero创建恢复
root@master1:/data/velero# velero restore create --from-backup default-backup-20220802090722 --wait --kubeconfig=/root/.kube/config --namespace velero-system
恢复指定对象
删除pod模拟故障
root@master1:/data/velero# kubectl delete pods nginx
恢复nginx pods
root@master1:~# velero restore create --from-backup pod-backup-202207222335 --wait --kubeconfig=/root/.kube/config --namespace velero-system
验证数据pod恢复
验证pod访问
本文来自博客园,作者:PunchLinux,转载请注明原文链接:https://www.cnblogs.com/punchlinux/p/16543420.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示