基于主机安装基于Kubernetes安装的 Rainbond 集群(均使用默认参数安装),默认使用的共享文件存储是 NFS ,以 Pod 方式运行在 Kubernetes 中,但这种方式也有一些无法避免的问题,比如:NFS 的 SVC 无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在 umount 导致不能正常关机等等。

当然还有切换共享文件存储的需求,在第一次安装 Rainbond 时,大多数都使用的默认安装,使用一段时间后想切换到外部的 NFS,或者云上的 NAS等等。

在原生的 Kubernetes 集群中,通过 StorageClass 创建的 PVC 是无法修改存储后端的,需要将 PV、PVC 删除后通过新的 StorageClass 创建新的 PVC,然后再将数据迁移,再重新挂载 PVC。当有很多个 PVC 时,需要多次重复的操作。

而 Rainbond 虽然也是通过 StorageClass 创建的 PVC,但相比原生 Kubernetes 省去了创建 PV、PVC 和重新挂载的步骤,以及重复性的操作。在 Rainbond 中只需要将底层存储类更换,然后迁移 Rainbond 所创建的一整个目录,最后重新在页面中修改挂载即可完成迁移。

本文将讲述如何迁移 Rainbond 默认的 NFS 存储到外部 NFS 存储,大致分为以下几个步骤:

  1. 部署外部 NFS 存储并对接到 K8s 上。
  2. 备份 NFS 存储的数据。
  3. 恢复备份数据并切换 Rainbond 默认存储至外部存储。

注意:

  • 关闭正在运行的应用,避免增量数据导致数据不一致。
  • 组件挂载的存储必须是共享存储,其他存储则需要单独迁移。

部署 NFS 并对接到 K8s 上

外部 NFS 存储可以选择部署 NFS 双机热备或其他方案,这里就不演示了,以单节点 NFS 为例。

在 Centos 上部署 NFS

  1. 安装 nfs-utils
yum install -y nfs-utils
  1. 创建共享目录
mkdir -p /data
  1. 编辑 /etc/exports 文件,添加如下内容:
$ vim /etc/exports

/data *(rw,sync,insecure,no_subtree_check,no_root_squash)
  1. 配置完成后,执行以下命令启动 NFS 服务:
systemctl enable nfs-server
systemctl start nfs-server
  1. 验证 NFS 是否可用
showmount -e 172.20.251.94

在 K8s 中部署 NFS Client

下面将外部的 NFS 存储对接到 Kubernetes 上,在 Kubernetes 中部署 NFS Client Provisioner

  1. 安装 Helm 命令

  2. 添加 Helm Chart 仓库

helm repo add rainbond https://openchart.goodrain.com/goodrain/rainbond
  1. 安装 NFS-Client-Provisioner
helm install nfs-client-provisioner rainbond/nfs-client-provisioner \
--set nfs.server=172.20.251.94 \
--set nfs.path=/data \
--version 1.2.8
  1. 验证 NFS Client 是否可用,创建 PVC 验证。
$ vim test-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: nfs-client $ kubectl apply -f test-pvc.yaml

查询 PVC 状态为 Bound 则正常。

备份默认 NFS 的数据

查看 rbd-system 下所有的 PVC。

kubectl get pvc -n rbd-system

PVC名称 解释
data 测试存储是否正常默认创建的PVC(无用)
data-nfs-provisioner-0 NFS Pod所使用的PVC,默认路径在宿主机的/opt/rainbond/data/nfs下。
data-rbd-monitor-0 存储监控数据。(可不要)
rbd-api 存储 api request 请求日志。(可不要)
rbd-chaos-cache 存储构建组件的缓存(可不要)
rbd-cpt-grdata 存储平台上所有组件挂载共享存储数据,以及组件的日志。(必须)
rbd-db-rbd-db-0 存储 MySQL 数据,默认是存在本地的,没存储在 NFS 中。
rbd-etcd-rbd-etcd-0 存储 Etcd 数据,默认是存在本地的,没存储在 NFS 中。
rbd-hub 存储镜像数据(必须)

以上数据中对于我们要迁移的重要数据有 rbd-cpt-grdatarbd-hub,根据 VOLUME 名称在默认的存储目录 /opt/rainbond/data/nfs 下查找,例如 pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3

使用 rsync 同步工具,将数据同步到新的 NFS 存储服务器上,根据以下命令开始同步,根据实际情况修改命令。

rsync -avP /opt/rainbond/data/nfs/pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3 root@172.20.251.94:/data
rsync -avP /opt/rainbond/data/nfs/pvc-d0bf09ca-5543-4050-bd08-b02ebb593b4e root@172.20.251.94:/data

注意:数据同步完成后切记要校验数据的完整性。

切换 Rainbond 存储

更改 Rainbond 默认存储

  1. 修改 rainbondcluster CRD资源,添加 storageClassName
$ kubectl edit rainbondcluster -n rbd-system

spec:
rainbondVolumeSpecRWX:
storageClassName: nfs-client #由 NFS-Client-Provisioner 创建的 sc
  1. 修改 rainbondvolumes CRD资源,修改 storageClassNamenfs-client
$ kubectl edit rainbondvolumes -n rbd-system

spec:
storageClassName: nfs-client
  1. 删除 Rainbond 基于默认 NFS 创建的 StorageClass rainbondsssc rainbondslsc
kubectl delete sc rainbondsssc rainbondslsc
  1. 删除 rbd-system 命名空间下旧的 PVC。这时候会删除不掉,因为还有 POD 在使用该 PVC,先 ctrl c 结束。
kubectl delete pvc data data-rbd-monitor-0 rbd-api rbd-chaos-cache rbd-cpt-grdata rbd-hub -n rbd-system
  1. 删除 Rainbond 组件的控制器让 rainbond-operator 控制 PVC 重新创建。
kubectl delete deploy rbd-api -n rbd-system
kubectl delete ds rbd-chaos -n rbd-system
kubectl delete sts rbd-monitor -n rbd-system
kubectl delete deploy rbd-worker -n rbd-system
kubectl delete deploy rbd-hub -n rbd-system
kubectl delete deploy rbd-resource-proxy -n rbd-system
kubectl delete sts rbd-eventlog -n rbd-system
kubectl delete ds rbd-node -n rbd-system
kubectl delete pod -l release=rainbond-operator -n rbd-system

等待所有 POD 重新创建,创建完成后 Rainbond 平台可正常访问,正常工作。

恢复数据

下面将前面备份的数据恢复到新创建的 PVC 中。

此时 rbd-cpt-grdatarbd-hub 新创建的目录下的数据都是自动创建,先将其删除。

rm -rf /data/rbd-system-rbd-cpt-grdata-pvc-44167209-1006-4de5-9801-afcce996449c/*
rm -rf /data/rbd-system-rbd-hub-pvc-c326b89f-7c0e-4990-a8e2-31472799ccc8/*

再将备份的 rbd-cpt-grdatarbd-hub 数据分别同步到新的目录中,例如以下命令。

rsync -avP /data/pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3/* /data/rbd-system-rbd-cpt-grdata-pvc-44167209-1006-4de5-9801-afcce996449c
rsync -avP /data/pvc-d0bf09ca-5543-4050-bd08-b02ebb593b4e /data/rbd-system-rbd-hub-pvc-c326b89f-7c0e-4990-a8e2-31472799ccc8

注意:数据同步完成后切记要校验数据的完整性。

重新 Rainbond 部分组件的 POD 生效。

kubectl delete pod -l name=rbd-api -n rbd-system
kubectl delete pod -l name=rbd-chaos -n rbd-system
kubectl delete pod -l name=rbd-monitor -n rbd-system
kubectl delete pod -l name=rbd-worker -n rbd-system
kubectl delete pod -l name=rbd-hub -n rbd-system
kubectl delete pod -l name=rbd-resource-proxy -n rbd-system
kubectl delete pod -l name=rbd-eventlog -n rbd-system
kubectl delete pod -l name=rbd-node -n rbd-system

更改 Rainbond 上的组件存储

替换底层存储后,此时 Rainbond 上组件的存储还未修改,此时需要进入 Rainbond 的组件中将当前存储删除重新添加。

挂载路径、存储类型保持不变,删除当前的配置添加新的同样配置即可。

至此存储切换完成,后续请验证应用的数据是否都完整。

删除默认 NFS 存储资源(可选)

修改 CRD 资源,将 nfs-provisioner replicas 设置为 0

$ kubectl edit rbdcomponent nfs-provisioner -n rbd-system

spec:
replicas: 0

删除 nfs-provisioner 控制器

kubectl delete sts nfs-provisioner -n rbd-system

删除 nfs-provisioner 的 PV、PVC

kubectl delete pvc data-nfs-provisioner-0 -n rbd-system
kubectl delete pv nfs-provisioner

删除宿主机上的 NFS 数据存储目录

rm -rf /opt/rainbond/data/nfs

Kubernetes跨StorageClass迁移,切换Rainbond默认SC的更多相关文章

  1. 虚拟化学习笔记-KVM虚拟化跨机迁移原理

    参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...

  2. redis跨实例迁移 & redis上云

    1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...

  3. 利用Snapshot快速跨Region迁移服务器

    当你需要对现有的网站进行跨区域迁移,或者是部署DR Site的时候,又不希望重新部署应用,有什么好办法呢?其实你可以利用Azure的磁盘snapshot进行磁盘级的复制,这样可以减少很多部署应用的时间 ...

  4. vue项目页面切换到默认显示顶部

    页面切换到默认显示顶部 方法一 使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页 ...

  5. kubernetes跨网段pod网络不通问题

    kubernetes跨网段问题 k8s的master是10.10.10.0网段,新加了一些node,网段是172.16.100.0网段,造成容器直接网络不能相互访问. 部署k8s的时候也部署了flan ...

  6. 使用ADMT和PES实现window AD账户跨域迁移-介绍篇

    使用 ADMT 和 pwdmig 实现 window AD 账户跨域迁移系列: 介绍篇 ADMT 安装 PES 的安装 ADMT:迁移组 ADMT:迁移用户 ADMT:计算机迁移 ADMT:报告生成 ...

  7. HarmonyOS新能力让数据多端协同更便捷,数据跨端迁移更高效!

    作者:yijian,终端OS分布式文件系统专家:gongashi,终端OS分布式数据管理专家 HarmonyOS作为分布式操作系统,其分布式数据管理能力非常重要.我们也一直围绕持续为开发者带来全局&q ...

  8. 巧用 JuiceFS Sync 命令跨云迁移和同步数据

    近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务 ...

  9. 实现Kubernetes跨集群服务应用的高可用

    在Kubernetes 1.3版本,我们希望降低跨集群跨地区服务部署相关的管理和运营难度.本文介绍如何实现此目标. 注意:虽然本文示例使用谷歌容器引擎(GKE)来提供Kubernetes集群,您可以在 ...

  10. 物化视图基础概念、mview跨库迁移表

    概念:物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样 ...

随机推荐

  1. 如何洞察 .NET程序 非托管句柄泄露

    一:背景 1. 讲故事 很多朋友可能会有疑问,C# 是一门托管语言,怎么可能会有非托管句柄泄露呢? 其实一旦 C# 程序与 C++ 语言交互之后,往往就会被后者拖入非托管泥潭,让我们这些调试者被迫探究 ...

  2. 电子表格vlookup函数使用

    vlookup是常用的辅助查找函数,但是这个函数的参数定义和解释非常的难以理解,即使用向导也很难搞清楚哪个参数是啥意思.放到编程圈里面应该也算bad design的典型了.下面是函数的定义,每次看到这 ...

  3. 【HTML】Echart图表

    layui-echarts 简介 基于layui 实现的 echart 图表 Echart 官网 示例 Echart示例 下载Echart Echart下载 我们选择最下面的在线定制 我这里就按照它默 ...

  4. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10)- 从Serial NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1xxx系列MCU的Serial NAND启动. 最近越来越多的客户在咨询 i.MXRT1xxx 从 Serial N ...

  5. linux内核笔记(二)微机计算机组成结构

    一个系统有四个基本组成部分: 输入部分:接收系统的数据(键盘等) 处理中心:处理(cpu) 能源部分:处理需要的硬件资源(内存等) 输出部分:显示给用户(显示器等) 计算机系统分为: 计算机系统分为软 ...

  6. [爬虫]1.2.2 CSS选择器

    CSS (Cascading Style Sheets) 是一种样式表语言,用于描述HTML元素的样式.CSS选择器是CSS规则的一部分,它决定了CSS规则应用于哪些元素.在网络爬虫的开发中,我们经常 ...

  7. shell: xcall

    #!/bin/bash ips=( 1.1.1.2 1.1.1.1 ) port= user= passwd= for i in ${ips[@]} do echo "== $i ==&qu ...

  8. 2021-7-7 Vue实现切换图片功能代码

    <!DOCTYPE html> <html> <head> <title> </title> </head> <body& ...

  9. UPS设备在物流机房中的应用浅析

    1 UPS 简介 UPS 即不间断电源 (Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. 当市 ...

  10. Django:TypeError: view must be a callable or a list/tuple in the case of include().

    错误: path("uploads/(?P<path>.*)$", 'django.views.static.serve', {"document_root& ...