Velero备份恢复
1、velero介绍
- Velero 是一个提供 Kubernetes 集群和持久卷的备份、迁移以及灾难恢复等的开源工具。
- Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。
- Velero 是一种云原生的Kubernetes优化方法,支持标准的K8S集群,既可以是私有云平台也可以是公有云。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。
- 使用velero可以对集群进行备份和恢复,降低集群DR造成的影响。velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。
2、velero备份过程
- 本地 Velero 客户端发送备份指令。
- Kubernetes 集群内就会创建一个 Backup 对象。
- BackupController 监测 Backup 对象并开始备份过程。
- BackupController 会向 API Server 查询相关数据。
- BackupController 将查询到的数据备份到远端的对象存储。
3、velero特性
- Velero 目前包含以下特性:
- 支持 Kubernetes 集群数据备份和恢复
- 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
- 支持复制生产环境到开发以及测试环境
4、velero组件
Velero 组件一共分两部分,分别是服务端和客户端。
服务端:运行在你 Kubernetes 的集群中
客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上
5、支持的备份组件
AWS S3 以及兼容 S3 的存储,比如:Minio
Azure BloB 存储
Google Cloud 存储
Aliyun OSS 存储(https://github.com/AliyunContainerService/velero-plugin)
Github项目地址:velero
6、适应场景
灾备场景:提供备份恢复k8s集群的能力
迁移场景:提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)
安装
下面我以腾讯云COS为例安装:
k8s集群版本 :1.19.3
velero版本: 1.6.3
1.1 下载velero
velero:https://github.com/vmware-tanzu/velero/releases/download/v1.4.2/velero-v1.4.2-linux-amd64.tar.gz
tar xf velero-v1.4.2-linux-amd64.tar.gz
cd velero-v1.4.2-linux-amd64
mv velero /bin/
chmod +x /bin/velero
查看velero命令是否安装成功
velero -h
1.2 创建凭证
- 服务上创建凭证
AK和SK登录腾讯云,通过【访问管理】-【访问密钥】-【API密钥管理】进行查看
vim credentials-velero
[default]
3aws_access_key_id = xxx #ak
4aws_secret_access_key = xxx # sk
1.3 安装
点击存储桶---基础配置---基本信息就可以看到
velero install \
--provider aws \
--plugins ccr.ccs.tencentyun.com/public_images/velero-plugin-for-aws:v1.2.0 \
--bucket velero-1258897006 \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-restic \
--default-volumes-to-restic \
--kubeconfig /root/.kube/config \
--backup-location-config region="ap-nanjing",s3ForcePathStyle="false",s3ForcePathStyle="false",s3Url=http://cos.ap-nanjing.myqcloud.com
1.4 检测
安装完成会看到
Namespace/velero: attempting to create resource
26Namespace/velero: created
27ClusterRoleBinding/velero: attempting to create resource
28ClusterRoleBinding/velero: created
29ServiceAccount/velero: attempting to create resource
30ServiceAccount/velero: created
31Secret/cloud-credentials: attempting to create resource
32Secret/cloud-credentials: created
33BackupStorageLocation/default: attempting to create resource
34BackupStorageLocation/default: created
35Deployment/velero: attempting to create resource
36Deployment/velero: created
37DaemonSet/restic: attempting to create resource
38DaemonSet/restic: created
39Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
```
执行看日志是否有报错
# kubectl logs deployment/velero -n velero
查看namespace velero命名空间是否创建
kubectl get ns
查看命名空间velero pod服务是否运行正常
[root@node01 ~]# kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
restic-fv4d2 1/1 Running 0 44h
restic-pxrkg 1/1 Running 0 44h
velero-5d75cc4c45-spx8q 1/1 Running 0 44h
安装失败或者从新安装执行
清理删除velero服务(如需删除重新安装时使用)
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
1.5 创建测试应用
velero-v1.4.2 文件加中有 base.yaml文件测试
velero-v1.4.2/examples/nginx-app
rw-r--r-- 1 501 dialout 1237 Mar 6 2020 base.yaml
-rw-r--r-- 1 501 dialout 521 Dec 10 2019 README.md
-rw-r--r-- 1 501 dialout 2375 Mar 6 2020 with-pv.yaml
```
[root@master velero-v1.4.2-linux-amd64]# kubectl apply -f examples/nginx-app/base.yaml
namespace/nginx-example created
deployment.apps/nginx-deployment
created service/my-nginx created
[root@master velero-v1.4.2-linux-amd64]# kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-5754944d6c-9vr2w 1/1 Running 0 115s
pod/nginx-deployment-5754944d6c-tczg9 1/1 Running 0 113s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.233.6.201 <pending> 80:32322/TCP 28m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 28m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-5754944d6c 2 2 2 28m
执行备份 后查看COS存储桶是否有备份文件
velero backup create nginx-backup --include-namespaces nginx-example
删除之前创建的资源
kubectl delete -f examples/nginx-app/base.yaml
验证资源已完全删除
kubectl get all -n nginx-example
指定对应的备份名称
velero restore create --from-backup nginx-backup
验证资源是否恢复
kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-5754944d6c-9vr2w 1/1 Running 0 8s
pod/nginx-deployment-5754944d6c-tczg9 1/1 Running 0 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.233.33.109 <pending> 80:30734/TCP 7s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 8s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-5754944d6c 2 2 2 8s
解析
velero install \
--provider aws \
--plugins ccr.ccs.tencentyun.com/public_images/velero-plugin-for-aws:v1.2.0 \
--bucket velero-1258897006 \ #存储桶名
--secret-file ./credentials-velero \ #凭证
--use-volume-snapshots=false \
--use-restic \ #启用静态备份
--default-volumes-to-restic \ #备份所有 pod 卷
--kubeconfig /root/.kube/config \ #指定k8s集群配置文件;
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://IP:9000 #这里是刚才部署minio存储的api接口,可以通过mino容器查看。
--backup-location-config region="ap-nanjing",s3ForcePathStyle="false",s3ForcePathStyle="false",s3Url=http://cos.ap-nanjing.myqcloud.com #云存储接口
velero 命令
#备份查看
velero get backup
#查看定时备份
velero get schedule
#查看已有的恢复
velero get restore
#查看插件
velero get plugins
#备份 namespace
velero backup create NAMESPACE-backup --include-namespaces NAMESPACE
##查看备份
velero backup describe NAMESPACE-backup .
#指定对应的备份名称
velero restore create --from-backup test-backup
# 每日1点进行备份
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
# 每日1点进行备份,备份保留72小时
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
# 每5小时进行一次备份
velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
# 每日对 指定 namespace 进行一次备份 (如panshi-qtc-dev)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev
#恢复
velero restore create --from-backup pvc-backup --restore-volumes
演示示例:
[root@master01 velero]# kubectl get po -n db
NAME READY STATUS RESTARTS AGE
retail-gitlab-54b9f56b6c-66h9w 1/1 Running 0 25d
retail-mysql-6b7f8bdfb8-s4nct 1/1 Running 2 116d
retail-redis-86bd9b5599-5tvlv 1/1 Running 0 21d
velero backup create db-backup --include-namespaces db #备份整个db名称空间