完成GlusterFS与Kubernetes对接后,本篇主要讲如何合理使用Kubernetes的StorageClass资源对象创建动态供应卷,以下是完整GlusterFS的StorageClass例子:
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: glusterfs-test
parameters:
resturl: http://10.1.0.123:8080
restauthenabled: "true"
restuser: admin
secretName: glusterfs-admin-secret
secretNamespace: kube-system
clusterid: 437c2c97b6dcd165c275bedd5632cac9
volumetype: replicate:3
volumeoptions: network.ping-timeout 30
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion
含义:是否支持卷扩容,true表示支持,默认值为false。
GlusterFS是支持已绑定PVC的容量扩容的,并且还是热扩容,不需要重启pod即可生效,所以这里设置为true。另外,判断存储卷是否支持卷扩容,一方面是需要确定provisioner插件是否支持该功能,另一方面存储服务器是否支持卷扩容。
provisioner
含义:卷插件控制器名称,必填项。
provisioner主要监听指向当前StorageClass的PVC,用于PV的自动创建、删除、绑定与解绑等共功能。kubernetes.io/glusterfs表示该provisioner使用Kubernetes内置GlusterFS控制器,如果有实现CSI的GlusterFS控制器的,提前注册至controller-manager,即可使用。
parameters.resturl
含义:Heketi Rest API的访问地址
上游与provisioner插件进行交互,实现GlusterFS卷的增加、删除、扩容等功能;下游是管理GlusterFS集群,通过gluster指令完成对provisioner插件的请求。
parameters.restauthenabled
含义:Heketi Rest API是否需要认证,默认是"false",一般情况下使用"true"。
该参数取决于Heketi服务器在创建时,是否开启了用户名和密码的认证,如果未开启,restauthenabled,restuser,secretName,secretNamespace参数都无需填写;反之,都要填写,不填写,则会无法使用GlusterFS。
parameters.restuser
含义:Heketi Rest API认证的用户名。
在restauthenabled="true"时填写,对应Heketi创建时的用户名。
parameters.secretName与parameters.secretNamespace
含义:Heketi Rest API认证密码的Secret资源对象。
将Heketi Rest API认证密码存入Secret资源对象中的好处是,保护密钥安全,当然也可以直接使用parameters.restuserkey进行明文认证,Secret资源如下:
apiVersion: v1
data:
key: YWRtaW5AMTIz # 通过base64加密后的密码
kind: Secret
metadata:
name: glusterfs-admin-secret
namespace: kube-system
type: kubernetes.io/glusterfs
parameters.clusterid
含义:Heketi组织管理的GlusterFS集群id值
GlusterFS集群定义为每个节点(node)上的盘(device)构成数据存储的集群。**合理规划clusterid的创建,对于不同类型的数据卷存储是至关重要的。**可以通过heketi-cli指令进行集群id值的查询,如下所示:
[root ~]# heketi-cli --user admin --secret admin@123 cluster list
Clusters:
Id:d54b41b6a73b2470d25ed2d33c4be449 [file][block]
parameters.volumetype
含义:GlusterFS卷类型,支持"replicate:<副本数>"、"disperse:<数据散列值>:<冗余值>"、"none",默认值"replicate:3"。
目前Kubernetes内置的GlusterFS卷类型支持replicate、disperse、none三种,接下来一一介绍每一种卷的使用场景,示例如下:
- replicate:3
replicate表示通过数据副本的形式保证数据安全;
3表示需要创建数据副本的数量。
等同于通过gluster指令创建3副本的卷
gluster volume create test-volume replica 3 server1:/exp1 server2:/exp2 server3:/exp3
注意:
-
副本数应小于等于cluster内的磁盘个数,如果大于则无法创建卷;
-
当副本数应小于cluster内的磁盘个数时,为了提高磁盘空间的利用率,尽可能选择一个与副本数相同磁盘个数的cluster,即:cluster磁盘个数=n*副本数,n为正整数;
-
当cluster磁盘个数等于副本数的倍数时,数据将以倍数存储,例如:创建副本为3的卷,cluster内有6块磁盘,则GlusterFS将会创建6个副本的数据。
- disperse:3:1
disperse表示通过数据散列存储的形式保证数据安全;
3:1等同于纠错码(EC),表示2个数据块,1个冗余块。
等同于通过gluster指令创建数据块2,冗余块1的卷
gluster volume create test-volume disperse 3 redundancy 1 server1:/exp1 server2:/exp2 server3:/exp3
注意:
-
创建散列卷的要求:冗余块<=1/2*数据块;
-
创建散列卷时,必须要正确填写散列值:冗余块,否则将无法创建;
-
当cluster磁盘个数等于散列值(数据块+冗余块)的倍数时,数据将以倍数存储,例如:创建数据块2,冗余块1的卷,cluster内有6块磁盘,则GlusterFS将会创建数据块4,冗余块2的数据。
- none
表示在一块磁盘上创建卷,没有数据冗余。
等同于通过gluster指令创建卷
gluster volume create test-volume server1:/exp1
注意:
-
这种方式无法保证数据安全,一旦数据丢失,将无法找回;
-
一般情况下,这种适合磁盘资源短缺的场景,但最好对磁盘进行磁盘阵列的设置。
parameters.volumeoptions
含义:GlusterFS卷参数设置,多个参数以","分隔开。
GlusterFS卷参数设置,在实际使用中非常广泛,是对已经创建好的默认参数下的卷,对卷参数进行调整,实现卷的性能调优。
实例中network.ping-timeout 30表示调整客户端卷影响的超时时间,默认是42s,这里设置为30s,等同于gluster指令对卷进行设置:
gluster volume set vol_test network.ping-timeout 30
其它卷参数设置:
- 高负载的情况下,提高访问性能,可开启元数据缓存
volumeoptions: "group metadata-cache",等同于
gluster volume set vol_test group metadata-cache
- 提高客户端读取目录列表的性能
volumeoptions: "performance.readdir-ahead on,performance.parallel-readdir on",等同于
gluster volume set vol_test performance.readdir-ahead on gluster volume set vol_test performance.parallel-readdir on
- 提高客户端读取小文件的性能,调整缓存大小
volumeoptions: "cache-size 256MB",等同于
gluster volume set vol_test cache-size 256MB
还有很多设置卷参数的方式,可参考docs.gluster.org/en/latest/A…
需要注意的是,在调整卷参数的过程中,同时要考虑是否该卷参数的性能提高,导致整体服务器上的卷性能降低。由于每个用户的机器性能不一,这里就不一一举例,可在多次测试调优中得到均衡值。
总结:
以上是整个StorageClass在实际创建动态供应卷时,对parameters的设置。可根据实际需求,配合Heketi管理的GlusterFS集群,对卷进行设置,提高存储利用率及存储性能。最后,和大家谈谈在使用GlusterFS过程中的一些建议。
几点建议:
-
同一个clusterid,创建不同种类的卷,可通过创建不同的StorageClasss实现,但需要考虑cluster里的磁盘资源是否能够充分利用;
-
Heketi管理的cluster中,如果当前资源快耗尽了,不管是散列卷还是副本卷,扩容磁盘需要与原先的磁盘的倍数增长,可通过heleti-cli指令完成;
-
散列卷和副本卷的存放尽量不要放在一个clusterid上,影响存储使用率;
-
在进行卷性能调优时,不能大幅度影响整体glusterfs集群的性能,得不偿失。