k8s备份恢复之velero

1.下载并安装velero客户端

下载地址:https://github.com/vmware-tanzu/velero/releases
#根据项目对应的k8s版本下载对应的版本,我的k8s版本为1.22 所以下载1.11.0
wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.0/velero-v1.11.0-linux-amd64.tar.gz
tar xf velero-v1.11.0-linux-amd64.tar.gz 
cd velero-v1.11.0-linux-amd64/
mv velero /usr/local/bin/
velero -h

2.安装velero服务端(使用阿里云OSS)

mkdir ~/velero
cd ~/velero
cat >auth-oss.txt <<EOF  #具有写入读取阿里云OSS权限用户的AK及AS
[default]
aws_access_key_id = LTAI4FoDtp4y7ENqv9X4emSE
aws_secret_access_key = lVNCxCVGciaJqUa5axxx
EOF


velero -n velero install \
  --image velero/velero:v1.11.0 \      #注意版本要和客户端保持一致
  --plugins velero/velero-plugin-for-aws:v1.9.2 \
  --provider aws \
  --use-volume-snapshots=false \
  --bucket zdbl-ops \  #OSS名称
  --prefix k8s_backup \ #OSS下的目录,如果整个OSS全部给velero可以不写
  --secret-file ~/velero/auth-oss.txt \
  --backup-location-config region=oss-cn-shanghai,s3ForcePathStyle="false",s3Url=http://oss-cn-shanghai.aliyuncs.com #根据实际地域替换shanghai
  
#查看日志及状态
kubectl logs -f  deployment/velero -n velero
kubectl get pods -n velero 

3.验证

#部署nginx-demo
kubectl create ns velero-backup-test
kubectl apply -f https://gitee.com/alivv/elvin-demo/raw/master/k8s/2.1.nginx-demo.yml
sed -i 's/default/velero-backup-test/g' 2.1.nginx-demo.yml
kubectl apply -f  2.1.nginx-demo.yml
kubectl get pod -n velero-backup-test 


#备份namespaces为velero-backup-test 的所有资源
velero backup create k8s-backup-test --include-namespaces   velero-backup-test

#查看备份
velero backup logs k8s-backup-test
velero backup get


#删除nginx-demo 
kubectl delete -f  2.1.nginx-demo.yml
kubectl get pod -n velero-backup-test 

#使用velero恢复nginx-demo
elero restore create nginx-demo  --from-backup k8s-backup-test  --include-namespaces  velero-backup-test
velero restore get
kubectl get pods -n velero-backup-test

4.其他常用命令

#velero基本命令
velero get backup #查看备份
velero get schedule #查看定时备份
velero get restore #查看已有的恢复
velero get plugins #查看插件
 
#备份所有
velero backup create k8s-bakcup-all --ttl 72h
#恢复集群所有备份,对已经存在的服务不会覆盖
velero restore create --from-backup k8s-bakcup-all
#仅恢复default的namespace,包括集群资源
velero restore create --from-backup k8s-bakcup-all --include-namespaces default --include-cluster-resources=true
#恢复储存pv,pvc
velero restore create pvc --from-backup k8s-bakcup-all --include-resources persistentvolumeclaims,persistentvolumes
#恢复指定资源deployments,configmaps 
velero restore create deploy-test --from-backup k8s-bakcup-all --include-resources deployments,configmaps 
#筛选备份name=nginx-demo -l, --selector:通过指定label来匹配要backup的资源
velero backup create nginx-demo --from-backup k8s-bakcup-all --selector name=nginx-demo
 
#筛选备份恢复对象
--include-namespaces  筛选命名空间所有资源,不包括集群资源
--include-resources   筛选的资源类型
--exclude-resources   排除的资源类型
--include-cluster-resources=true 包括集群资源
 
#将test1命名空间资源恢复到test2  
velero restore create test1-test2 --from-backup k8s-bakcup-all --namespace-mappings test1:test2 
 
#备份hooks
#Velero支持在备份任务执行之前和执行后在容器中执行一些预先设定好的命令

#卸载velero后重新安装以验证备份正常
velero uninstall



#备份所有资源保留72小时
velero backup create k8s-bakcup-all-$(date +%F) --ttl 72h
#查看备份
velero backup get



#周期性任务
velero schedule create -h

#定时任务,每天16点(UTC时区)备份,保留7天(168h)
velero create schedule k8s-bakcup-all --schedule="0 16 * * *" --ttl 168h

#查看定时任务
velero get schedule

#迁移
新集群参考当前集群安装velero的客户端和服务端,OSS配置保持一致

5.k8s迁移

1.在目标集群安装velero,安装参数的bucket prefix 等与源集群保持一致指(minio参数则为s3url)
2.还原数据
注意事项:
1.还原到目标集群的备份数据中不要包含kube-system命名空间的资源,避免冲突 2.如果storageClass的名称发生变更,需要进行映射 将下面文件保存为velero-sc.yaml,将<target-sc>修改为目标集群的storageClass名称,并通过kubectl apply -f velero-sc.yaml执行映射,然后再进行数据还原。 apiVersion: v1 kind: ConfigMap metadata: name: change-storage-class-config namespace: velero labels: velero.io/plugin-config: "" velero.io/change-storage-class: RestoreItemAction data: cfs-v4: <target-sc>

抄自于:https://www.cnblogs.com/elvi/p/18303978

 

posted @ 2024-07-23 20:10  百衲本  阅读(29)  评论(0编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码