velero简介
velero官网: https://velero.io/
velero-github: https://github.com/vmware-tanzu/velero
velero的特性
备份可以按集群资源的子集,按命名空间、资源类型标签选择器进行过滤,从而为备份和恢复的内容提供高度的灵活性
支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中
velero的组件
velero由一个客户端和一个服务端组成
客户端:运行在本地的命令行工具,只要配置好kubectl和kubeconfig认证文件就可使用,非常简单
服务端:运行在Kubernetes集群之上,负责执行具体的备份和恢复操作
velero工作流程
备份数据:
本地velero客户端发送备份命令,就会调用API Server创建Backup资源对象
服务端收到通知有新的Backup对象创建并执行验证
服务端开始执行备份过程,向API Server查询需要备份的数据
服务端调用对象存储服务,将备份数据保存到对象对象存储上
恢复数据:
本地velero客户端发送恢复指令,就会调用API Server创建Restore资源对象
服务端收到通知有新的Restore对象创建并执行验证
服务端调用对象存储,将指定的备份文件下载下来
服务端开始执行恢复过程,根据备份数据调用API Server重新创建相关资源对象
支持的存储
AWS S3 以及兼容 S3 的存储,比如:
Minio
ceph存储
Google Cloud 存储
Aliyun OSS 存储
与ETCD的区别
与 Etcd 备份相比,直接备份 Etcd 是将集群的全部资源备份起来。而 Velero 就是可以对 Kubernetes 集群内对象级别进行备份。除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label 等对象进行分类备份或者恢复。
备份过程中创建的对象是不会备份的
使用场景
灾备场景: 提供备份恢复k8s集群的能力
迁移场景: 提供拷贝集群资源到其他集群的能力(复制同步开发、测试、生产环境的集群)
备份恢复操作
部署minio
minio在这里是用来保存velero的备份数据,如果你有其它对象存储服务,也可以用它们来替换minio。
minio是一款高性能、分布式的对象存储系统,采用Go语言实现,兼容Amazon S3接口,客户端与存储服务器之间采用http/https通信协议。
minio官网: https://min.io/
minio中文网站: http://www.minio.org.cn/
minio支持单机部署和分布式部署,这里选择容器方式单机部署。
部署命令
docker pull minio/minio:RELEASE.2024-04-06T05-26-02Z-cpuv1
docker run -d --name minio -p 9000:9000 -p 9999:9999 -v /data/minio:/minio --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=12345678" minio/minio:RELEASE.2024-04-06T05-26-02Z-cpuv1 server /minio --console-address '0.0.0.0:9999'
访问并创建桶
部署Velero
服务端:目标Kubernetes集群
客户端: 本地的命令行的工具,需要配合kubernetes认证使用.
项目地址:https://github.com/vmware-tanzu/velero
版本: velero 1.10+ 不再支持标志 --use-restic,需要使用–use-restic 用版本 1.9.x
说明:https://learn.microsoft.com/zh-cn/azure/aks/hybrid/backup-workload-cluster
下载客户端
wget https://github.com/vmware-tanzu/velero/releases/download/v1.13.2/velero-v1.13.2-linux-amd64.tar.gz
tar xf velero-v1.13.2-linux-amd64.tar.gz
cd velero-v1.13.2-linux-amd64/
cp velero /usr/local/bin/
测试使用
velero --help
创建访问minio的认证文件
cat << EOF > /root/.velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
EOF
安装客户端
有证书需要配置,没证书直接操作创建ns
配置velero访问k8s
签发证书,用于velero访问API Server时认证使用
openssl genrsa --out velero-user.key 2048
openssl req -new -key velero-user.key \
-out velero-user.csr \
-subj "/CN=velero-user/O=k8s"
openssl x509 -req -days 3650 \
-CA /etc/kubernetes/ssl/ca.pem \
-CAkey /etc/kubernetes/ssl/ca-key.pem -CAcreateserial \
-in velero-user.csr -out velero-user.crt
rm -f velero-user.csr
准备kubeconfig认证文件
kubectl config set-cluster k8s-cluster1 --embed-certs \
--server=https://192.168.122.188:6443 -\
-certificate-authority=/etc/kubernetes/ssl/ca.pem \
--kubeconfig=/data/velero/velero-user.config
kubectl config set-credentials velero-user --embed-certs \
--client-certificate=/data/velero/velero-user.crt \
--client-key=/data/velero/velero-user.key \
--kubeconfig=/data/velero/velero-user.config
kubectl config set-context velero-user@k8s-cluster1 \
--cluster=k8s-cluster1 --user=velero-user \
--kubeconfig=/data/velero/velero-user.confi
kubectl config use-context velero-user@k8s-cluster1 --kubeconfig=/data/velero/velero-user.config
为velero-user用户授权
kubectl create clusterrolebinding velero-user@clusteradmin --clusterrole=cluster-admin --user=velero-user
创建ns
kubectl create ns velero
下载aws访问控制插件docker pull velero/velero-plugin-for-aws:v1.9.2
执行安装velero服务端
velero install --kubeconfig /root/.kube/config --namespace velero --provider aws --plugins velero/velero-plugin-for-aws:latest --use-volume-snapshots=false --use-restic --bucket new --secret-file /root/.velero-auth.txt --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://114.132.60.178:31900
velero install --kubeconfig /root/.kube/config --namespace velero --provider aws --plugins velero/velero-plugin-for-aws:v1.9.2 --use-volume-snapshots=false --bucket new --secret-file /root/.velero-auth.txt --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.0.12.11:9000
完成安装后,在velero的namespace中出现了两个pod,分别是velero服务端和辅助数据备份的restic。
查看velero pod运行状态日志kubectl logs deployment/velero -n velero
stroage location 必须是valid有效的
nginx备份恢复测试
备份测试
查看nginx命名空间下的nginx
备份nginx空间,备份名称为nginx-backup
velero backup create nginx-backup --include-namespaces nginx
查看备份状态,状态为Completed表示备份成功
velero backup get --namespace velero
查看备份位置
velero backup-location get
恢复测试
由于上面备份的是整个nginx空间,所以可以连同ns一起删除
通过上面备份文件nginx-backup文件恢复
velero restore create --from-backup nginx-backup --wait
nginx空间下所有资源已经恢复
跨集群数据迁移
将本集群的数据迁移至其他集群,理论上完成3步骤即可:
1.镜像上传
本例中本集群 和 其他集群使用了相同的初始化步骤,且网络互通,因此无需上传镜像。
2.部署velero
在其他集群上相同的步骤(两个集群连接同一个对象存储服务)
3.使用velero恢复指定的备份源
在恢复时,目标集群只需要执行velero restore 命令,即可完成集群迁移。
演示
部署完成之后,进行nginx整个空间恢复
velero restore create --from-backup nginx-backup --wait
另一个集群已经有了nginx空间下的所有资源
跨集群跨版本测试(k8s1.25-1.23)
备份测试
查看mysql名称空间下的资源(hostPath存储)
在mysql创建库表
备份mysql空间,备份名称为backup
velero backup create backup --include-namespaces mysql
查看备份状态,状态为Completed表示备份成功
velero backup get --namespace velero
可以在minio上查看备份数据
恢复测试
由于上面备份的是整个mysql空间,所以直接在其他集群恢复
velero restore create --from-backup backup --wait
空间下所有资源已经迁移成功
查看库表(没有)
问题
我在源mysql创建的库表,没还原出来。
跨集群跨版本测试(k8s1.23-1.19集群网络打通,使用同一个共享存储(pv))
恢复之前先停掉原先的es
创建es,类型为deployment,挂载pvc,创建在es名称空间。
往es里插入几条索引
查看索引:
curl -XGET '192.168.123.240:30920/_cat/indices?v&pretty'
备份数据
创建整个es名称空间的备份为es-backup
velero backup create es-backup --include-namespaces es
恢复数据
先停掉原先的es
另一个集群执行命令
velero restore create --from-backup es-backup --wait
查看es名称空间
查看pv、pvc
查看索引:
curl -XGET '192.168.123.91:30920/_cat/indices?v&pretty'