K8s:velero备份数据与集群迁移
velero
学习视频:
https://www.bilibili.com/video/BV1Ur4y1J7oo/
https://www.bilibili.com/video/BV1HTMMzFEuS
学习资料
https://blog.csdn.net/Richardlygo/article/details/142255544
架构图


1、作用
1、备份还原k8s资源
2、迁移k8s集群
velero跟etcd的快照备份区别:
1、etcd整库备份、一旦出问题、就所有恢复、会影响别的库。
2、velero可以分库备份、比如按照namespace级别备份、十个namespace分开备份、业务出现问题单独恢复、存档到ceph或者oss
3、一个经过APIserver、一个直接对ETCD集群备份。
4、velero需要保证集群正常运行、etcd不需要经过k8s集群。
2、velero架构组件
客户端:就是velero客户端工具经过kubeconfig认证后调用APIserver、然后使用Controller控制器备份。
服务端:以pod方式运行、Controller控制器(Backup Controller)
插件:(存储:OSS 、S3 )
3、备份流程原理

备份还原流程讲解:

4、部署velero环境安装
1、客户端:k8s集群:10.0.0.200(部署velero客户端工具和服务端pod)
2、服务端:部署两个控制器、Backup Controller和Restore Controller(pod方式运行)
3、存储插件:minio集群:10.0.0.202(部署mimio存储工具、部署在集群外部、保证高可用状态)
velero下载地址:github:https://github.com/vmware-tanzu/velero/releases
国内代理地址:https://githubfast.com/vmware-tanzu/velero/releases
1、部署velero客户端工具
1、从github下载工具后、然后安装
解压缩
放到PATH路径、/usr/loacl/bin/
2、可以设置velero补全命令、方便学习
echo "source <(velero completion bash)" >> ~/.bashrc;exit
sudo velero completion bash > /etc/bash_completion.d/velero
2、部署minio
#支持对接的存储插件地址:
https://velero.io/docs/main/supported-providers/
#1、使用docker部署minio
docker pull minio/minio:RELEASE.2022-04-12T06-55-35Z
mkdir -p /data/minio
docker run -d \
-p 9000:9000 \
-p 9999:9999 \
--name minio \
--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'
#2、部署后操作
1、创建一个Buckets桶(大的文件夹)
2、创建一个授权用户、velero客户端工具执行minio操作的权限。
#3、在velero节点创建一个授权文件、写入minio创建的授权用户的key
cat > credentials-velero <<EOF
[default]
aws_access_key_id = l0zJVkghYjMiWxETjL6k
aws_secret_access_key = R5XMKeQijXdVKYOvoXhCWwupHlkbB4jUHsNfpPYK0
EOF
3、部署velero服务端工具
#注意:在k8s集群部署、直接使用客户端工具执行下面命令就ok、执行后会自定在集群内创建控制器的pod、CRD资源等
#部署命令:
velero install \
--provider aws \
--image velero/velero:v1.13.1 \
--image registry.cn-beijing.aliyuncs.com/wangxiaochun/velero:v1.15.0 \
--plugins registry.cn-beijing.aliyuncs.com/wangxiaochun/velero-plugin-for-aws:v1.11.0 \
--backup-location region=minio,s3ForcePathStyle="true",s3Url=http://minio.wang.org:9000 \
--bucket velero \
--secret-file ./credentials-velero \
--namespace velero \
--use-node-agent \ #备份数据使用(如果备份集群资源不需要使用这个)
--use-volume-snapshots=false \
--wait
#排错:如果velero启动失败就使用
kubectl logs -f -n velero-system pod-name
#部署后查看
kubectl get all -n velero -o wide
kubectl get pod -n velero
#扩展:卸载velero
#方法一
velero uninstall --namespace velero
#方法二
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
5、使用velero备份数据
#1、创建两个不同的名称空间和pod
#2、执行备份命令
TIME=`date +%F-%H-%M-%S`
velero backup create k8s-backup-$TIME --include-namespaces=demo --default-volumes-to-fs-backup --snapshot-volumes=false
velero backup create k8s-backup-$TIME --kubeconfig ~/.kube/config --include-namespaces=demo --default-volumes-to-fs-backup --snapshot-volumes=false --wait
#3、查看验证命令
1、使用k8s命令查看
kubectl get backup -A
kubectl get restore -A
2、使用velero客户端查看
velero backup get
6、使用velero还原数据
1、先删除pod、然后模拟还原
2、还原名称空间和pod命令:
velero restore create --from-backup k8s-backup-2025-06-12-17-16-32 --wait
3、查看还原资源;
kubectl get restore -A
7、velero跨k8s集群迁移数据
1、集群2安装和集群1一样的配置
安装如下:
velero CLI
minio连接认证、授权文件
velero服务端、两个控制器
2、安装好信息之后、会发现能直接看到备份的信息、这是k8s发信了minio上的备份数据
velero backup get
3、还原命令:和在同一个集群还原命令一样
velero restore create --from-backup k8s-backup-2025-06-12-17-16-32 --wait
8、定时备份
#执行定时任务备份
velero create schedule mybackup --schedule="* * * * *"
9、如何指定资源备份
###创建资源
kubectl run net-test1 --image=centos:7.9.2009 sleep 10000000000 -n myserver
kubectl get pod -n myserver
# kubectl get deployments -n myserver
velero backup create pod-backup-202207222335 --include-cluster-resources=true --ordered-resources
'pods=myserver/net-test1,defafut/net-test1' --namespace velero-system --include-namespaces=myserver,defafut
###恢复
kubectl delete -f /root/nginx-tomcat-case/tomcat.yaml
kubectl get pod -n myserver
velero restore create --from-backup pod-backup-202305051635 --wait \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
###删除pod并验证恢复:
kubectl delete -f /root/nginx-tomcat-case/tomcat.yaml
kubectl get pod -n myserver
velero restore create --from-backup pod-backup-202305051635 --wait \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
10、验证
删除pod并验证恢复
kubectl delete pod net-test1 -n default
velero restore create --from-backup default-backup-20230505160307 --wait-- kubeconfig=./awsuser.kubeconfig--namespace velero-system
kubectl get pod -o wide
kubectl exec-it net-test1 bash
ping www.jd.com
11、批量备份所有namespace:
###批量备份所有namespace:使用shell脚本、然后加到定时任务
#!/bin/bash
# 获取所有命名空间的名称
#NS_NAME=`kubectl get ns | awk '{if (NR>2){print}}' | awk '{print $1}'`
NS_NAME=$(kubectl get ns -o jsonpath='{.items[*].metadata.name}')
# 获取当前时间戳,用于备份文件的命名
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 \
--default-volumes-to-fs-backup=true \
--snapshot-volumes=false
done
echo "所有命名空间的备份已完成。"
bash /data/velero/ns-back.sh
###最后查看minio验证备份

浙公网安备 33010602011771号