Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

K8S集群跨云迁移

27
Dec
2022

K8S集群跨云迁移

By Alex
/ in PaaS
/ tags K8S
0 Comments

要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题:

  1. 各种K8S资源的迁移
  2. 工作负载所挂载的数据卷的迁移
  3. 工作负载所使用的镜像的迁移

K8S资源、数据卷的迁移,可以考虑基于Velero项目。镜像仓库的迁移较为简单,可供选择的开源工具包括阿里云的image-syncer、腾讯云的image-transfer。

Velero
简介

Velero是一个专注于K8S集群备份与恢复的开源项目,通过备份源集群,并在目标集群进行恢复,即可完成集群的跨云迁移。

Velero由一组运行在被备份/恢复的K8S集群中的服务,外加一个CLI客户端组成。服务端包含若干控制器,这些控制器监听备份、恢复相关的自定义资源(CRD)并进行处理。CLI主要是提供了创建、修改、删除自定义资源的快捷方式,让用户不必编写复杂的YAML。

主要新特性

在Kubernetes故障检测和自愈一文中,我们对Velero做过调研,这三年多时间里,Velero新增加的特性包括:

  1. 多读写的持久卷不会被重复备份
  2. 云服务商插件从Velero代码库独立出
  3. 基于Restic的持久卷备份总是增量的,即使Pod被调度走
  4. 克隆命名空间(将备份恢复到另外一个命名空间)时自动克隆相关的持久卷
  5. 支持处理基于CSI驱动创建的持久卷,目前支持的厂商包括AWS、Azure、GCP
  6. 支持报告备份、恢复的进度
  7. 支持备份资源的所有API版本
  8. 支持自动基于Restic进行卷备份(--default-volumes-to-restic)
  9. 选项restoreStatus,用于定制那些资源的状态会被恢复
  10. --existing-resource-policy用于修改默认的恢复策略。默认策略时当资源存在时不覆盖(除了ServiceAccount),该选项设置为update,则会更新已存在的资源
  11. 从1.10开始,支持Kopia,作为Restic的备选。Kopia在备份时消耗的时间较少、在备份数据量很大或者文件数量很多时,Kopia常常有更好的性能
备份流程

备份分为两种方式:按需备份、周期性备份。它们都是收集(支持过滤)K8S资源并打包上传到存储后端(例如云服务商的对象存储)。

备份的典型流程如下:

  1. 用户通过命令 velero backup create创建 Backup资源
  2. 控制器 BackupController监听到新创建的Backup资源,并进行校验
  3. 校验成功后BackupController开始执行备份操作。默认情况下会为所有持久卷创建快照,使用命令行选项 --snapshot-volumes=false改变此默认行为
  4. BackupController调用对象存储,上传备份文件

备份资源的时候,Velero使用首选API版本(preferred version)获取和保存资源。举例来说,源API Server中teleport组具有v1alpha1、v1两个版本,其中v1是首选版本,那么Velero备份的时候将使用v1格式存储资源。在恢复的时候,目标集群必须支持teleport/v1版本(但不必是首选版本),这意味着,恢复到和源的版本不同的K8S集群可能会出错,因为API版本会有新增或删除。

备份的时候,可以通过--ttl来指定备份的存留时间。当存留时间到达后,备份中的K8S资源、备份文件、快照、关联的Restore,均被删除。如果删除失败Velero会给Backup对象添加velero.io/gc-failure=REASON标签。

需要注意:Velero基于快照的卷备份,在跨云迁移这一场景下,是没有意义的,不可能把云A生成的快照拿到云T上恢复。

恢复流程

恢复是将先前生成的备份(包括K8S资源 + 数据卷),同步到目标K8S集群的过程。目标集群可以是源集群自身,可以对备份中的资源进行过滤,仅恢复一部分数据。

恢复产生的K8S资源,具有velero.io/restore-name=RESTORE_NAME标签。RESTORE_NAME即Restore资源的名字,默认形式为BACKUP_NAME-TIMESTAMP,TIMESTAMP的默认格式为YYYYMMDDhhmmss。

恢复的典型流程如下:

  1. 用户通过命令 velero restore create创建 Restore资源
  2. 控制器 RestoreController监听到新创建的Restore资源,并进行校验
  3. 校验成功后,RestoreController从对象存储中获取备份的信息,对备份的资源进行一些预处理,例如API版本检查,以保证它们能够在新集群中运行
  4. 开始逐个资源的进行恢复

默认情况下,Velero不会对目标集群进行任何修改、删除操作,如果某个资源已经存在,它会简单的跳过。设置 --existing-resource-policy=update则Velero会尝试修改已经存在的资源,使其和备份中的同名资源内容匹配。

关于对象存储

保存备份信息的对象存储,是Velero的单一数据源(source of truth),也就是说:

  1. 如果对象存储中具有备份信息,但是K8S API资源中没有对应的Backup对象,那么会自动创建这些对象
  2. 如果K8S中有Backup对象,但是在对象存储中没有对应信息,那么此Backup会被删除

这一特性也让跨云迁移场景获益 —— 源、目标集群不需要任何直接的关联,云服务商的对象存储服务将作为唯一的媒介。

定义对象存储位置的CRD是 BackupStorageLocation,它可以指向一个桶,或者桶中的某个前缀,Velero备份的元数据数据存放在其中。通过文件系统方式(Restic/Kopia)备份的卷,也存放在桶中。通过快照方式备份的卷的数据,其存储机制是云服务商私有的,不会存放到桶中。

每个Backup可以使用一个BackupStorageLocation。

关于快照

存储卷快照相关的信息存储存储在 VolumeSnapshotLocation中,由于快照实现技术完全取决于云服务商,因此该CRD的包含的字段取决于对应插件。

每个Backup,对于任何一个Volume Provider,可以使用一个VolumeSnapshotLocation。

关于提供者

Velero提供了一种插件机制,将存储提供者从Velero核心中独立出来。

钩子机制

Velero提供了若干钩子来扩展标准的备份/恢复流程。

备份钩子在备份流程中执行。例如你可以利用备份钩子,在创建快照前,通知数据库刷空内存缓冲。

恢复钩子在恢复流程中执行。例如你可以在应用启动前,通过钩子进行某种初始化操作。

安装
安装CLI

目前最新稳定版本是1.9.5,点击此连接,选择匹配操作系统的压缩包,下载解压,存放velero到$PATH即可。执行下面的命令配置自动提示:

Shell
1
echo 'source <(velero completion bash)' >>~/.bashrc 

下面的命令实例,展示了如何进行客户端设置:

Shell
1
2
3
4
# 启用客户端特性
velero client config set features=EnableCSI
# 关闭彩色字符输出
velero client config set colorized=false
安装服务端

使用CLI安装:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
velero install
    # 指定命名空间
    --namespace=teleport-system
    # 支持基于文件系统的卷备份(FSB)
    --use-node-agent
    # 默认启用基于文件系统的卷备份,来备份所有Pod卷。缺省行为是必须指定注解才备份
    # backup.velero.io/backup-volumes=YOUR_VOLUME_NAME_1,YOUR_VOLUME_NAME_2,...
    # 如果准备使用FSB作为唯一的卷备份机制,可以开启
    # 启用该命令后,如果还想在某次备份时,使用快照备份,使用命令 backup create --snapshot-volumes
    # 也可以在备份时使用backup create --default-volumes-to-fs-backup,而不是在安装阶段全局性设置
    --default-volumes-to-fs-backup
    # 特性开关,这些开关也会被传递给node-agent
    --features=EnableCSI,EnableAPIGroupVersions
    # 设置资源请求/限制。默认值对于1000-资源、100GB-卷的场景足够。如果使用FSB,则可能需要增加资源请求/限制
    --velero-pod-cpu-request
    --velero-pod-mem-request
    --velero-pod-cpu-limit
    --velero-pod-mem-limit
    --node-agent-pod-cpu-request
    --node-agent-pod-mem-request
    --node-agent-pod-cpu-limit
    --node-agent-pod-mem-limit
    # 在安装阶段,你可以指定一个BackupLocation和SnapshotLocation
    --provider aws
    --bucket backups
    --secret-file ./aws-iam-creds
    --backup-location-config region=us-east-2
    --snapshot-location-config region=us-east-2
    # 如果在安装阶段,不配置BackupLocation,可以不指定--bucket和--provider,同时:
    --no-default-backup-location
    # 仅仅生成YAML
    --dry-run -o yaml

在安装完毕后,你可以设置默认的 BackupLocation、SnapshotLocation:

Shell
1
2
3
4
5
6
7
8
velero backup-location create backups-primary \
    --provider aws \
    --bucket velero-backups \
    --config region=us-east-1 \
    --default
 
# SnapshotLocation需要为每一个volume snapshot provider设置
velero server --default-volume-snapshot-locations="PROVIDER-NAME:LOCATION-NAME,PROVIDER2-NAME:LOCATION2-NAME"

在安装完毕后,可以添加额外的volume snapshot provider:

Shell
1
2
3
velero plugin add registry/image:version
# 为此volume snapshot provider配置SnapshotLocation
velero snapshot-location create NAME -provider PROVIDER-NAME [--config PROVIDER-CONFIG]
测试跨云迁移

我们分别在阿里云、腾讯云上创建一个K8S集群,分别作为源、目标集群,并尝试利用Velero将工作负载从源迁移到目标。

创建集群

到云服务商的控制台创建,这里不赘述具体步骤。

无状态工作负载迁移

目前K8S集群的主流用法是运行无状态的工作负载。数据库等有状态的基础服务,大多数用户选择使用云平台提供的PaaS产品。这一现状实质上让K8S的迁移变得简单,因为基本不需要考虑数据卷的问题。

这里以一个Nginx的Deployment + Service为例,测试Velero的备份、恢复特性。首先在源集群创建相应K8S资源:

nginx.yaml
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        ports:
        - containerPort: 80
 
---
 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

 

 

← Terraform快速参考
享学营笔记 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Kata Containers学习笔记
  • Kustomize学习笔记
  • 基于Helm的Kubernetes资源管理
  • IPVS模式下ClusterIP泄露宿主机端口的问题
  • 限制Pod磁盘空间用量

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • Bazel学习笔记 38 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2