使用 velero 备份 Kubernetes 集群方案

    简介

    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. 定期查看备份是否成功,防止意外发生,追悔莫及

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    免费开启

    支持私有云环境部署

    代码托管平台