Kubernetes跨StorageClass迁移,切换Rainbond默认SC
基于主机安装或基于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 存储,大致分为以下几个步骤:
- 部署外部 NFS 存储并对接到 K8s 上。
- 备份 NFS 存储的数据。
- 恢复备份数据并切换 Rainbond 默认存储至外部存储。
注意:
- 关闭正在运行的应用,避免增量数据导致数据不一致。
- 组件挂载的存储必须是共享存储,其他存储则需要单独迁移。
部署 NFS 并对接到 K8s 上
外部 NFS 存储可以选择部署 NFS 双机热备或其他方案,这里就不演示了,以单节点 NFS 为例。
在 Centos 上部署 NFS
- 安装
nfs-utils
yum install -y nfs-utils
- 创建共享目录
mkdir -p /data
- 编辑
/etc/exports文件,添加如下内容:
$ vim /etc/exports
/data *(rw,sync,insecure,no_subtree_check,no_root_squash)
- 配置完成后,执行以下命令启动 NFS 服务:
systemctl enable nfs-server
systemctl start nfs-server
- 验证 NFS 是否可用
showmount -e 172.20.251.94
在 K8s 中部署 NFS Client
下面将外部的 NFS 存储对接到 Kubernetes 上,在 Kubernetes 中部署 NFS Client Provisioner
安装 Helm 命令
添加 Helm Chart 仓库
helm repo add rainbond https://openchart.goodrain.com/goodrain/rainbond
- 安装 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
- 验证 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-grdata 和 rbd-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 默认存储
- 修改
rainbondclusterCRD资源,添加storageClassName
$ kubectl edit rainbondcluster -n rbd-system
spec:
rainbondVolumeSpecRWX:
storageClassName: nfs-client #由 NFS-Client-Provisioner 创建的 sc
- 修改
rainbondvolumesCRD资源,修改storageClassName为nfs-client
$ kubectl edit rainbondvolumes -n rbd-system
spec:
storageClassName: nfs-client
- 删除 Rainbond 基于默认 NFS 创建的 StorageClass
rainbondssscrainbondslsc
kubectl delete sc rainbondsssc rainbondslsc
- 删除
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
- 删除 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-grdata 和 rbd-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-grdata 和 rbd-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的更多相关文章
- 虚拟化学习笔记-KVM虚拟化跨机迁移原理
参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...
- redis跨实例迁移 & redis上云
1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...
- 利用Snapshot快速跨Region迁移服务器
当你需要对现有的网站进行跨区域迁移,或者是部署DR Site的时候,又不希望重新部署应用,有什么好办法呢?其实你可以利用Azure的磁盘snapshot进行磁盘级的复制,这样可以减少很多部署应用的时间 ...
- vue项目页面切换到默认显示顶部
页面切换到默认显示顶部 方法一 使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页 ...
- kubernetes跨网段pod网络不通问题
kubernetes跨网段问题 k8s的master是10.10.10.0网段,新加了一些node,网段是172.16.100.0网段,造成容器直接网络不能相互访问. 部署k8s的时候也部署了flan ...
- 使用ADMT和PES实现window AD账户跨域迁移-介绍篇
使用 ADMT 和 pwdmig 实现 window AD 账户跨域迁移系列: 介绍篇 ADMT 安装 PES 的安装 ADMT:迁移组 ADMT:迁移用户 ADMT:计算机迁移 ADMT:报告生成 ...
- HarmonyOS新能力让数据多端协同更便捷,数据跨端迁移更高效!
作者:yijian,终端OS分布式文件系统专家:gongashi,终端OS分布式数据管理专家 HarmonyOS作为分布式操作系统,其分布式数据管理能力非常重要.我们也一直围绕持续为开发者带来全局&q ...
- 巧用 JuiceFS Sync 命令跨云迁移和同步数据
近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移到另一个云平台,业务 ...
- 实现Kubernetes跨集群服务应用的高可用
在Kubernetes 1.3版本,我们希望降低跨集群跨地区服务部署相关的管理和运营难度.本文介绍如何实现此目标. 注意:虽然本文示例使用谷歌容器引擎(GKE)来提供Kubernetes集群,您可以在 ...
- 物化视图基础概念、mview跨库迁移表
概念:物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样 ...
随机推荐
- 消灭非稳态噪音的利器 - AI 降噪
摘要:轻量级神经网络降噪方法,解析 ZegoAIDenoise 的算法实现! 文|即构引擎开发团队 一.轻量级神经网络降噪--ZegoAIDenoise 当下,用户在进行音频通话时常常置身于各种不同的 ...
- Blazor前后端框架Known-V1.2.5
V1.2.5 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...
- 今日ERROR
树莓派插卡发烫严重 首先,我们要知道: 树莓派的指示灯可以告诉用户系统的工作状态,常见的指示灯有四个,分别是红色电源灯.绿色SD卡读写灯.黄色ACT指示灯和蓝色网络连接指示灯(仅适用于某些型号的树莓派 ...
- Linux中的进程页表
是什么 进程页表是用于管理进程虚拟地址空间和物理内存之间映射关系的数据结构.它记录了进程中每个虚拟页对应的物理页的信息. 什么作用 进程使用进程页表的方式是通过虚拟地址访问内存.当进程访问一个虚拟地址 ...
- 《HelloGitHub》第 88 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- html元数据
元数据就是用来描述数据的数据.HTML中也有很多元数据. <meta>标签提供关于HTML文档的元数据:描述(description)\关键词(keywords).文档的作者(author ...
- python-stack
implements list deque LifoQueue 原文地址:https://realpython.com/how-to-implement-python-stack/ Argue lis ...
- Hugging News #0814: Llama 2 学习资源大汇总 🦙
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 从0开始,Cloudreve开源云盘在centos7上部署,并可在外网访问(资料整合)
全程我在网络上收集这些资料,太零碎了,每一个一看就会,一动手就废,而且很多都不能实现我白嫖的梦想 我一个人折腾了快一周,现在可以正常访问手机电脑多端访问 给个赞再走吧 此处为没有公网IP(回去折腾你家 ...
- 论文解读(TAMEPT)《A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classification》
论文信息 论文标题:A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classificati ...