NFS是一個網絡文件系統,能夠將存儲服務器的磁盤共享到集羣範圍內使用。雖然有Rook、CephFS、Gluster、Swift、Cinder、HDFS等集羣存儲系統以及Google、微軟、百度的網盤,但NFS使用簡單,性能也還不錯,是快速自建集羣的存儲的首選方案,並且經過Kubernetes的PV/PVC等接口,之後還能夠容易地遷移到新的存儲系統。html
使用NFS有幾種狀況:git
這裏主要介紹Kubernetes中新裝NFS集羣及其使用。github
NFS支持Helm安裝工具,按照下面操做:api
可是,缺省狀況下的安裝是不支持持久化的,NFS服務的數據保存在臨時目錄中,關機會丟失數據,容量也有限。若是主機臨時目錄空間被耗光,還會致使主機奔潰。所以,須要將NFS的數據安裝到持久卷(PV)中。在GCP雲環境中,會提供StorageClass能夠直接建立出PV。在私有環境中,可使用HostPath建立PV,而後建立PVC,就能夠了配置到NFS的Helm參數文件中進行NFS安裝了。服務器
關於Kubernetes的存儲架構,參考:網絡
這裏的pv和pvc是nfs服務所使用的,而不是nfs提供的,使用HostPath捲來提供。參考:架構
主要內容以下:app
apiVersion: v1 kind: PersistentVolume metadata: name: data-nfs-server-provisioner-0 spec: capacity: storage: 200Gi accessModes: - ReadWriteOnce hostPath: path: /srv/volumes/data-nfs-server-provisioner-0 claimRef: namespace: default name: data-nfs-server-nfs-server-provisioner-0
而後,運行:工具
kubectl create -f nfs-data-pv.yaml
基於HostPath建立的PV完成,能夠到Kubernetes的Dashboard查看持久卷。其中數據的保存路徑爲path: /srv/volumes/data-nfs-server-provisioner-0。性能
建立一個跟上面對應的PVC,配置文件以下(https://github.com/openthings/kubernetes-tools/blob/master/nfs/nfs-data-pvc.yaml):
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-nfs-server-nfs-server-provisioner-0 spec: storageClassName: "" accessModes: - ReadWriteOnce resources: requests: storage: 200Gi
運行:
kubectl create -f nfs-data-pvc.yaml
至此,NFS須要的基礎存儲已經準備好了。
運行https://github.com/openthings/kubernetes-tools/blob/master/nfs/nfs-install.sh,內容以下:
helm install ./nfs-server-provisioner --name nfs-server --namespace default
其中的values.yaml文件作了一些修改,注意裏面的這些部分。以下:
persistence: enabled: true storageClass: "" accessMode: ReadWriteOnce size: 200Gi ## For creating the StorageClass automatically: storageClass: create: true defaultClass: false name: nfs
到Kubernetes的Dashboard查看NFS所提供的PV、StorageClass。注意這裏的PV是邏輯上的,使用了上面第一步經過HostPath物理磁盤目錄上建立的PV。
首先,分配一個pvc,命名爲nfs-pvc,內容以下(https://github.com/openthings/kubernetes-tools/blob/master/nfs/nfs-pvc.yaml):
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: storageClassName: "nfs" accessModes: - ReadWriteOnce resources: requests: storage: 100Mi
而後,建立一個測試應用,將使用nfs-pvc,內容以下(https://github.com/openthings/kubernetes-tools/blob/master/nfs/nfs-pvc-client.yaml):
# This mounts the nfs volume claim into /mnt and continuously # overwrites /mnt/index.html with the time and hostname of the pod. apiVersion: apps/v1beta1 kind: Deployment metadata: name: busybox-deployment spec: replicas: 1 # selector: # name: busybox-deployment template: metadata: labels: name: busybox-deployment spec: containers: - image: busybox command: - sh - -c - 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done' imagePullPolicy: IfNotPresent name: busybox volumeMounts: # name must match the volume name below - name: nfs mountPath: "/mnt" # volumes: - name: nfs persistentVolumeClaim: claimName: nfs-pvc
到宿主機,進入目錄/srv/volumes/data-nfs-server-provisioner-0,能夠看到NFS的配置、日誌以及所分配的pv卷做爲一個目錄,裏面包含了相應的數據(上面的pod生成的文件index.html)。
上面的方法,是將一個宿主機目錄映射爲NFS的PV卷,而後在NFS上面能夠分配若干個邏輯PV,經過PVC或者StorageClass動態建立。
若是要將多個設備磁盤掛載進PV卷,方法包括:
更多參考: