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访问

 

posted @   PunchLinux  阅读(3564)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
  1. 1 Get Lucky Daft Punnk
  2. 2 烦恼歌 张学友
  3. 3 Way Back Home Conor Maynard
  4. 4 Put A Little Love In Your Heart Jackie DeShannon
  5. 5 菊次郎的夏天 久石譲
  6. 6 一丝不挂 陈奕迅
  7. 7 日落大道 梁博
  8. 8 Rage your dream m.o.v.e
  9. 9 Don't Be So Shy Imany
  10. 10 芒种 腾格尔
Get Lucky - Daft Punnk
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示