背景
全托管eflink产品要上公有云,eflink控制台跑在蒙贵的一个中心集群上,有专门的运维维护团队,控制后台服务端BigDataManager目前跑在ESK的专有k8s集群上,这个专用k8s集群的运维维护需要我们自己做,那么集群数据备份与恢复目前熙攘这边采用的是开源方案velero,本文对velero的安装部署及使用做简要介绍。
Velero介绍
Velero 是 VMWare 开源的 k8s 集群备份、迁移工具。用于 Kubernetes 集群资源和持久存储卷(PV)的备份、迁移以及灾难恢复等。velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。主要包括两个核心组件,分别为服务端和客户端,服务端运行在具体的 Kubernetes 集群中,客户端是运行在本地的命令行工具。
velero对比etcd存储与恢复数据
- 通过脚本直接备份etcd数据只能将集群中整个数据备份,恢复也是整个集群恢复,如果集群中某个namespace数据被误删除或丢失,通过etcd数据只恢复该namespace不可行。而Velero 可以对 Kubernetes 集群内按对象级别进行备份。
- 备份etcd数据到后端存储也不方便,而velero支持多种后端对象存储。
- velero支持将当前集群数据全部或部分迁移到开发,测试或生成集群,通过自动化脚本来恢复etcd数据到其他集群不可行。
- velero支持更多的插件和配置,更适合大规模生成环境。
Velero 的特性功能
- 支持 Kubernetes 集群数据备份和恢复
- 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
- 支持复制生产环境到开发以及测试环境
- 支持集群中部分资源的备份与恢复
- 支持多种后端对象存储
Velero使用场景
- 灾备场景: 提供备份恢复k8s集群的能力
- 迁移场景: 提供拷贝集群资源到其他集群的能力(复制同步开发、测试、生产环境的集群)
Velero的工作流
- velero 客户端提交cr到 k8s apiserver
- velero controller 监听crd资源的变化,会向API Server查询或提交相关数据。
- velero controller 对接第三方对象存储,存取k8s对象数据或者恢复k8s对象数据
备份过程:
- 本地 Velero 客户端发送备份指令。
- Kubernetes 集群内就会创建一个 Backup 对象。
- BackupController 监测 Backup 对象并开始备份过程。
- BackupController 会向 API Server 查询相关数据。
- BackupController 将查询到的数据备份到远端的对象存储。
Velero的实战
集群规划
3个节点的高可用集群 + 1个对象存储节点
192.168.10.100 master01
192.168.10.101 master02
192.168.10.102 master03
对象存储minio节点
192.168.10.103
对象存储minio安装
mkdir -p /minio/data chmod -R 750 /minio/data docker run -d --restart=on-failure --name minio \ --publish 9000:9000 \ --publish 9001:9001 \ --env MINIO_ROOT_USER="admin" \ --env MINIO_ROOT_PASSWORD="admin123" \ --volume /minio/data:/data \ bitnami/minio:latest |
当log中有以下打印即启动成功,否则排查原因。
登录minio创建buckets http://192.168.10.103:9001
部署Velero
- 版本下载解压
版本:velero-v1.10.1-linux-amd64.tar.gz
项目地址:https://github.com/vmware-tanzu/velero
[root@master01 velero]# tar xvf velero-v1.10.1-linux-amd64.tar.gz [root@master01 velero]# mv velero-v1.10.1-linux-amd64/velero /usr/bin/ [root@master01 velero]# chmod +x /usr/bin/velero
-
创建velero访问后端存储的密钥文件
[root@master-1 opt]# cat /opt/credentials-velero [default] aws_access_key_id = admin aws_secret_access_key = admin123
-
生成客户端证书文件
cd /root/kubernetes vi user-csr.json { "CN": "awsuser", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes user-csr.json | cfssljson -bare awsuser [root@master-1 kubernetes]# cp awsuser-key.pem /etc/kubernetes/ssl/ [root@master-1 kubernetes]# cp awsuser.pem /etc/kubernetes/ssl/
-
创建客户端config文件
# 设置集群参数 cd /root/config/ export KUBE_APISERVER="https://192.168.10.100:6443" kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=awsuser.kubeconfig # 设置客户端认证参数 kubectl config set-credentials awsuser \ --client-certificate=/etc/kubernetes/ssl/awsuser.pem \ --client-key=/etc/kubernetes/ssl/awsuser-key.pem \ --embed-certs=true \ --kubeconfig=awsuser.kubeconfig # 设置上下文参数 kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=awsuser \ --namespace=velero-system \ --kubeconfig=awsuser.kubeconfig # 设置默认上下文 kubectl config use-context kubernetes --kubeconfig=awsuser.kubeconfig # 赋值权限 kubectl create clusterrolebinding awsuser --clusterrole=cluster-admin --user=awsuser
- 下载velero镜像
由于环境上cri是containerd,配置的是本地镜像地址,所以需要将下面两个镜像先下载后推送私有镜像仓库
docker pull bitnami/minio:2023.2.9-debian-11-r0 docker pull velero/velero:v1.10.1 docker pull velero/velero-plugin-for-aws:v1.1.0 docker tag bitnami/minio:2023.2.9-debian-11-r0 easzlab.io.local:5000/bitnami/minio:2023.2.9-debian-11-r0 docker push easzlab.io.local:5000/bitnami/minio:2023.2.9-debian-11-r0 docker tag bitnami/velero/velero:v1.10.1 easzlab.io.local:5000/velero/velero:v1.10.1 docker push easzlab.io.local:5000/velero/velero:v1.10.1 docker tag velero/velero-plugin-for-aws:v1.1.0 easzlab.io.local:5000/velero/velero-plugin-for-aws:v1.1.0 docker push easzlab.io.local:5000/velero/velero-plugin-for-aws:v1.1.0
-
部署velero
velero install \ --kubeconfig /root/config/awsuser.kubeconfig \ --provider aws \ --plugins easzlab.io.local:5000/velero/velero-plugin-for-aws:v1.1.0 \ --bucket velero \ --secret-file /opt/credentials-velero \ --use-volume-snapshots=false \ --namespace velero-system \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.10.103:9000
备份与恢复验证
-
创建一个备份
velero backup create streamx-backup \ --include-namespaces streamx-dev \ --kubeconfig=/root/config/awsuser.kubeconfig \ --namespace velero-system
-
查看该备份
velero backup describe streamx-backup \ --kubeconfig=/root/config/awsuser.kubeconfig \ --namespace velero-system
-
删除streamx-dev命名空间下的所有资源并恢复
kubectl get all -n streamx-dev kubectl delete ns streamx-dev kubectl get all -n streamx-dev velero restore create --from-backup streamx-backup --wait \ --kubeconfig=/root/config/awsuser.kubeconfig \ --namespace velero-system
velero常用命令
- 定时备份常用命令
每日1点进行备份
velero create schedule --schedule="0 1 * * *"每日12点进行备份,备份保留48小时
velero create schedule --schedule="0 12 * * *" --ttl 48h每24小时进行一次备份
velero create schedule --schedule="@every 24h"每日对 streamx-dev namespace 进行一次备份
velero create schedule --schedule="@every 24h" --include-namespaces streamx-dev - 资源查看
velero backup get #备份查看
velero schedule get #查看定时备份
velero restore get #查看可恢复备份