GlusterFS
k8s集群中,怎么也会遇到数据持久化的问题,需要用到PV和PVC,把数据存储到一个固定的节点上。
GlusterFS 是一个可伸缩的分布式文件存储方案,Kubernetes 的StorageClass支持的驱动中,推荐 使用GlusterFS
https://kubernetes.io/docs/concepts/storage/storage-classes/

开始安装
GlusterFS官方文档:https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/
GlusterFS+Kubernetes官方文档:https://github.com/gluster/gluster-kubernetes#quickstart
因为文件系统功能简单,使用相对稳定,一次部署,基本上不会再做删减,因此,我们没有必要用Kubernetes去部署GlusterFS,手工部署反而更简单,依赖少。
安装前的准备
最少两台服务器,用replication模式,一主一备,防止数据库丢失,高可用。每台服务器2CPU,2G内存,100G SSD硬盘,网络带宽1G以上,安装Ubuntu 16.04
安装
配置
我们有两台服务器:10.103.1.11和10.103.1.119,在10.103.1.11上执行命令,连接10.103.1.119,组成集群
格式化两台服务器的数据盘,自动挂载
添加第一个卷
在10.103.1.11上执行
gluster volume info查看券状态
启动卷:
停止卷
删除卷
客户端挂载卷
卷可以像普通nfs一样通过mount挂载,只需要安装glusterfs支持即可。
这里需要一天新的客户端电脑,安装glusterfs客户端:
挂载卷
开启磁盘配额
在服务端开启配额
在服务端设置一个目录的磁盘配额
客户端查看配额
Kubernetes使用GlusterFS
K8s官方文档https://github.com/kubernetes/examples/tree/master/staging/volumes/glusterfs
添加entrypoint
在gluster服务器上查看服务端口
我们进程glusterd对应的端口24007就是服务端口
开始创建entryppint
配置 service
创建测试 pod
volumes[0].glusterfs.endpoints对应的值是上面创建service的名字
volumes[0].glusterfs.path是上面创建的volume名字
查看pod状态,确认启动成功
安装配置Heketi
上面的方式,适合只有很少PV需求的场景,如果有很多Pod需要很多PV,指向Glusterfs不同的卷(或者说不同的目录),那么每次都要手工创建Glusterfs Volume再创建对应的PV就会很麻烦。因此,我们需要一种自动的方式去生成所需资源。K8s支持自定义PVC的StorageClass,通过它和Heketi配合,就可以自动创建所需的存储资源,不同Deployment可以拥有独立目录。
参考文档:
添加heketi配置文件:
这里需要注意的glusterfs.sshexec.sudo为true,否则heketi服务会提示没有权限
启动heketi服务:为了方便调试,我们在本地用docker启动服务,生产环境,我们可能会在一台独立电脑上启动服务,或者用K8s在Pod中运行这个服务。
这里,我们映射了本地目录/Users/xiaohui/coding/heketi到容器的/etc/heketi
把上面的heketi.json文件放到本地目录/Users/xiaohui/coding/heketi,同时添加topylogy(Glusterfs Cluster的拓扑图)文件:
这个文件的目的是定义Glusterfs服务器地址和磁盘。
然后新开 一个终端,进入heketi容器:
当我们手工在Ubuntu上安装Glusterfs之后,用heketi-cli加载集群配置时,可能会出现如下错误:
查看Heketi HTTP服务器端日志,会发现如下错误:
这里可以找到原因:systemctl status glusterd没有找到服务,是因为Ubuntu安装的gluster服务名是glusterfs-server
目前,Heketi写死了服务名称,无法配置 https://github.com/heketi/heketi/blob/6d80b73a799084cd28776e25857225c645756aaf/executors/cmdexec/peer.go#L72

因此,我们只有创建一个systemd别名:glusterd.service => glusterfs-server.service
方法如下:
添加内容:
获取服务的文件地址/run/systemd/generator.late/glusterfs-server.service
创建软连接:
启动服务:
现在我们再次加载Glusterfs Cluster Topology 文件
如果磁盘的确已经被挂载或者已经被格式化,我们需要做如下操作:
测试heketi-cli命令
获取集群
获取节点列表
创建Volume
获取卷列表
获取拓扑信息
获取磁盘信息
删除卷
Last updated