kubernetes容灾备份工具velero

velero 简介

Velero 是一个云原生的灾难恢复和迁移工具,采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。Velero 是西班牙语,意思是帆船,非常符合 Kubernetes 社区的命名风格。
在这里插入图片描述
Velero目前包含以下特性:

  • 支持Kubernetes集群数据备份和恢复
  • 支持复制当前Kubernetes集群的资源到其它Kubernetes集群
  • 支持复制生产环境到开发以及测试环境

Velero组件一共分两部分,分别是服务端和客户端。

  • 服务端:运行在Kubernetes集群中
  • 客户端:运行在本地的velero命令行工具,需要在机器上已配置好kubectl及集群kubeconfig

velero使用场景

  • 灾备场景:提供备份恢复k8s集群的能力
  • 迁移场景:提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)

velero与etcd备份区别

  • 直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。
  • 除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 TypeNamespaceLabel
    等对象进行分类备份或者恢复。

官方网站:https://velero.io

项目地址:https://github.com/vmware-tanzu/velero

velero 原理

每个 Velero 操作包括按需备份、计划备份、恢复,都是一个自定义资源,使用 Kubernetes自定义资源定义 (CRD) 定义并存储在etcd 中。Velero 还包括处理自定义资源以执行备份、恢复和所有相关操作的控制器。
在这里插入图片描述
Velero 在 Kubernetes 集群中创建了很多 CRD 以及相关的控制器,进行备份恢复等操作实质上是对相关 CRD 的操作。

# kubectl -n velero get crds -l component=velero
NAME                                CREATED AT
backups.velero.io                   2021-08-06T08:29:34Z
backupstoragelocations.velero.io    2021-08-06T08:29:34Z
deletebackuprequests.velero.io      2021-08-06T08:29:34Z
downloadrequests.velero.io          2021-08-06T08:29:34Z
podvolumebackups.velero.io          2021-08-06T08:29:34Z
podvolumerestores.velero.io         2021-08-06T08:29:34Z
resticrepositories.velero.io        2021-08-06T08:29:34Z
restores.velero.io                  2021-08-06T08:29:34Z
schedules.velero.io                 2021-08-06T08:29:34Z
serverstatusrequests.velero.io      2021-08-06T08:29:35Z
volumesnapshotlocations.velero.io   2021-08-06T08:29:35Z

您可以备份或恢复集群中的所有对象,也可以按类型、命名空间和/或标签过滤对象。Velero 非常适合灾难恢复用例,以及在集群上执行系统操作(如升级)之前对应用程序状态进行快照。

Velero 工作原理图如下图所示,当用户执行备份命令时,备份过程说明如下:

  1. 调用自定义资源 API 创建备份对象(1)。
  2. BackupController 控制器检测到生成的备份对象时(2)执行备份操作(3)。
  3. 将备份的集群资源和存储卷快照上传到 Velero 的后端存储(4)和(5)。
    在这里插入图片描述

Velero 将对象存储视为事实的来源,当执行还原操作时,Velero 会将指定备份对象的数据从后端存储同步到 Kubernetes 集群完成还原工作。同样,如果一个备份对象存在于 Kubernetes 但不在对象存储中,它将从 Kubernetes 中删除,因为备份 tarball 不再存在。
在这里插入图片描述

velero 安装

velero安装分为两部分,velero CLI命令行安装及服务端安装,前提条件:

  • 准备一个生产k8s集群cluster1,及一个灾备k8s集群cluster2,当然也可以在同一个集群备份恢复
  • 在灾备环境部署minio对象存储,当然也可以使用公有云对象存储

minio对象存储安装

velero依赖对象存储保存备份数据,这里部署minio替代公有云对象存储。灾备环境准备一个节点部署minio对象存储,两个集群velero服务端将指向同一个对象存储的同一个bucket,cluster1向桶内备份数据,cluster2向桶内读取备份数据进行恢复,借鉴下图进行理解:
在这里插入图片描述
可以在k8s集群内直接使用yaml或官方minio operator部署,这里在集群外使用docker安装minio对象存储:

docker run -d --name minio \
  --restart always \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=minio" \
  -e "MINIO_ROOT_PASSWORD=minio123" \
  -v minio-data:/data \
  minio/minio server /data --console-address ":9001"

访问对象存储控制台http://prod.minio.cloudcele.com:9001,创建名为velero的bucket桶,名称自定义:
在这里插入图片描述

安装velero CLI客户端

参考:https://velero.io/docs/v1.6/basic-install/

分别在cluster1和cluster2准备一个节点,安装veleroCLI,本地有kubeconfig文件,能够访问到两个k8s集群即可:

下载客户端

wget https://github.com/vmware-tanzu/velero/releases/download/v1.6.2/velero-v1.6.2-linux-amd64.tar.gz

解压安装

tar -zxvf velero-v1.6.2-linux-amd64.tar.gz 
cp velero-v1.6.2-linux-amd64/velero /usr/local/bin/

查看velero CLI版本

velero version

安装velero服务端

参考:https://velero.io/docs/v1.6/contributions/minio/

分别在cluster1和cluster2集群中部署velero服务端,本地创建minio对象存储访问凭证:

cat  >credentials-velero <<EOF
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF

使用velero CLI在生产和灾备集群安装velero,指向同一个对象存储:

velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.2.0 \
    --namespace velero \
    --bucket velerobak \
    --default-volumes-to-restic \
    --use-restic \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=false \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.0.21:9000

--use-restic参数指定使用官方默认支持的restic将持久化卷备份到对象存储,而公有云厂商提供的k8s有对应的CSI实现和velero插件支持。

查看集群中创建的pods

[root@master ~]# kubectl -n velero get pods
NAME                      READY   STATUS    RESTARTS   AGE
restic-22m9g              1/1     Running   2          16m
restic-4rb8r              1/1     Running   2          16m
restic-k8b75              1/1     Running   1          16m
restic-p88xh              1/1     Running   0          16m
velero-79dc999699-rjf9p   1/1     Running   1          16m

或者使用helm部署velero(不推荐):

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts

helm install velero vmware-tanzu/velero \
  --namespace velero \
  --create-namespace \
  --set cleanUpCRDs=true \
  --set configuration.provider=aws \
  --set-file credentials.secretContents.cloud=./credentials \
  --set deployRestic=true \
  --set snapshotsEnabled=false \
  --set configuration.backupStorageLocation.name=minio \
  --set configuration.backupStorageLocation.bucket=velero \
  --set configuration.backupStorageLocation.config.region=minio \
  --set configuration.backupStorageLocation.config.s3ForcePathStyle=true \
  --set configuration.backupStorageLocation.config.s3Url=http://192.168.0.21:9000 \
  --set "initContainers[0].name"=velero-plugin-for-aws \
  --set "initContainers[0].image"=velero/velero-plugin-for-aws:v1.2.0 \
  --set "initContainers[0].volumeMounts[0].mountPath"=/target \
  --set "initContainers[0].volumeMounts[0].name"=plugins \
  vmware-tanzu/velero

卸载velero

kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

velero备份

在cluster1备份应用及pv卷,首先创建veleroCLI中自带的示例应用:

cd velero-v1.6.2-linux-amd64/examples/nginx-app

kubectl apply -f with-pv.yaml

查看创建的应用及持久卷,注意这里使用storageclass动态申请持久卷,在恢复的目标集群,建议提供相同名称的storageclass:

[root@product-cluster nginx-app]# kubectl -n nginx-example get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5ccc99bffb-swvr2   2/2     Running   0          6m59s

[root@product-cluster nginx-app]# kubectl -n nginx-example get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE
pvc-fd5eee69-ca7f-4e94-a749-7d4e04dc4a7c   50Mi       RWO            Delete           Bound    nginx-example/nginx-logs   longhorn                6m54s

执行备份,备份nginx-example这个命名空间下的所有资源:

velero backup create mybackup-01 --include-namespaces=nginx-example

查看备份百分比进度

velero backup describe mybackup-01

查看备份的所有资源列表

velero backup describe mybackup-01 --details

备份完成后可以查看备份日志

velero backup logs mybackup-01

查看备份任务最终执行状态

velero backup get

查看对象存储中保存的备份数据
在这里插入图片描述

velero恢复

由于指向同一个对象存储,cluster2中的velero同样能看到cluster1中备份:

[root@disaster-cluster ~]# velero backup get
NAME                               STATUS            ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
mybackup-01                        Completed         0        1          2021-09-18 17:48:24 +0800 CST   29d       default            <none>

在集群cluster2恢复应用及pv卷:

[root@disaster-cluster ~]# velero restore create --from-backup=mybackup-01

查看恢复的应用及数据

[root@disaster-cluster ~]# kubectl -n nginx-example get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5ccc99bffb-swvr2   2/2     Running   0          7m10s

[root@disaster-cluster ~]# kubectl -n nginx-example get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE
pvc-c9713a25-a3f6-4179-89df-fd6e27ea5055   5Gi        RWO            Delete           Bound    ns-panda/mysql-pv-claim    longhorn                31h

velero常用命令

备份单个namespace下的所有资源:

velero backup create mybackup-01 --include-namespaces=mynamespace

备份多个namespace下的所有资源:

velero backup create mybackup --include-namespaces=mynamespaceA,mynamespaceB

创建一小时后自动删除的备份

velero backup create mybackup --include-namespaces=mynamespace --ttl=1h

获取备份列表

velero backup get

获取mybackup这个备份的详情信息

velero backup describe mybackup

删除mybackup这个备份

velero backup delete mybackup

从某一个备份上恢复,如果备份有多个命名空间也可以只恢复其中一个

velero restore create --from-backup=mybackup-01 --include-namespaces=mynamespace

每天1点创建一个72小时删除的mynamespace备份

velero schedule create myschedule --schedule="0 1 * * *" --ttl 72h --include-namespaces=mynamespace

查看备份位置配置

kubectl -n velero get BackupStorageLocation -o yaml

参考:https://cloud.tencent.com/developer/article/1765348

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值