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 @ 2022-08-02 13:34  PunchLinux  阅读(3762)  评论(2)    收藏  举报