使用 velero 备份 Kubernetes 集群方案

Velero 是一款云原生时代的灾难恢复和迁移工具, 利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。

最佳实践
使用-velero-备份-Kubernetes-集群方案.png

简介

Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,开源地址为:https://github.com/vmware-tanzu/velero。Velero 源于西班牙语,意思为帆船,非常符合 Kubernetes 社区的命名风格。

​ 中文社区地址:https://velero.cn/

利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。它的基本原理就是将集群的数据,例如集群资源和持久化数据卷备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群,这也是 velero 一个非常成功的使用场景。

在资源备份方面,velero 支持将数据备份到众多的云存储中,例如AWS S3或S3兼容的存储系统、Azure Blob、Google Cloud存储、Aliyun OSS等。与备份整个 kubernetes 的数据存储引擎 etcd 相比,velero 的控制更加细化,可以对 Kubernetes 集群内对象级别进行备份,还可以通过对 Type、Namespace、Label 等对象进行分类备份或者恢复。

如何工作

Velero 由以下组件组成:

  1. 集群中的 Velero 服务器
  2. CLI 客户端
  3. 集群中的静态守护程序集

Velero 备份如何工作的图表:

以下是 Velero 恢复工作的方式:

公有云存储备份还原方案

自建存储备份还原方案

minio-velero 参考文献

先决条件

  1. Kubernetes 集群版本 1.19 到 1.23 与 DNS
  2. 安装了 kubectl
  3. 安装了helm3
  4. Velero cli 安装 https://Velero.io/docs/main/basic-install/
  5. 集群部署存储插件

安装 minio 服务

添加 minio 仓库
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update 
helm 安装 minio 服务
$ helm install minio bitnami/minio  -n minio \
--set global.storageClass=df-nfs-storage \
--set auth.rootUser=admin \
--set auth.rootPassword=erwewrwerewrwerwerw34 \
--set mode=standalone --create-namespace 
验证部署
$ kubectl get pods -n minio -w
NAME                     READY   STATUS              RESTARTS   AGE
minio-75dd97bddd-jqt8p   0/1     ContainerCreating   0          16s
minio-75dd97bddd-jqt8p   0/1     Running             0          39s
minio-75dd97bddd-jqt8p   1/1     Running             0          46s
创建 velero bucket
$ export ROOT_USER=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-user}" | base64 -d)
$ export ROOT_PASSWORD=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-password}" | base64 -d)

$ kubectl run --namespace minio minio-client \
     --rm --tty -i --restart='Never' \
     --env MINIO_SERVER_ROOT_USER=$ROOT_USER \
     --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \
     --env MINIO_SERVER_HOST=minio \
     --image docker.io/bitnami/minio-client:2022.11.7-debian-11-r0 --  mb minio/velero

部署 velero deployment

创建凭证

​ 在本地目录中创建 credentials-velero 特定的凭据文件:

[default]
aws_access_key_id = admin
aws_secret_access_key = erwewrwerewrwerwerw34

执行安装
$ velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.1.0 \
    --bucket velero \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=false \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.minio:9000
验证部署
kubectl get pods -n velero
NAME                     READY   STATUS            RESTARTS   AGE
velero-84bc648cf-gfdhc   0/1     PodInitializing   0          53s
velero-84bc648cf-gfdhc   1/1     Running           0          56s

测试功能

创建测试配置
$ kubectl create ns test
$ kubectl create deploy test --image=nginx -n test
$ kubectl get pods -n test

NAME                    READY   STATUS    RESTARTS   AGE
test-764c85dd84-mspkg   1/1     Running   0          38s
velero 备份
$ velero backup create test-backup  --snapshot-volumes --include-namespaces test
$ velero get backup

NAME          STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
test-backup   Completed   0        0          2022-11-13 02:42:16 +0800 CST   29d       default            <none>
模拟误删除 namespace
$ kubectl delete ns test
namespace "test" deleted
$ kubectl get ns test
Error from server (NotFound): namespaces "test" not found
velero 还原
velero restore create --from-backup test-backup --include-namespaces  test

查看是否恢复

$ kubectl get all -n test

NAME                        READY   STATUS    RESTARTS   AGE
pod/test-764c85dd84-mspkg   1/1     Running   0          40s

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/test   1/1     1            1           41s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/test-764c85dd84   1         1         1       41s

恢复成功

velero 相关命令

备份所有配置(不包含pvc数据)

velero backup create all-aws-df --wait

查看备份

velero get backup

恢复备份

velero restore create --from-backup test-backup  #指定对应的备份名称 恢复集群所有备份,(对已经存在的服务不会覆盖)

定期备份

对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)

每日1点进行备份
velero create schedule --schedule="0 1 * * *"

每日1点进行备份,备份保留48小时
velero create schedule --schedule="0 1 * * *" --ttl 48h

每日1点进行备份,备份保留7天
velero create schedule prd-aws-df --schedule="0 1 * * *" --ttl 168h

每6小时进行一次备份
velero create schedule --schedule="@every 6h"

每日对 web namespace 进行一次备份
velero create schedule --schedule="@every 24h" --include-namespaces web

备份带pv的pod

velero backup create pvc-backup  --snapshot-volumes --include-namespaces test-velero

恢复带pv的pod

velero  restore create --from-backup pvc-backup --restore-volumes

其他

# kubectl delete ns forethought-core func func2 forethought-webclient forethought-kodo middleware utils launcher
velero restore create --from-backup prd-aws-df-20221025010049 --include-namespaces forethought-core,func,func2,forethought-webclient,forethought-kodo,middleware,utils,launcher # 恢复上上个注释删除的的删除内容

velero backup download xxx # 备份导出,可以上传远程存储,做异地 
velero  get  backup   #备份查看
velero  get  schedule #查看定时备份
velero  get  restore  #查看已有的恢复
velero  get  plugins  #查看插件
velero restore create --from-backup all-ns-backup  #恢复集群所有备份,(对已经存在的服务不会覆盖)
velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example #仅恢复 default nginx-example namespace

Velero可以将资源还原到与其备份来源不同的命名空间中。为此,请使用--namespace-mappings标志
velero restore create RESTORE_NAME --from-backup BACKUP_NAME --namespace-mappings old-ns-1:new-ns-1,old-ns-2:new-ns-2
例如下面将test-velero 命名空间资源恢复到test-velero-1下面
velero restore create restore-for-test --from-backup everyday-1-20210203131802 --namespace-mappings test-velero:test-velero-1
#定时备份 
velero create schedule prd-aws-df --schedule="0 1 * * *" --ttl 168h

velero 生产环境备份经验

  1. 设置定时备份

  2. 没有备份 pvc 数据, 可根据实际情况备份

  3. Velero 还原后,有各别 svc label 没设置成功,需要手动处理

  4. Velero 还原后,Headless svc 有个 pod-template 需要手动处理

  5. 定期查看备份是否成功,防止意外发生,追悔莫及

Get a tailored plan

Contact us

Join the community

Scan with WeChat
to join the community

Try Guance

Start online and pay only for what you use.

Get started

Choose a Guance plan

Code hosting