使用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作为对象存储服务

使用velero进行kubernetes灾备的更多相关文章

  1. Kubernetes Master节点灾备恢复操作指南---升级版

    本文档简述了Kubernetes主节点灾备恢复的相关步骤,供在发生k8s master崩溃时操作. 就算是在k8s里部署了etcd群集, 主节点控制组件的高可用节点,灾备恢复也是必须要实现的操作,才能 ...

  2. 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  3. 基于Ceph快照的异地灾备设计

    作者:吴香伟 发表于 2017/02/06 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 喜欢请点击右边打赏,谢谢支持! 引子 技术改变生活. 越来越方便的手机 ...

  4. 基于Cloudera Search设计数据灾备方案

    当实际项目上线到生产环境中,难以避免一些意外情况,如数据丢失.服务器停机等.对于系统的搜索服务来说,当遇到停机的情况意味着在停机这段时间内,用户都不能通过搜索的相关功能进行访问数据,停机意味着将这一段 ...

  5. Centos服务器上NFS灾备环境及KVM的搭建及使用

    1.概述 由于在单台服务器上搭建灾备环境需要KVM和NFS的支持,下面先列出KVM的搭建流程,再列出使用NFS实现单台服务器灾备的流程. A.搭建KVM环境 1>.主机环境准备 Linux Sy ...

  6. SQLServer 2014 本地机房HA+灾备机房DR解决方案

    SQLServer 2014 主数据中心HA+灾备机房DR解决方案 SQLServer 2008 的时候使用 local WSFC+DR Mirror方式,对象是单数据库 两个单独的 WSFC 上使用 ...

  7. mysql灾备演练问题

    前期写的mysql热备份脚本恢复,还没有正式用到过,但是今天演练灾备恢复,但是遇到几个问题. 测试环境: 搭建mysql,安装xtrabackup vim /etc/yum.repos.d/Perco ...

  8. 云区域(region),可用区(AZ),跨区域数据复制(Cross-region replication)与灾备(Disaster Recovery)(部分1)

    本文分两部分:部分1 和 部分2.部分1 介绍 AWS,部分2 介绍阿里云和OpenStack云. 1. AWS 1.1 AWS 地理组件概况 AWS 提供三种地理性组件: Regions:区域,即A ...

  9. MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】

    生产主主复制(A<--->B),和灾备主从复制(B--->C).当生产出现问题时,数据写入切换到灾备数据库,待生产恢复后,将灾备回写到生产.步骤如下: 1.灾备与生产其中一台建立主主 ...

随机推荐

  1. 三维网格精简算法(Quadric Error Metrics)附源码(转载)

    转载:  https://www.cnblogs.com/shushen/p/5311828.html 在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接 ...

  2. CTF挑战赛丨网络内生安全试验场第一季答题赛火热开启

    前期回顾:挑战世界级“人机大战”,更有万元奖金等你来拿 网络内生安全试验场自上线以来,受到了业内的极大重视与关注. 自9月2日报名通道开启后,报名量更是持续高升,上百名精英白帽踊跃报名. 至此,网络内 ...

  3. skipped obstructing working copy

    svn update时报错,处理方法,将报错的文件夹压缩备份一下,然后删除报错的文件夹,重新update即可.

  4. Nginx类

    nginx常见错误页面有哪些?对于其解决方法是什么? 404 bad request 请求失败,请求所希望得到的资源未被在服务器上发现.没有信息能够告诉用户这个状况到底是暂时的还是永久的.假如服务器知 ...

  5. JS高阶---事件循环模式(事件轮询)

    大纲: 相关知识点: 主体: (1)模型原理 JS部分:初始化代码执行 WebAPIS:执行上下文对象(不是一个真的对象,而是一个抽象的虚拟对象,可以看做栈里的一个区域,包含很多对象) setTime ...

  6. JS高阶---继承模式(借用构造函数继承+组合继承)

    (1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .

  7. JS高阶---函数的prototype

    思维导图 栈堆翻译为为stack (1)原型与原型链 概念一.原型对象 验证步骤: 1.打印Data函数的原型prototype 原型属性指向原型对象 ===ES源码结构分析示意=== 2.空对象 3 ...

  8. MP支持的主键策略

    MP 支持多种主键策略 默认是推特的“” 雪花算法“” ,也可以设置其他策略下面我演示主键策略使用 MP的主键定义在一个一个枚举类中 源码如下 public enum IdType { AUTO(0) ...

  9. c# 第16节 一维数组的声明及使用

    本节内容: 1:为什么要有使用数组 2:数组的简介 3:一维数组的声明 4: 实例数组声明 5:一维数组的使用 6:一维数组使用注意地方 1:为什么要使用数组 2:数组的简介 3:一维数组的声明 4: ...

  10. LeetCode 110. Balanced Binary Tree平衡二叉树 (C++)

    题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...