其它參考: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 ,版本名稱去爲 my-release
,以下:網絡
$ helm install stable/nfs-server-provisioner --name my-release
該命令使用缺省配置在Kubernetes上安裝nfs-server服務器。該 configuration 節的參數列表能夠在安裝期間進行配置。ide
爲了卸載/刪除 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.
下面是一個建議的配置例子,當另外的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
綁定提供須要的名稱。
必要的 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
下面是運行在裸機上的配置例子,使用hostPath存儲卷類型:
persistence: enabled: true storageClass: "-" size: 200Gi storageClass: defaultClass: true nodeSelector: kubernetes.io/hostname: {node-name}
在這個配置中, PersistentVolume
必須爲每個複製建立,使其可用。安裝 Helm chart,而後查看 PersistentVolumeClaim
's已經建立併爲 PersistentVolume
的綁定提供須要的名稱。
必要的 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節內容。
保存下面的內容爲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。
在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控制面板。
所建立的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預先建好目錄,能夠替換成本身的目錄。