Kubernetes存儲系統-NFS Server的Helm部署

Kubernetes存儲系統-NFS Server的Helm部署

其它參考:html

NFS Server Provisioner 是Kubernetes源碼外部的動態存儲提供者,底層是經過NFS(網絡文件系統)來提供的。你能夠經過它快速地部署一個幾乎能夠在任何地方使用的網絡共享存儲。node

該Helm chart 將會部署一個Kubernetes的 external-storage projects nfs 提供者,包含一個內建的NFS server,可是不會鏈接到一個已經存在的NFS server上(能夠經過PV直接使用)。鏈接到已有的 NFS Server能夠經過 NFS Client Provisioner 來訪問。git

$ helm install stable/nfs-server-provisioner

警告:上面的命令按照缺省參數安裝,這雖然可以工做,可是存儲在該捲上的數據將不會被持久保存到磁盤上。github

注意:在運行時上面的命令以前,建議運行helm repo update來更新charts庫到最新版本。若是經過代理訪問,可使用以下的命令(修改https_proxy爲本身的代理服務地址):api

sudo https_proxy=http://192.168.199.99:9999 helm repo update

一、簡介

本項目的chart啓動了一個nfs-server-provisioner部署,在Kubernetes集羣上使用Helm包管理器來安裝。服務器

二、安裝Chart

安裝 chart ,版本名稱去爲 my-release,以下:網絡

$ helm install stable/nfs-server-provisioner --name my-release

該命令使用缺省配置在Kubernetes上安裝nfs-server服務器。該 configuration 節的參數列表能夠在安裝期間進行配置。ide

三、卸載 Chart

爲了卸載/刪除 my-release deployment,運行:ui

$ helm delete my-release

該命令將刪除全部安裝到kuubernetes中的組件。this

四、配置

下面的表格列出了能夠配置的參數:

Parameter Description Default
imagePullSecrets Specify image pull secrets nil (does not add image pull secrets to deployed pods)
image.repository The image repository to pull from quay.io/kubernetes_incubator/nfs-provisioner
image.tag The image tag to pull from v1.0.8
image.pullPolicy Image pull policy IfNotPresent
service.type service type ClusterIP
service.nfsPort TCP port on which the nfs-server-provisioner NFS service is exposed 2049
service.mountdPort TCP port on which the nfs-server-provisioner mountd service is exposed 20048
service.rpcbindPort TCP port on which the nfs-server-provisioner RPC service is exposed 51413
service.nfsNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the NFS service nil
service.mountdNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the mountd service nil
service.rpcbindNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the RPC service nil
persistence.enabled Enable config persistence using PVC false
persistence.storageClass PVC Storage Class for config volume nil
persistence.accessMode PVC Access Mode for config volume ReadWriteOnce
persistence.size PVC Storage Request for config volume 1Gi
storageClass.create Enable creation of a StorageClass to consume this nfs-server-provisioner instance true
storageClass.provisionerName The provisioner name for the storageclass cluster.local/{release-name}-{chart-name}
storageClass.defaultClass Whether to set the created StorageClass as the clusters default StorageClass false
storageClass.name The name to assign the created StorageClass nfs
resources Resource limits for nfs-server-provisioner pod {}
nodeSelector Map of node labels for pod assignment {}
tolerations List of node taints to tolerate []
affinity Map of node/pod affinities {}
$ helm install stable/nfs-server-provisioner --name my-release \
  --set=image.tag=v1.0.8,resources.limits.cpu=200m

可選的方法,經過YAML文件來指定這些參數,例如:

$ helm install stable/nfs-server-provisioner --name my-release -f values.yaml

提示: 你可使用缺省的 values.yaml做爲例子。

五、持久化

該 nfs-server-provisioner 鏡像文件存儲了它的配置數據,更重要的是, 其 dynamic volumes 所管理的 /export 路徑。

The chart mounts a Persistent Volume volume at this location. The volume can be created using dynamic volume provisioning. However, it is highly recommended to explicitly specify a storageclass to use rather than accept the clusters default, or pre-create a volume for each replica.

