基于主机安装或
基于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 存储可以选择部署 NFS 双机热备或其他方案,这里就不演示了,以单节点 NFS 为例。
nfs-utilsyum install -y nfs-utils
mkdir -p /data
/etc/exports 文件,添加如下内容:
$
vim
/
etc
/
exports
/
data
*(
rw
,
sync
,
insecure
,
no_subtree_check
,
no_root_squash
)
systemctl enable nfs
-
server
systemctl start nfs
-
server
showmount -e 172.20.251.94
下面将外部的 NFS 存储对接到 Kubernetes 上,在 Kubernetes 中部署 NFS Client Provisioner
helm repo add rainbond https://openchart.goodrain.com/goodrain/rainbond
helm install nfs
-
client
-
provisioner rainbond
/
nfs
-
client
-
provisioner \
--
set
nfs
.
server
=
172.20
.
251.94
\
--
set
nfs
.
path
=/
data \
--
version
1.2
.
8
$
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 则正常。

查看
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
注意:数据同步完成后切记要校验数据的完整性。
rainbondcluster CRD资源,添加
storageClassName
$
kubectl
edit
rainbondcluster
-
n
rbd
-
system
spec
:
rainbondVolumeSpecRWX
:
storageClassName
:
nfs
-
client
#由 NFS-Client-Provisioner 创建的 sc
rainbondvolumes CRD资源,修改
storageClassName 为
nfs-client
$
kubectl
edit
rainbondvolumes
-
n
rbd
-
system
spec
:
storageClassName
:
nfs
-
client
rainbondsssc
rainbondslsckubectl 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-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 的组件中将当前存储删除重新添加。

挂载路径、存储类型保持不变,删除当前的配置添加新的同样配置即可。
至此存储切换完成,后续请验证应用的数据是否都完整。
修改 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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70008902/viewspace-2991381/ ,如需转载,请注明出处,否则将追究法律责任。