前言

Kubernetes 集群备份一直是我们的痛点。虽然可以通过Etcd v3备份与恢复来实现K8S集群备份,但是这种备份很难恢复单个 Namespace

今天推荐 Velero 工具,它提供以下功能:

  • 灾备场景:提供备份恢复k8s集群的能力

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

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

Velero 阿里云插件地址:https://github.com/AliyunContainerService/velero-plugin

Velero 架构

Velero 分为两部分:

  • 服务端:部署在目标 k8s 集群中

  • 客户端:运行在本地环境中,需要已配置好 kubectl 及集群 kubeconfig 的机器上

环境准备

K8S 集群版本为 v1.18.2

阿里云 Velero 自定义 RAM策略

{"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"}]
}
  • 创建阿里云 OSS(对象存储)Bucket

    • 创建 OSS Bucket 请访问 https://www.aliyun.com/product/oss?spm=a2c6h.12873639.0.0.5f49340drYAEk0

  • 创建阿里云 RAM用户,并自定义策略,把自定义策略加入到新创建的RAM用户

    • 创建自定义策略(策略在上方),请访问链接 https://ram.console.aliyun.com/policies

    • 创建 RAM用户并把AK信息复制出来为后面使用做准备,请参考链接 https://www.alibabacloud.com/help/zh/doc-detail/93720.htm

  • 下载官方 velero 客户端 ( https://github.com/vmware-tanzu/velero/releases )

部署 velero 插件服务端

项目地址 https://github.com/AliyunContainerService/velero-plugin

下载 velero 阿里云插件服务端

# 拉取 velero 阿里云插件服务端
$ git clone https://github.com/AliyunContainerService/velero-plugin.git# 进入 velero-plugin 目录
$ cd velero-plugin

设置阿里云AK信息

把上面创建的 RAM用户 AK 信息填写到 credentials-velero 文件中

$ vim install/credentials-veleroALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>

设置备份 OSS Bucket 与 可用区 并部署 velero

1、设置备份 OSS Bucket 和 可用区 环境变量

# OSS Bucket 名称
$ BUCKET=<YOUR_BUCKET># OSS 所在可用区
$ REGION=<YOUR_REGION>

2、创建 velero 命名空间 和 阿里云 secret

# 创建 velero 命名空间
$ kubectl create namespace velero# 创建阿里云 secret
$ kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero

3、部署 velero CRD 和 替换 OSS Bucket 与 OSS 所在可用区

# 部署 velero CRD
$ kubectl apply -f install/00-crds.yaml# 替换 OSS Bucket 与 OSS 所在可用区
$ sed -i "s#<BUCKET>#$BUCKET#" install/01-velero.yaml
$ sed -i "s#<REGION>#$REGION#" install/01-velero.yaml

注意,本文把 velero 生成的备份都存放在 OSS velero-k8s-backu Bucket huawei-k8s 目录中,具体如下配置:

# 下面是本文的修改
$ git diff  install/01-velero.yaml@@ -31,10 +31,10 @@ metadata:namespace: velerospec:config:
-    region: <REGION>
+    region: cn-beijingobjectStorage:
-    bucket: <BUCKET>
-    prefix: ""
+    bucket: velero-k8s-backup
+    prefix: "huawei-k8s"provider: alibabacloud---
@@ -47,11 +47,11 @@ metadata:namespace: velerospec:config:
-    region: <REGION>
+    region: cn-beijingprovider: alibabacloud---
-apiVersion: extensions/v1beta1
+apiVersion: apps/v1kind: Deploymentmetadata:name: velero

4、部署 velero

# 部署 velero
$ kubectl apply -f install/01-velero.yaml# 查看 velero
$ kubectl  get pods -n veleroNAME                      READY   STATUS    RESTARTS   AGE
velero-6d4c7d4c9b-5zwll   1/1     Running   0          3h5m

备份与恢复演示

1、部署一个测试 nginx 服务

$ kubectl apply -f examples/base.yaml

2、使用 velero 创建备份

# 备份 nginx-example 整个命名空间,当前命名空间只有一个nginx服务
$ velero backup create nginx-backup --include-namespaces nginx-example --waitBackup request "nginx-backup" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
.
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe nginx-backup` and `velero backup logs nginx-backup`.

下面是通过阿里云 OSS 控制台查看,nginx-backup 已成功创建

3、删除 nginx 服务

$ kubectl delete -f examples/base.yamldeployment.apps "nginx-deployment" deleted
service "my-nginx" deleted

4、恢复 nginx 服务

# 使用 velero 恢复 nginx 服务
$ velero restore create --from-backup nginx-backup --waitRestore request "nginx-backup-20200623174649" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.Restore completed with status: Completed. You may check for more information using the commands `velero restore describe nginx-backup-20200623174649` and `velero restore logs nginx-backup-20200623174649`.# 查看 nginx 服务 是否成功恢复
$ kubectl  get pods -n nginx-exampleNAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5bf87f5f59-gs2cs   1/1     Running   0          27s
nginx-deployment-5bf87f5f59-vts6d   1/1     Running   0          27s

注意:velero restore 恢复不会覆盖已有的资源,只恢复当前集群中不存在的资源。已有的资源不会回滚到之前的版本,如需要回滚,需在restore之前提前删除现有的资源。

带有持久卷备份与恢复

持久卷备份

$ velero backup create nginx-backup-volume --snapshot-volumes --include-namespaces nginx-example

注意:该备份会在集群所在region给云盘创建快照(当前还不支持NAS和OSS存储),快照恢复云盘只能在同region完成。

持久卷恢复

$ velero  restore create --from-backup nginx-backup-volume --restore-volumes

velero 更多命令使用

查看备份位置

$ velero get backup-locationsNAME      PROVIDER       BUCKET/PREFIX                  ACCESS MODE
default   alibabacloud   velero-k8s-backup/huawei-k8s   ReadWrite

查看已有的备份

$ velero get backup

查看已有的恢复

$ velero get restores

查看 velero 插件

$ velero get plugins

删除 velero 备份

$ velero backup delete nginx-backup

创建集群所有namespaces备份,但排除 velero,metallb-system 命名空间

$ velero backup create all-ns-backup --snapshot-volumes=false --exclude-namespaces velero,metallb-system

恢复集群所有namespaces备份(对已经存在的服务不会覆盖)

$ velero restore create --from-backup all-ns-backup

恢复集群 default,nginx-example namespaces备份

$ velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example

高级备份功能

周期性定时备份

# 每日3点进行备份
$ velero schedule create <SCHEDULE NAME> --schedule "0 3 * * *"# 每日3点进行备份,备份保留48小时,默认保留30天
$ velero schedule create <SCHEDULE NAME> --schedule "0 3 * * *" --ttl 48# 每6小时进行一次备份
$ velero create schedule <SCHEDULE NAME> --schedule="@every 6h"# 每日对 web namespace 进行一次备份
$ velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces web

添加指定的标签备份时被排除

# 添加标签
$ kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true# 为 default namespace 添加标签
$ kubectl label -n default namespace/default velero.io/exclude-from-backup=true

迁移场景

和集群恢复场景类似,velero 可以帮助我们把一个k8s集群的resource导出并导入到另外一个集群,只要将每个Velero实例指向同一个云对象存储位置,Velero就可以帮助我们将资源从一个集群移植到另一个集群,请注意,Velero不支持跨云提供商迁移持久卷。当前使用velero迁移集群功能最完善的场景是在同一个云厂商的同一个region,可以恢复集群的应用和数据卷。

在集群1上做一个备份:

$ velero backup create <BACKUP-NAME> --snapshot-volumes

在集群2上做一个恢复:

$ velero restore create --from-backup <BACKUP-NAME> --restore-volumes

velero 清理

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

总结

Velero 作为一个免费的开源组件,其能力基本可以满足容器服务的灾备和迁移的场景,推荐用户将velero日常备份作为运维的一部分,未雨绸缪,防患未然。

参考链接

  • https://developer.aliyun.com/article/705007

  • https://github.com/AliyunContainerService/velero-plugin

热门文章推荐

  • Kubernetes故障排查指南-分析容器退出状态码

  • Kubeconfig文件自动合并-实现K8S多集群切换

  • 比Kubernetes Dashboard更好用的K8S管理工具 Kuboard

  • Grafana 采集阿里云SLB监控信息

  • Kubernetes 中利用 LXCFS 控制容器资源可见性

  • Kubernetes 私有集群 LoadBalancer 解决方案

最后

  • 欢迎您加我微信【ypxiaozhan01】,拉您进技术群,一起交流学习...

  • 欢迎您关注【YP小站】,学习互联网最流行的技术,做个专业的技术人...


【文章让您有收获,点个在看支持我吧】

K8S备份、恢复、迁移神器 Velero相关推荐

  1. 备份和迁移Kubernetes应用程序利器-velero

    女主宣言 你是否在运维kubernetes集群中有过这样的经历: ⼀个新⼈把某个namespace点击删除,导致这下⾯所有的资源全部丢失,只能⼀步⼀步的重新部署.新搭建集群,为了保证环境尽可能⼀致,只 ...

  2. Velero备份恢复

    Velero k8s集群的数据备份方式有两种,第一种是备份etcd数据库,这种备份方式比较简单,但是恢复数据时只能全部恢复.试想一下,需求是恢复误删除的一个namespace,恢复时却要将整个etcd ...

  3. TiDB数据库备份恢复与数据迁移

    TiDB数据库备份恢复与数据迁移 数据迁移 使用 mydumper/loader 全量导入数据 mydumper/loader 全量导入数据最佳实践 某次导入示例,以及相关的配置 从 MySQL 导出 ...

  4. 版本管理工具Subversion Edge的备份恢复与数据迁移方案

    软件开发生命周期中会使用到多种工具,这些工具的更迭与迁移,备份与恢复都构成了软件开发生命周期的重要部分.这篇文章以当下最新版本的Subversion Edge为例介绍一下其备份恢复与数据迁移方案,因相 ...

  5. docker下Gitlab如何进行备份恢复与迁移?

    首先进入到gitlab容器 docker exec -it gitlab /bin/bash 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitlab整体备份,使用Git ...

  6. Oracle 运维篇+RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要

    说明:本文为Oracle RAC集群转单实例/RMAN异机恢复/RMAN迁移/RMAN备份恢复操作概要方便用户查阅 温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化 说 ...

  7. 用RMAN 备份异机恢复 迁移数据

    先假设一种情况,假设有一个数据库,数据量是2T. 如果要对这个数据库进行迁移,在不考虑磁盘空间的前提下,要求在最短的时间内完成切换操作. 在不考虑磁盘空间前提下,备份时间,网络传输时间,恢复时间. 这 ...

  8. “免费”容器存储及备份恢复方案

    云原生时代为什么还需要本地存储? 云原生时代,对于有存储应用的容器化上云,一般的解决思路是"计算存储分离",计算层通过容器技术实现弹性伸缩,而相应的存储层也需要配合进行" ...

  9. Kubernetes 上免费的容器存储及容灾备份恢复方案

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 云原生时代为什么还需要本地存储? 云原生时代,对于有存储应用的容器化上云,一般的解决思路是"计算存储分离 ...

最新文章

  1. RAC分解步骤之一,在oracle linux 4u4上安装oracle 10.2.0.1.0操作日志
  2. php7安装kafka扩展(已经测试)
  3. 使用字符串解析的方式完成计算器的设计思路
  4. CSS3+JS切割轮播图
  5. 在给定总和K的二叉树中找到级别
  6. mac下终端命令行下添加mysql命令
  7. 【23】蔡高厅老师 - 高等数学下阅读笔记 - 重积分 - 直角坐标系下(下)23 - 27
  8. Open vswitch 之Qos rate-limiting 原理
  9. 微软 Build 2020 为 WSL 带来的新消息一览:WSL2 即将到来,对 GPU 和 Linux GUI 的支持也不远了
  10. excel首行空不能导入access_终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01...
  11. 如何判断各个IE浏览器版本
  12. Linux:使用libgen.h:basename,dirname
  13. windows下创建多个回收站
  14. 2022程序员必备网站
  15. Linux小程序——彩色进度条
  16. 曲线上点的曲率半径计算
  17. 深度 | 巨头都在追逐的眼球追踪技术,究竟能带来什么?
  18. C语言结构标记的作用,C语言基础知识之词法符号
  19. Java的在哪里找labor_Java流程控制
  20. 如何计算网站或应用程序的带宽需求

热门文章

  1. 【笔记】excel做累计到天的销售公式匹配原理
  2. 学习傅里叶变换的心得
  3. ArcGIS如何拼接两张栅格图像
  4. 【我的第一个目标检测课题】1、课题介绍及环境配置(Windows+Keras+GPU)
  5. 视觉算法工程师面试总结[2022春季 达摩院 美团 字节 华为]
  6. 51单片机学习之DS18B20温度传感器
  7. [iOS]NSArray:数组(NSArray)使用注意
  8. Perl中的闭包(closure)
  9. VS LINK : fatal error LNK1104: 无法打开文件.exe
  10. html分享标题描述图片尺寸,微信分享网页时自定义标题、描述和图片