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卷,方法包括:
更多参考: