Kubernetes搭建NFS原生服務

Kubernetes搭建NFS原生服務

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安裝了。服務器

第一步,建立宿主機PV和PVC

關於Kubernetes的存儲架構,參考:網絡

一、建立宿主機的PV

這裏的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。性能

二、建立供NFS存儲的PVC

建立一個跟上面對應的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須要的基礎存儲已經準備好了。

第二步,安裝NFS Provisioner

運行https://github.com/openthings/kubernetes-tools/blob/master/nfs/nfs-install.sh,內容以下:

helm install ./nfs-server-provisioner --name nfs-server --namespace default
  • 注意,必定要在上面第一步以後運行,不然將會自動使用StorageClass來建立所用的持久卷,而目前持久卷默認的是gcp/aws之類的雲存儲,會致使失敗,一直處於pending狀態。

其中的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。

第三步,使用NFS的PV和PVC

一、建立PVC

首先,分配一個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提供的存儲服務,直接使用了物理磁盤,所以磁盤問題仍然會影響存儲的可靠性、可用性。在kubernetes中運行主要改進了部署和管理的效率。
    • NFS不提供存儲冗餘、故障轉移、複製等功能,若是須要使用更高級的Rook、Ceph、HDFS等複製性冗餘存儲系統。

上面的方法,是將一個宿主機目錄映射爲NFS的PV卷,而後在NFS上面能夠分配若干個邏輯PV,經過PVC或者StorageClass動態建立。

若是要將多個設備磁盤掛載進PV卷,方法包括:

  • 有磁盤陣列的話,組裝爲一個邏輯盤。不過,JBOD之類的磁盤失效問題仍然是存在的。
  • 可使用mount將其它磁盤做爲子目錄掛載進主目錄,但其每一個子目錄容量取決於原始磁盤目錄的大小,不能平滑延展。
  • 也能夠將多個磁盤使用LVM首先組裝爲一個邏輯大盤,而後再掛載進來,能夠做爲一個磁盤總體進行存儲操做。
  • 能夠運行多個NFS實例。須要修改的配置參數比較多,不建議使用。

更多參考:

相關文章
相關標籤/搜索