在k8s环境中,我们都知道pods的分发一般是随机的(当然也可以指定分发到具体哪一台机器),如果我们运行pod服务有持久化数据的需求则需要使用到存储系统(例如pods需要将卷挂载某些数据到宿主机),存储系统的类型有很多,本文介绍一种分布式存储系统GlusterFS,并使用k8s环境部署

一、准备

首先简单介绍下环境准备内容,准备4个节点(VM虚拟机,centos7系统),其中1个节点作为k8smaster节点,另外3个节点作为Node节点部署GlusterFS(因为GlusterFS集群至少需要三个节点),4个节点组成k8s集群环境,本文节点的虚拟机IP地址如下
master:192.168.2.140
node1:192.168.2.141
node2:192.168.2.142
node3:192.168.2.143

二、配置node1、2、3

1.为node1\2\3添加新的硬盘供GlusterFS使用,VM可以在关机状态下通过设置增加新的硬盘,开机后查看/dev目录下即可看到新添加的硬盘设备(本例新增的设备为/dev/sdb)

2.节点上的gluster进程需要能够相互通信。要简化此设置,请在每个节点上配置防火墙以接受来自其他节点的所有流量、临时生效,每次重启节点时也需要再执行一次

iptables -I INPUT -p all -s <ip-address> -j ACCEPT

3.安装GlusterFS客户端

yum install glusterfs glusterfs-fuse -y

三、为需要部署GlusterFS的节点打上标签以及加载模块

在master节点执行以下命令,为节点打上标签,使后面部署使可以select指定标签的节点部署

kubectl label node <node节点主机名> storagenode=glusterfs

为部署了glusterfs的节点加载模块

modprobe dm_thin_pool

四、部署GlusterFS+Heketi服务

因为服务部署过程中需要创建的yaml文件内容比较长,为了避免篇幅过长的代码,这里将这部分内容放到txt文件中,有需要的可以下载下来或者点击fils链接打开,根据后面的步骤创建对于的yaml文件,并使用kubeadm create -f …执行对于的文件

1.首先根据上述文件创建glusterfs-damonset.yaml文件,并执行部署,待kubectl get pods查看3个节点的glusterfs服务启动正常后即可继续

2.创建heketi-service-account.yaml以及cluster-role.yaml配置权限

3.创建cluster-role-binding将以上第2步创建的2个资源绑定

4.创建heketi服务,heketi-deployment.yaml和heketi-service.yaml(注意hekei的db数据需要持久化保存,建议hostPath或其他共享存储进行保存)

五、使用Heketi初始化GlusterFS集群

待第四步都执行成功以后,通过kubectl exec -it 命令进入到heketi服务的pod中,然后创建topology.json文件,执行以下2个命令

export HEKETI_CLI_SERVER=http://localhost:8080

heketi-cli topology load –json=topology.json

一段时间后显示集群创建成功可以通过以下命令查看集群信息

heketi-cli topology info

当以上都成功以后,可以创建StorageClass资源对象,根据pvc对象动态分创建和管理pv了,之后在部署服务的时候就可以使用相关的pvc挂载资源(更多关于k8s持久存储的内容可以去官网了解)

六、补充(重新部署)

若上述部署过程出现问题需要重新部署,可以按照以下顺序进行清理后重新部署

1.删除pvc(自动创建的delete回收策略的pv一段时间后也会自动删除),以及pv

2.delete heketi和gluster服务

3.删除heketi挂载的文件夹(本例在/heketi-data下)

4.删除/var/lib/heketi目录

4.重置磁盘,需要清空裸设备

5.重新走创建glusterfs、创建heketi、初始化集群的步骤即可

七、小结

最后,总结以下使用持久存储的例子,我们都知道,使用k8s部署服务创建的pods默认资源都是隔离的,并没有落地到宿主机,倘若没有使用资源挂载或者持久存储的方式保存数据,那么当pods挂掉重新分发创建的时候就会出现数据丢失,同样的一切需要数据持久化的应用或者中间件的部署都会遇到这样的问题,如mysql集群、kafka集群等

发表评论

电子邮件地址不会被公开。