Kubernetes能夠直接掛載多種文件系統,其中包括GlusterFS(https://kubernetes.io/docs/concepts/storage/volumes/#glusterfs)。html
這裏採用最簡單的方法,掛載宿主系統的GlusterFS卷給Kubernetes中的pod使用。nginx
關於GlusterFS更多信息,參見:json
最簡單的方法是使用mount掛載一個GlusterFS的Volume到本地卷,如:c#
# 基於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存儲類型:api
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不可漂移,存在單點故障和性能瓶頸,建議只在開發、調試環境下使用。session
也能夠直接將GlusterFS集羣服務提供給Kubernetes集羣使用,須要一系列操做進行設置。下面將介紹這一方法。架構
建立(endpoint.yaml),能夠聚合多個節點的GlusterFS服務。app
apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster namespace: default subsets: - addresses: - ip: 10.1.1.184 ports: - port: 1000 protocol: TCP
建立(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
建立(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能具備更好的兼容性和可移植性。
將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
經過pvc(持久卷申請),Kubernetes能夠自動在可用資源分配持久卷。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: glusterfs-nginx spec: accessModes: - ReadWriteMany resources: requests: storage: 2Gi
建立 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: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 volumeMounts: - name: gluster-dev-volume mountPath: "/usr/share/nginx/html" volumes: - name: gluster-dev-volume persistentVolumeClaim: claimName: glusterfs-nginx
按下面的方法執行命令,獲取狀態信息。
$ 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方式進行節點管理)。
此外,最新的Gluster提供原生支持Kubernetes的方法,不過目前還處於早期階段,暫時還不具有可用性。
更多: