8.3 动态存储管理实战:GlusterFS

本节以GlusterFS为例,从定义StorageClass、创建GlusterFS和Heketi服务、用户申请PVC到创建Pod使用存储资源,对StorageClass和动态资源分配进行详细说明,进一步剖析Kubernetes的存储机制。

8.3.1 准备工作

为了能够使用GlusterFS,首先在计划用于GlusterFS的各Node上安装GlusterFS客户端:

GlusterFS管理服务容器需要以特权模式运行,在kube-apiserver的启动参数中增加:

给要部署GlusterFS管理服务的节点打上storagenode=glusterfs标签,是为了将GlusterFS容器定向部署到安装了GlusterFS的Node上:

8.3.2 创建GlusterFS管理服务容器集群

GlusterFS管理服务容器以DaemonSet的方式进行部署,确保在每个Node上都运行一个GlusterFS管理服务。glusterfs-daemonset.yaml的内容如下:

8.3.3 创建Heketi服务

Heketi是一个提供RESTful API管理GlusterFS卷的框架,能够在OpenStack、Kubernetes、OpenShift等云平台上实现动态存储资源供应,支持GlusterFS多集群管理,便于管理员对GlusterFS进行操作。图8.4简单展示了Heketi的功能。

图8.4 Heketi的功能

在部署Heketi服务之前,先创建ServiceAccount并完成RBAC授权:

部署Heketi服务:

需要注意的是,Heketi的DB数据需要持久化保存,建议使用hostPath或其他共享存储进行保存:

8.3.4 通过Heketi管理GlusterFS集群

在Heketi能够管理GlusterFS集群之前,首先要为其设置GlusterFS集群的信息。可以用一个topology.json配置文件来完成各个GlusterFS节点和设备的定义。Heketi要求在一个GlusterFS集群中至少有3个节点。在topology.json配置文件hostnames字段的manage上填写主机名,在storage上填写IP地址,devices要求是未创建文件系统的裸设备(可以有多块盘),以供Heketi自动完成PV(Physical Volume)、VG(Volume Group)和LV(Logical Volume)的创建。topology.json文件的内容如下:

进入Heketi容器,使用命令行工具heketi-cli完成GlusterFS集群的创建:

经过上述操作,Heketi就完成了GlusterFS集群的创建,结果是在GlusterFS集群各个节点的/dev/sdb盘上成功创建了PV和VG。

查看Heketi的topology信息,可以看到Node和Device的详细信息,包括磁盘空间的大小和剩余空间。此时,GlusterFS的Volume和Brick还未创建:

8.3.5 定义StorageClass

准备工作已经就绪,集群管理员现在可以在Kubernetes集群中定义一个StorageClass了。storageclass-gluster-heketi.yaml配置文件的内容如下:

provisioner参数必须被设置为“kubernetes.io/glusterfs”。

resturl的地址需要被设置为API Server所在主机可以访问到的Heketi服务地址,可以使用服务ClusterIP+Port、PodIP+Port,或将服务映射到物理机,使用NodeIP+NodePort。

创建该StorageClass资源对象:

8.3.6 定义PVC

现在,用户可以定义一个PVC申请Glusterfs存储空间了。下面是PVC的YAML定义,其中申请了1GiB空间的存储资源,设置StorageClass为“gluster-heketi”,同时未设置Selector,表示使用动态资源供应模式:

PVC的定义一旦生成,系统便将触发Heketi进行相应的操作,主要为在GlusterFS集群中创建brick,再创建并启动一个Volume。可以在Heketi的日志中查看整个过程:

查看PVC的详情,确认其状态为Bound(已绑定):

查看PV,可以看到系统通过动态供应机制系统自动创建的PV:

查看该PV的详细信息,可以看到其容量、引用的StorageClass等信息都已正确设置,状态也为Bound,回收策略则为默认的Delete。同时Gluster的Endpoint和Path也由Heketi自动完成了设置:

至此,一个可供Pod使用的PVC就创建成功了。接下来Pod就能通过Volume的设置将这个PVC挂载到容器内部进行使用了。

8.3.7 Pod使用PVC的存储资源

下面是在Pod中使用PVC定义的存储资源的配置,首先设置一个类型为persistentVolumeClaim的Volume,然后将其通过volumeMounts设置挂载到容器内的目录路径下,注意,Pod需要与PVC属于同一个命名空间:

进入容器pod-use-pvc,在/pv-data目录下创建一些文件:

可以验证文件a和b在GlusterFS集群中正确生成。

至此,使用Kubernetes最新的动态存储供应模式,配合StorageClass和Heketi共同搭建基于GlusterFS的共享存储就完成了。有兴趣的读者可以继续尝试StorageClass的其他设置,例如调整GlusterFS的Volume类型、修改PV的回收策略等。

在使用动态存储供应模式的情况下,可以解决静态模式的下列问题。

(1)管理员需要预先准备大量的静态PV。

(2)系统为PVC选择PV时可能存在PV空间比PVC申请空间大的情况,无法保证没有资源浪费。

所以在Kubernetes中,建议用户优先考虑使用StorageClass的动态存储供应模式进行存储资源的申请、使用、回收等操作。