NFS存储迁移至GlusterFS

前提条件

  • 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷;
  • 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点;
  • 存储切换时请勿在平台继续操作,以免数据切换后不一致;
  • GluseterFS所使用磁盘挂载在/data目录,推荐使用逻辑卷;
  • 如果之前通过修改控制器方式修改过Rainbond组件相关数据,请提前做好备份,存储切换后会重置相关修改。

部署GlusterFS

将存储节点添加至当前k8s集群,参考Rainbond官方文档安装的k8s集群扩容节点命令如下

docker exec -it kubeasz easzctl add-node NODE_IP
  • 在k8s集群所有节点安装所需要的组件

    • Ubuntu16.04/18.04
    add-apt-repository ppa:gluster/glusterfs-7
    apt-get update
    apt-get install glusterfs-client -d
    modprobe dm_thin_pool
    • CentOS 7
    yum -y install centos-release-gluster
    yum -y install glusterfs-client
    modprobe dm_thin_pool

    所有节点GlusterFS版本必须为7.*+,否则会出现无法挂载存储的情况;可通过执行glusterfs --version验证。

  • 在GluseterFS节点划分分区并挂载磁盘

    # 查看可用磁盘
    fdisk -l
    # 分区并格式化
    mkfs.xfs /dev/vdb1
    mkdir -p /data
    echo "/dev/vdb1 /data xfs defaults 1 2" >>/etc/fstab
    # 挂载
    mount -a
    # 确定/data挂载
    df -h | grep data

    以下操作在k8s集群的任一master节点执行

  • 获取对应项目

git clone https://gitee.com/liu_shuai2573/gfs-k8s.git && cd gfs-k8s
  • 设置标签使该节点只运行GFS
#设置标签,调度glusterfs的pod至指定节点
kubectl label node 10.10.10.71 10.10.10.72 10.10.10.73 storagenode=glusterfs
#设置taint策略,使该节点只运行glusterfs,如需复用glusterfs节点请忽略该操作
kubectl taint node 10.10.10.71 10.10.10.72 10.10.10.73 glusterfs=true:NoSchedule
  • 运行GFS的相关控制器(视网络及性能情况而定,大约需要两分钟)
kubectl create -f gluster-daemonset.yaml
  • 检查是否在指定节点正常运行
$ kubectl get pods -o wide --selector=glusterfs-node=daemonset
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
glusterfs-2k5rm 1/1 Running 0 52m 192.168.2.200 192.168.2.200 <none> <none>
glusterfs-mc6pg 1/1 Running 0 134m 192.168.2.22 192.168.2.22 <none> <none>
glusterfs-tgsn7 1/1 Running 0 134m 192.168.2.224 192.168.2.224 <none> <none>
  • 为GFS集群添加节点

    kubectl exec -ti glusterfs-2k5rm gluster peer probe 192.168.2.22
    kubectl exec -ti glusterfs-2k5rm gluster peer probe 192.168.2.224 #检测是否添加成功,成功则显示Connected状态
    kubectl exec -ti glusterfs-2k5rm gluster peer status
  • 创建服务账户并进行RBAC授权

    kubectl create -f rbac.yaml

配置k8s集群使用GFS

  • 创建provisioner资源
kubectl create -f deployment.yaml
  • 创建storageclass资源

    修改storageclass.yaml文件中的parameters.brickrootPaths字段对应的值,将GlusterFS节点的IP替换掉。

kubectl create -f storageclass.yaml
  • 创建pvc验证
kubectl create -f pvc.yaml
#创建成功时STATUS为Bound
kubectl get pvc | grep gluster-simple-claim
  • 创建pod验证

运行正常时STATUS为Running

kubectl create -f pod.yaml
kubectl get po | grep gluster-simple-pod
#验证正常后将pod删除
kubectl delete -f pod.yaml

数据备份

数据备份是考虑到实际存储切换时使用原NFS存储向GFS同步数据可能会由于受到网络因素等影响导致较慢,所以事先将NFS中的数据拷贝至手动创建的GFS存储卷中,在最终切换时再从当前的GFS卷中向切换后自动创建的卷中同步数据,需要确保GFS存储磁盘容量能够容纳以下组件的数据*2份;若实际情况NFS向GFS同步数据较快,此步骤可以忽略。

需要备份的数据如下

  • rbd-repo
  • rbd-hub
  • rbd-chaos
  • rbd-cpt-grdata

使用NFS存储的数据默认存储在NFS所运行宿主机的 /opt/rainbond/data/nfs 目录下,根据PVC名字进行划分,将上述需要备份的文件进行备份。

  • 手动创建一个存储卷,用作备份使用
