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:
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
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方式進行節點管理)。
此外,最新的Gluster提供原生支持Kubernetes的方法,不過目前還處於早期階段,暫時還不具備可用性。
更多: