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.1110.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.sudotrue,否则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 文件

这里需要注意,磁盘/dev/sdb必须是一个空磁盘并且没有被挂载到系统,否则会添加失败。Heketi这么做的目的也是为了保护我们的磁盘数据,万一设置了错误的磁盘,不至于丢失数据。

如果磁盘的确已经被挂载或者已经被格式化,我们需要做如下操作:

测试heketi-cli命令

获取集群

获取节点列表

创建Volume

创建Volume时可能会出现错误“usr sbin thin_check no such file or directory”,需要在每台Glusterfs服务器上安装:apt install thin-provisioning-tools

获取卷列表

获取拓扑信息

获取磁盘信息

删除卷

Last updated