$ kubectl exec -ti glusterfs-2k5rm gluster volume create backup replica 3  192.168.2.200:/data/backup 192.168.2.22:/data/backup 192.168.2.224:/data/backup
$ gluster volume start backup
#在原NFS节点挂载该卷,方便进行备份
mkdir /backup
mount.glusterfs 192.168.2.200:/backup /backup
#获取上述需备份数据与NFS存储中所对应的文件夹名称(对比VOLUME名字与NFS存储中文件夹名字)
kubectl get pvc -n rbd-system
#在原NFS节点使用rsync同步数据,可进行增量备份,使用此方式备份上述四份数据
rsync -azvP /opt/rainbond/data/nfs/组件PV名字 /backup/

切换存储

  • 删除PVC
kubectl  get pvc  -A| grep rbd-system|grep rainbondvolumerwx|awk '{print$2}'|xargs kubectl delete pvc  -n rbd-system
  • 删除PV
kubectl get pv |grep rainbondvolumerwx|awk '{print$1}'|xargs kubectl delete pv  -n rbd-system

如遇到无法删除参考文档

  • 修改rainbondvolume使用glusterfs存储

修改storageClassNameprovisioner的值。

kubectl edit rainbondvolume -n rbd-system

spec:
csiPlugin:
nfs: {}
imageRepository: registry.cn-hangzhou.aliyuncs.com/goodrain
storageClassName: glusterfs-simple
storageClassParameters:
provisioner: gluster.org/glusterfs-simple
storageRequest: 1
  • 删除控制器

如果之前通过修改控制器方式修改过Rainbond组件相关数据,pod正常创建后需再次修改,删除后会重置相关控制器参数。

删除后将会自动创建pod及对应存储pv,pvc

kubectl delete sts nfs-provisioner rbd-eventlog rbd-db rbd-etcd rbd-monitor rbd-repo -n rbd-system
kubectl delete ds rbd-chaos rbd-gateway rbd-node -n rbd-system
kubectl delete deploy rbd-api rbd-app-ui rbd-hub rbd-mq rbd-webcli rbd-worker -n rbd-system
  • 拷贝数据

查询 rbd-db,rbd-repo,rbd-hub,rbd-cpt-grdata 新创建的pv名字

kubectl get pv -n rbd-system

通过临时挂载的方式将GFS存储卷挂载出来,将之前备份的数据分别拷贝到对应目录

以 rbd-hub 为例

mkdir  /rbd-hub
mount -t glusterfs 192.168.2.187:/{rbd-hub pv名字} /rbd-hub

拷贝完毕后重启pod识别数据

kubectl get po -n rbd-system|awk '{print$1}'|xargs kubectl delete po -n rbd-system

将平台运行组件的pv及pvc删除,并登录平台将所有应用重启

kubectl get pvc -A|grep rainbondsssc|awk '{print$1,$2}'|xargs kubectl delete pvc $2 -n $1
kubectl get pv |grep rainbondsssc|awk '{print$1}'|xargs kubectl delete pv

验证

1.查看平台组件是否都处于running状态

$ kubectl get po -n  rbd-system
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-754cdcbbb6-lkxkb 1/1 Running 0 17m
kubernetes-dashboard-57b897f8df-wjj7s 1/1 Running 0 17m
rainbond-operator-0 2/2 Running 0 13m
rbd-api-564f456468-7gj2j 1/1 Running 1 17m
rbd-app-ui-64c7c55995-skjsg 1/1 Running 3 17m
rbd-chaos-gq4xg 1/1 Running 1 17m
rbd-db-0 2/2 Running 2 17m
rbd-etcd-0 1/1 Running 1 17m
rbd-eventlog-0 1/1 Running 1 17m
rbd-gateway-msrsd 1/1 Running 1 17m
rbd-hub-85b7b94846-b5kp6 1/1 Running 1 17m
rbd-monitor-0 1/1 Running 1 17m
rbd-mq-989c5549c-qtdqj 1/1 Running 1 17m
rbd-node-7fbqt 1/1 Running 0 17m
rbd-node-gqc5s 1/1 Running 1 17m
rbd-node-mg62k 1/1 Running 0 17m
rbd-repo-0 1/1 Running 1 17m
rbd-webcli-84969b7fc5-bhmgs 1/1 Running 1 17m
rbd-worker-78b6dc8fc4-cjtn6 1/1 Running 1 17m

2.检查使用存储的组件数据是否和迁移前一致

3.找到有使用共享存储的组件,通过grctl service get命令查看是否使用的是GlusterFS存储;通过endpoints及对应路径查看数据。

