Kubernetes可以直接挂载多种文件系统,其中包括GlusterFS(https://kubernetes.io/docs/concepts/storage/volumes/#glusterfs)。
这里采用最简单的方法,挂载宿主系统的GlusterFS卷给Kubernetes中的pod使用。
1、安装GlusterFS
关于GlusterFS更多信息,参见:
- 分布式存储系统GlusterFS最新版本安装
- 安装 GlusterFS - 快速开始
- Setting up GlusterFS Volumes
- 通过GlusterFS黏合多节点SSD剩余空间
- GlusterFS强制删除节点
最简单的方法是使用mount挂载一个GlusterFS的Volume到本地卷,如:
# 基于ZFS从文件创建一个虚拟磁盘卷。
# 首先,创建一个空的文件(2GB)。
dd if=/dev/zero of=zpool-gvz.img bs=1M count=2048
# 然后从该文件创建ZFS存储池。
sudo zpool create zpool-gvz zpool-gvz.img
# 将虚拟存储池作为Bricks加入GlusterFS的网络存储卷。
sudo gluster volume create gvz 10.1.1.201:/zpool-gvz
# 将GlusterFS的网络存储卷挂载为本地虚拟卷,以便直接访问。
# 首先,创建挂载点目录。
sudo mkdir /home/supermap/gvzv
# 然后,将GlusterFS的网络存储卷挂载到上面创建的目录。
sudo mount -t glusterfs 10.1.1.201:/gvz /home/supermap/gvzv
# 现在,可以直接访问该目录,与本地文件系统完全相同。
ls -l /home/supermap/gvzv
然后,将本地卷挂载到Kubernetes中的pod,使用hostpath存储类型:
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-provisioner-gvz
spec:
capacity:
storage: 200Ti
accessModes:
- ReadWriteOnce
hostPath:
path: /home/supermap/gvzv
将上面文件保存为 gluster-pv.yaml,然后运行 kubectl apply -f gluster-pv.yaml 即可,使用 kubectl get pv 查看信息。
这种方式的好处是非常简单,可以从宿主机同时直接查看内容,但是因为hostpath不可漂移,存在单点故障和性能瓶颈,建议只在开发、调试环境下使用。
2、创建终结点
也可以直接将GlusterFS集群服务提供给Kubernetes集群使用,需要一系列操作进行设置。下面将介绍这一方法。
创建(endpoint.yaml),可以聚合多个节点的GlusterFS服务。
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-cluster
namespace: default
subsets:
- addresses:
- ip: 10.1.1.184
ports:
- port: 1000
protocol: TCP
3、创建服务点
创建(service.yaml),将GlusterFS通过Kubernetes服务提供访问。
apiVersion: v1
kind: Service
metadata:
name: glusterfs-cluster
namespace: default
spec:
ports:
- port: 1000
protocol: TCP
targetPort: 1000
sessionAffinity: None
type: ClusterIP
4、创建使用者
创建(pod.json),将GlusterFS的Volume挂载到pod中。
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "glusterfs"
},
"spec": {
"containers": [
{
"name": "glusterfs",
"image": "nginx",
"volumeMounts": [
{
"mountPath": "/mnt/glusterfs",
"name": "glusterfsvol"
}
]
}
],
"volumes": [
{
"name": "glusterfsvol",
"glusterfs": {
"endpoints": "glusterfs-cluster",
"path": "gvx",
"readOnly": true
}
}
]
}
}
上面的这个pod的例子直接使用了GlusterFS集群的服务。因为新版的Kubernetes提出了CSI接口,因此还是建议使用下面的PV/PVC/StorageClass这一套接口来实现访问架构,应用pod能具有更好的兼容性和可移植性。
5、创建PV
将GlusterFS的卷映射为Kbernetes的持久卷(pv),从而提供统一的访问方法。
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-dev-volume
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: "glusterfs-cluster"
path: "gvx"
readOnly: false
6、创建PVC
通过pvc(持久卷申请),Kubernetes可以自动在可用资源分配持久卷。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: glusterfs-nginx
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
7、测试持久卷
创建 pod-nginx.yaml,使用pvc来定义存储。跟上面2中的用法有点不同,2中使用直接挂载volume卷的方法,可移植性不如使用pvc这个统一的CSI(容器存储借口)标准规范接口。
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
s:
- name: nginx
image: nginx:1.7.9
ports:
-Port: 80
volumeMounts:
- name: gluster-dev-volume
mountPath: "/usr/share/nginx/html"
volumes:
- name: gluster-dev-volume
persistentVolumeClaim:
claimName: glusterfs-nginx
8、执行和获取状态信息
按下面的方法执行命令,获取状态信息。
$ kubectl apply -f glusterfs-endpoints.json
$ kubectl get ep
$ kubectl apply -f glusterfs-service.json
$ kubectl get svc# 查看测试 Pod$ kubectl apply -f glusterfs-pod.json
$ kubectl get pods
$ kubectl describe pods/glusterfs
$ kubectl exec glusterfs -- mount | grep gluster
除了上面的方法之外,还有其它的在Kubernetes中使用Gluster的方法,如使用heketi进行GlusterFS Volume的动态创建和管理,可以支持StorageClass的动态卷特性(Heketi使用hostnet和Volume映射到宿主机的Gluster服务,采用Daemonset方式进行节点管理)。