If this chart is deployed with more than 1 replica, storageClass.defaultClass=true and persistence.storageClass, then the 2nd+ replica will end up using the 1st replica to provision storage - which is likely never a desired outcome.

5.1 建議的持久化配置例子

  • 下面的配置參數能夠在values.yaml中修改,決定nfs-server-provisioner的基礎配置。

下面是一個建議的配置例子,當另外的storage class存在用於提供持久化:

persistence:
  enabled: true
  storageClass: "standard"
  size: 200Gi

storageClass:
  defaultClass: true

在不少集羣上,cloud provider集成將建立一個 "standard" storage class,其將建立一個 volume (e.g. a Google Compute Engine Persistent Disk or Amazon EBS volume) 來提供持久性。

下面是沒有另外的 storage class提供持久化的例子:

persistence:
  enabled: true
  storageClass: "-"
  size: 200Gi

storageClass:
  defaultClass: true

在這個配置中, PersistentVolume 必須爲每個複製建立,使其可用。安裝Helm chart,而後查看 PersistentVolumeClaim 將會建立併爲你的 PersistentVolume綁定提供須要的名稱。

  • 在gce上部署基礎nfs-server-provisioner服務

必要的 PersistentVolume例子:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-nfs-server-provisioner-0
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    fsType: "ext4"
    pdName: "data-nfs-server-provisioner-0"
  claimRef:
    namespace: kube-system
    name: data-nfs-server-provisioner-0
  • 在本地機器上部署基礎nfs-server-provisioner服務

下面是運行在裸機上的配置例子,使用hostPath存儲卷類型:

persistence:
  enabled: true
  storageClass: "-"
  size: 200Gi

storageClass:
  defaultClass: true

nodeSelector:
  kubernetes.io/hostname: {node-name}

在這個配置中, PersistentVolume 必須爲每個複製建立,使其可用。安裝 Helm chart,而後查看 PersistentVolumeClaim's已經建立併爲 PersistentVolume 的綁定提供須要的名稱。

5.2 建立PV

必要的 PersistentVolume的例子:

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: kube-system
    name: data-nfs-server-provisioner-0

警告: hostPath volumes 不能在Kubernetes集羣的不一樣節點機器間遷移。 所以,咱們限制來了 nfs-server-provisioner pod運行在單個node上。這對於產品生產環境的部署來講不必定合適。

      至此,基於NFS的NFS提供者和PV卷已經部署完畢,能夠經過建立PVC和使用PVC的Pod來訪問,或者直接將PV服務mount到本地目錄,能夠直接讀寫。參見下面的5.三、5.四、5.5節內容。

5.3 建立PVC

保存下面的內容爲nfs-pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: "nfs"
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi

運行:

kubectl create -f nfs-pvc.yaml

到Persistent Volumes查看,將會爲PVC自動建立一個PV。

5.4 使用PVC

在pod中,可使用上面建立的pvc。保存下面的文件爲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: v1
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

本Pod將進行一個寫入文件操做。執行:

kubectl create -f nfs-pvc-client.yaml

而後到Dashboard的pods欄能夠看到pod的啓動狀況,或者運行kubectl get pod -o wide查看列表。

⚠️注意

第一次部署上述的pod時,老是提示mount failed。在宿主機安裝nfs的支持庫後,刷新狀態變爲正常。

sudo apt install nfs-common nfs-kernel-server

如上所示,須要刷新Kubernetes的Dashboard控制面板。

5.5 直接鏈接

所建立的nfs-server是能夠從外部經過nfs-client訪問的,也能夠mount到宿主機上去。以下操做:

sudo mount -t nfs 10.108.7.49:/export/pvc-faebddde-651e-11e8-a532-1831bfb4e036 /home/openthings/nfs

其中,10.108.7.49:/export/pvc-faebddde-651e-11e8-a532-1831bfb4e036 是上面經過pvc建立的pv,能夠經過Kubernetes dashboard的Persistent Volumes查看裏面的Source內容,而後替換進來。本地掛載目錄 /home/openthings/nfs 須要用mkdir預先建好目錄,能夠替換成本身的目錄。

相關文章
相關標籤/搜索