30-使用GlusterFS作为后端持久化存储
1.概述
本文档使用一个端到端的案例介绍使用GlusterFS作为OKD集群的后端持久化存储方案。
注:以上所有关于oc的命名都是在master节点上执行的。
关于GlusterFS可参考《GlusterFS简介》、《GlusterFS安装》、《GlusterFS使用》和《GlusterFS限额》等。
2.预备条件
mount.glusterfs依赖于glusterfs-fuse包,如果没有就安装,如果存在则需要更新到最新版本。
$ yum install glusterfs-fuse -y
$ yum update glusterfs-fuse -y
默认情况下,SELinux不允许从pod写入远程GlusterFS服务器。要启用在SELinux下写入GlusterFS卷,请在运行GlusterFS的每个节点上运行以下操作:
$ sudo setsebool -P virt_sandbox_use_fusefs on
$ sudo setsebool -P virt_use_fusefs on
注:-P参数使重启后依然有效
其实也就是禁用SELinux。
3.静态配置
1)创建volume
要确保GlusterFS集群上创建了一个volume,比如gv0。
2)定义创建Service和Endpoints文件
创建glusterfs-endpoints.yaml文件。
---
apiVersion: v1
kind: Service
metadata:
name: glusterfs-cluster
spec:
ports:
- port: 1
---
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-cluster
subsets:
- addresses:
- ip: 10.11.4.18
ports:
- port: 1
- addresses:
- ip: 10.11.4.20
ports:
- port: 1
注:
- Service和Endpoints名称必须相匹配
- ip不能配置成主机名
3)创建Service和Endpoints
$ oc create -f gluster-endpoints.yaml
service/glusterfs-cluster created
endpoints/glusterfs-cluster created
4)验证Service和Endpoints
$ oc get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
glusterfs-cluster ClusterIP 172.30.80.187 <none> 1/TCP 4s
$ oc get endpoints
NAME ENDPOINTS AGE
glusterfs-cluster 10.11.4.18:1,10.11.4.20:1 15s
每个Project的Endpoints都是唯一的。每个访问GlusterFS卷的项目都需要自己的Endpoints。
5)获取能访问volume的UID和GID
为了访问volume,容器必须使用能够访问volume上的文件系统的用户ID (UID)或组ID (GID)运行。可以通过以下方式发现这些信息:
$ mkdir -p /mnt/glusterfs/gv0
$ mount -t glusterfs 10.11.4.18:/gv0 /mnt/glusterfs/gv0
$ ls -lnZ /mnt/glusterfs/
drwxr-xr-x. 0 0 system_u:object_r:fusefs_t:s0 gv0
UID=0
GID=0
6)定义持久化卷
gluster-pv.yaml,内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-default-volume
annotations:
pv.beta.kubernetes.io/gid: "0"
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: glusterfs-cluster
path: gv0
readOnly: false
persistentVolumeReclaimPolicy: Retain
7)创建PV
<wiz_code_mirror><pre class=" CodeMirror-line " role="presentation">$ oc create -f gluster-pv.yaml </pre>
<pre class=" CodeMirror-line " role="presentation">persistentvolume/gluster-default-volume created</pre></wiz_code_mirror>
8)验证PV
$ oc create -f gluster-pv.yaml
persistentvolume/gluster-default-volume created
至此完成,后续即可通过pvc使用该pv了。
4.存在问题
上述步骤只是实现了从GlusterFS到PV的过程,梳理下会发现其流程如下:
1)在GlusterFS集群上创建Volume
2)在每个需要使用持久存储的Project上创建Service和Endpoint
3)创建PV
如果每创建一个Project(有持久化存储需求的)都需要执行上述过程,岂不繁琐。
是否有什么方式将上述过程自动化起来?
最理想的结果是,当Pod需要持久化存储时,只需要提出PVC需求,程序会自动从后端存储分配满足需求的Volume,以供使用。
幸运的是,当然可以。
请参考《31-动态配置后端存储》
参考地址:
https://docs.okd.io/latest/install_config/storage_examples/gluster_example.html
https://docs.okd.io/latest/install_config/persistent_storage/persistent_storage_glusterfs.html#install-config-persistent-storage-persistent-storage-glusterfs