$ grctl service get gr1e52a5 -t v6j1tpha
PodVolume:
+----------------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Volume | Type | Volume Mount |
+----------------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| /var/lib/mysql | nfs | endpoints: glusterfs-simple-rbd-cpt-grdata |
| | | path: pvc-c9e702f4-2a52-4f07-98b0-25488f9b585b/tenant/6dc4f0529b8c43d7a96db742029f43d1/service/37bf4d2a3608455d867c8289231e52a5/var/lib/mysql/gr1e52a5-0 |
| | | endpointsNamespace: rbd-system |
+----------------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

确认完毕后删除原NFS相关资源及数据

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

NFS存储迁移至GlusterFS的更多相关文章

  1. NFS存储服务及部署

    1 NFS简介 1.1 什么是NFS NFS=Network File System=网络文件系统.主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用服 ...

  2. nfs 存储服务

    今日内容: NFS 1.什么是nfs? network file system 网络文件系统 nfs共享存储 2.nfs能干什么? nfs 能为 不同主机系统之间 实现 文件的共享 3.为什么要使用n ...

  3. 烂泥:NFS存储与VSphere配合使用

    本文首发于烂泥行天下. 公司服务器的虚拟化使用的是VM ESXi 5.0,为了更有效的利用服务器的硬盘空间.就把所有的镜像文件存放到另外一台linux服务器上,这样在使用vsphere安装虚拟机时可以 ...

  4. docker volume创建、备份、nfs存储

    docker存储volume #环境 centos7.4 , Docker version 17.12.0-ce docker volume创建.备份.nfs存储 #docker volume 数据存 ...

  5. NFS存储服务

    NFS存储服务笔记======================================================================NFS共享存储是什么: 英文名-Netwo ...

  6. rancher2.1.7安装nfs 存储类

    NFS存储类不建议作大规模存储,块存储建议采用CEPH(独立安装) NFS只作为外接存储与普通NGINX类的配置文件,业务配置文件建议走配置中心. 增加自定义商店 地址为:https://github ...

  7. Oracle 11gR1 RAC存储迁移方案

    一.需求Oracle 11gR1 RAC存储计划更换,数据库版本为11.1.0.7,无停机维护窗口. 二.环境准备1.主机环境.OS环境2.安装11.1.0.6.0版Clusterware(linux ...

  8. Rancher2.0中使用外置NFS存储部署Nginx实验

    目录: 1.环境准备工作 1.1 准备好Rancher2.0集群环境 1.2 准备好外部NFS服务器 2.Rancher2.0中使用NFS存储的方法 2.1 在集群中创建持久卷(PV) 2.2 在项目 ...

  9. Oracle 11g R2 RAC with ASM存储迁移--Rman copy&ASM Rebalance(一)

    ASM GROUP-Rman copy迁移 0x00--环境介绍 VMware版本:VMware12pro 主机操作系统:RHEL6.5_64 共享存储使用VMWARE创建共享磁盘文件 数据库版本:O ...

随机推荐

  1. C# 编译机器码过程原理之再谈反射

    一.引言 我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢? 其实运行原理是一样的,.NET中 ...

  2. 【命令】ps命令

    1.功用: <---用于报告当前系统的进程状态,实际是将/proc/目录下的各个进程的相关信息转换为我们易读的模式展现出来:可以搭配kill指令随时中断.删除不必要的程序---> 语法格式 ...

  3. python初学者-判断一个数是否为素数

    while True: #判断为真 num = int(input('请输入一个数:')) for i in range(2,num):#判断在num之前的数能不能把num整除 if(num%i == ...

  4. Cannot assign requested address 和 SO_REUSEADDR 参数

    1. 错误 今天项目中出现了大量的java.net.ConnectException: Cannot assign requested address (connect failed) 错误. 刚开始 ...

  5. 关于线程池(ThreadPoolExecutor)参数的浅析

    引子 线程池在项目中很常用,需要多个任务异步执行的地方我们都会去创建一个线程池. 我们看到 ThreadPoolExecutor源码中提供了更方便的工厂方法(Executors)使用. 提供方便应该是 ...

  6. 操作系统微内核和Dubbo微内核,有何不同?

    你好,我是 yes. 在之前的文章已经提到了 RPC 的核心,想必一个 RPC 通信大致的流程和基本原理已经清晰了. 这篇文章借着 Dubbo 来说说微内核这种设计思想,不会扯到 Dubbo 某个具体 ...

  7. linux yum install

    作为一名新手,学习Linux已经一个月了,其间遇到了不少问题,而今天笔者遇到的问题是 #yum install pam-devel #This system is not registered to ...

  8. 重入锁ReentrantLock

  9. java内部类 之private 属性对其他对象的访问限制

    public class InnerClass1 { private class Content { private int i; public int value() { // TODO Auto- ...

  10. spring之ApplicationEvent 事件驱动

    什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些. ApplicationContext则是应用的容器. Sprin ...