Kubernetes对接GlusterFS小技巧(下)

1,141 阅读6分钟

完成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

注意:

  1. 副本数应小于等于cluster内的磁盘个数,如果大于则无法创建卷;

  2. 当副本数应小于cluster内的磁盘个数时,为了提高磁盘空间的利用率,尽可能选择一个与副本数相同磁盘个数的cluster,即:cluster磁盘个数=n*副本数,n为正整数;

  3. 当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. 创建散列卷的要求:冗余块<=1/2*数据块;

  2. 创建散列卷时,必须要正确填写散列值:冗余块,否则将无法创建;

  3. 当cluster磁盘个数等于散列值(数据块+冗余块)的倍数时,数据将以倍数存储,例如:创建数据块2,冗余块1的卷,cluster内有6块磁盘,则GlusterFS将会创建数据块4,冗余块2的数据。

  • none

表示在一块磁盘上创建卷,没有数据冗余。

等同于通过gluster指令创建卷

gluster volume create test-volume server1:/exp1

注意:

  1. 这种方式无法保证数据安全,一旦数据丢失,将无法找回;

  2. 一般情况下,这种适合磁盘资源短缺的场景,但最好对磁盘进行磁盘阵列的设置。

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过程中的一些建议。

几点建议:

  1. 同一个clusterid,创建不同种类的卷,可通过创建不同的StorageClasss实现,但需要考虑cluster里的磁盘资源是否能够充分利用;

  2. Heketi管理的cluster中,如果当前资源快耗尽了,不管是散列卷还是副本卷,扩容磁盘需要与原先的磁盘的倍数增长,可通过heleti-cli指令完成;

  3. 散列卷和副本卷的存放尽量不要放在一个clusterid上,影响存储使用率;

  4. 在进行卷性能调优时,不能大幅度影响整体glusterfs集群的性能,得不偿失。