• 使用velero进行kubernetes灾备


    使用velero可以对集群进行备份和恢复,降低集群DR造成的影响。velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。可以从官方文档查看可接收的对象存储,本地存储可以使用Minio。下面演示使用velero将openstack上的openshift集群备份恢复到阿里云的openshift上。

    环境要求:kubernetes >1.7;openshift >3.7

    注意:本次使用的velero镜像来自官方dockerhub,版本为v1.2.0-beta.1,而非来自配置文件中的registry.cn-hangzhou.aliyuncs.com/acs/velero:latest。建议采用最新镜像,经验证v1.1.0版本的镜像会出现velero无法在1min内同步对象存储的问题(实际同步为1h)。

    安装velero


    该步骤需要在openstack和阿里云的openshift上执行,一个用于创建backup,一个执行restore。

    使用阿里云oss需要特定的插件支持,velero的安装可以参见阿里云官方文档

    首先需要创建bucket,创建RAM用户并授权该用户,用户所需要的权限如下,以ecs开头的用于操作云盘快照,以oss开头的用于操作oss bucket。

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "ecs:DescribeSnapshots",
                    "ecs:CreateSnapshot",
                    "ecs:DeleteSnapshot",
                    "ecs:DescribeDisks",
                    "ecs:CreateDisk",
                    "ecs:Addtags",
                    "oss:PutObject",
                    "oss:GetObject",
                    "oss:DeleteObject",
                    "oss:GetBucket",
                    "oss:ListObjects"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
    

    修改官方项目中的install/credentials-velero文件,内容如下,用于连接oss bucket:

    ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    ALIBABA_CLOUD_OSS_ENDPOINT=<ALIBABA_CLOUD_OSS_ENDPOINT>
    

    在shell中设置如下变量,分别用于设置BackupStorageLocation和VolumeSnapshotLocation。REGION可以从阿里云backet的页面看到,如oss-cn-beijing.aliyuncs.comREGION就是beijing

    BUCKET=<YOUR_BUCKET>
    REGION=<YOUR_REGION>
    

    按照官方文档执行如下步骤即可创建velero

    kubectl create namespace velero
    
    kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
    
    kubectl apply -f install/00-crds.yaml
    
    sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml
    sed -i "s#<REGION>#$REGION#" install/01-velero.yaml
    kubectl apply -f install/01-velero.yaml
    

    配置文件install/01-velero.yaml中使用的镜像是从gcr.io/heptio-images/velero:latest同步的,可以在官方release中查看当前的最新版本

    # sync from gcr.io/heptio-images/velero:latest
    image: registry.cn-hangzhou.aliyuncs.com/acs/velero:latest
    

    为了方便执行,可以下载velero命令行工具,拷贝到系统$PATH路径即可使用

    velero的使用


    velero的使用推荐观看该视频,讲解的比较详细。所有支持的命令可以通过--help选项查看

    velero会定期同步对象存储中的backup操作(新增/删除)

    手动备份

    备份集群的所有资源

    velero backup create ${BACKUP_NAME}
    

    --include-namespaces选项可以指定备份某些命名空间下面的资源

    velero backup create ${BACKUP_NAME} --include-namespaces ${NAMESPACE1},${NAMESPACE2}
    

    --exclude-namespaces选项可以指定备份排除某些命名空间下面的资源

    velero backup create ${BACKUP_NAME} --exclude-namespaces ${NAMESPACE1},${NAMESPACE2}
    

    --include-resources选项可以指定备份哪些资源类型;--exclude-resources`可以指定排除某些资源类型

    velero backup create ${BACKUP_NAME} --include-resources pod,secret
    

    --ttl可以指定backup的生存周期,在ttl超时后,backup会被定期清理,ttl默认30天

    删除backup

    使用--confirm可以直接删除备份,无需确认

    velero backup delete ${BACKUP_NAME} --confirm
    

    定期backup

    定期备份类似kubernetes的cronjob,会定期上传backup到对象存储。在首次执行velero schedule会执行一次数据备份。

    # Create a backup every 6 hours
    velero create schedule ${SCHEDULE_NAME} --schedule="0 */6 * * *"
    
    # Create a backup every 6 hours with the @every notation
    velero create schedule ${SCHEDULE_NAME} --schedule="@every 6h"
    
    # Create a daily backup of the web namespace
    velero create schedule ${SCHEDULE_NAME} --schedule="@every 24h" --include-namespaces web
    
    # Create a weekly backup, each living for 90 days (2160 hours)
    velero create schedule ${SCHEDULE_NAME} --schedule="@every 168h" --ttl 2160h0m0s
    

    restore

    从backup创建restore

    velero restore create ${RESTORE_NAME} --from-backup ${BACKUP_NAME}
    

    从backup创建restore,restore默认名为 ${BACKUP_NAME}-<timestamp>

    velero restore create --from-backup ${BACKUP_NAME}
    

    从schedule最新一次的backup创建restore

    velero restore create --from-schedule ${SCHEDULE_NAME}
    

    指定backup中的某些资源创建restore

    velero restore create --from-backup backup-2 --include-resources pod,secret
    

    velero Hook

    velero支持两种Hook:Pre HookPost Hook,分别表示在backup前执行和在backup后执行

    pre.hook.backup.velero.io/container
    pre.hook.backup.velero.io/command
    pre.hook.backup.velero.io/on-error
    pre.hook.backup.velero.io/timeout
    
    post.hook.backup.velero.io/container
    post.hook.backup.velero.io/command
    post.hook.backup.velero.io/on-error
    post.hook.backup.velero.io/timeout
    

    可以通过两种方式注入Hook:Pod annotationBackup spec

    需要注意的是Hook执行失败会导致backup操作失败,因此除非必要,请不要设置Hook

    velero debug

    查看backup的详细信息,带上detail可以查看备份的资源内容

    velero backup describe <backupName> --detail
    

    查看backup的服务日志

    velero backup logs <backupName>
    

    查看restore 的详细信息

    velero restore describe <restoreName> --detail
    

    查看restore 的服务日志

    velero restore logs <restoreName>
    

    查看velero服务日志

    kubectl logs deployment/velero -n velero
    

    download backup

    使用velero backup download ${BACKUP_NAME}可在本地生成一个backup的压缩包,包含backup的各个资源

    velero的删除

    执行以下命令可以删除velero

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

    velero暴露Prometheus metrics

    安装后的velero默认不会暴露Prometheus metrics。部署如下service,通过访问http://velero-exporter.velero.svc.cluster.local:8085/metrics查看metrics信息

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        velero: exporter
      name: velero-exporter
      namespace: velero
    spec:
      ports:
        - name: https
        port: 8085
        protocol: TCP
        targetPort: 8085
      selector:
        component: velero
    

    Disaster recovery


    • cluster1上创建velero schedule实现定期备份

    • cluster1发生DR时,在cluster2上执行如下命令即可

        kubectl patch backupstoragelocation <STORAGE LOCATION NAME> 
             --namespace velero 
             --type merge 
             --patch '{"spec":{"accessMode":"ReadOnly"}}'
      
      velero restore create --from-backup <SCHEDULE NAME>-<TIMESTAMP>
      
        kubectl patch backupstoragelocation <STORAGE LOCATION NAME> 
             --namespace velero 
             --type merge 
             --patch '{"spec":{"accessMode":"ReadWrite"}}'
      

      上述为官方解决方案,也可以将cluster2的backupstoragelocation直接设置为ReadOnly,此时cluster将无法创建/删除backup,仅能同步对象存储中的内容

      这里是一个例子,实现了将一个集群备份到阿里云上

    TIPS:


    • openstack无法直接访问阿里云oss

      可以在阿里ECS上创建反向代理,openstack通过反向代理连接阿里云oss。此时需要在velero的配置文件install/01-velero.yaml中增加如下地址解析

        hostAliases:
        - hostnames:
          - "${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com"
          ip: "${PROXY_IP}"
      

      在代理情况下,如果在node节点上使用velero命令行命令,需要在node节点上添加bucket ${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com的地址解析,如在/ets/hosts中添加如下内容

      ${OSS_PROXY_IP} ${BUCKET_NAME}.oss-cn-${REGION}-internal.aliyuncs.com
      
    • 进行集群备份的时候需要两个集群的kubernetes版本保持一致

    • 备份集群资源时最好指定需要备份的内容,防止受环境无法备份的资源的影响,如pv/pvc

    • 在cluster1创建backup到cluster2同步到该backup之间的时间差在90s以内,实现代码在pkg/controller/backup_sync_controller.go,velero每30s会调调度backupSyncController.runbackupSyncController.run函数中会对比backupstoragelocations.velero.io资源中的lastSyncedTime字段,当前时间与该字段(上一次同步时间)的时间差大于1min时才会进行同步。

      status:
        lastSyncedTime: 2019-10-25T06:05:49.496158379Z
      
    • velero有字段GC功能,一些无法删除或ttl超时的backup会在60min后被GC掉

    • velero集成了restic,用以备份容器的persistent volumes。使用velero备份persistent volumes时需要persistent volumes支持snapshots功能(快照功能通常由Amazon EBS Volumes, Azure Managed Disks, Google Persistent Disks等提供),否则需要单独使用restic,详见官方文档
      PS:restic不会支持阿里OSS (╬▔皿▔)凸

    • 如果没有Ali OSS,也可以通过自行搭建Minio作为对象存储服务

  • 相关阅读:
    String
    Xposed源码编译踩坑实录
    Hello 博客园
    HDU 1430 关系映射 + 打表 .
    HDU 1430 关系映射 + 打表 .
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
    hdu 1044 BFS(压缩图)+DFS
    hdu 1044 BFS(压缩图)+DFS
    hdu3338 最大流
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11738322.html
Copyright © 2020-2023  润新知