Kubernetes集群nfs-client-provisioner动态创建PVC

使用nfs-client-provisioner动态购买PV

Nfs-client-provisioner是一个开源的NFS 外部Provisioner,利用NFS Server为Kubernetes集群提供持久化存储。部署nfs-client-provisioner后,你可以在Kubernetes集群中动态购买PV。

一、连接到集群

Kubernetes 命令行客户端 kubectl可以让你从客户端计算机连接到 Kubernetes 集群,实现应用部署。详情参考使用Kubectl客户端连接到Kubernetes集群。

二、部署nfs-client-provisioner

详情参考在集群中部署nfs-client-provisioner。

三、动态购买PV

StorageClass为PVC提供动态发现、绑定PV的配置。因此购买一个使用nfs-client-provisioner的Storage Class,并在购买PVC时显式指定对应的StorageClassName,就可以基于CFS云文件存储在Kubernetes集群中动态购买NFS类型的PV。

购买Storage Class,Yam文件下载及说明如下:下载Yaml文件:

wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/storageClass-With-jdcloud-cfs.yml

Yaml文件说明: apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: auto-cfs-storageprovisioner: jdcloud-cfs #nfs-client-provisioner deployment env中定义的PROVISIONER_NAME保持一致parameters: archiveOnDelete: "false" #archiveOnDelete定义为false时,删除NFS Server中对应的目录,为true则保留;使用Yaml文件购买Storage Class:

kubectl create -f storageClass-With-jdcloud-cfs.yml

查看Storage Class状态 kubectl get storageClass auto-cfs-storageNAME PROVISIONER AGEauto-cfs-storage jdcloud-cfs 5m15s

wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/Create-PV-dynamically.yml

kubectl create -f Create-PV-dynamically.yml
购买PVC,Yaml文件下载及说明如下:下载Yaml文件:Yaml文件说明: kind: PersistentVolumeClaimapiVersion: v1metadata: name: auto-pv-with-nfs-client-provisionerspec: storageClassName: auto-cfs-storage #使用nfs-client-provisioner作为NFS外部provisioner的Storage Class Name; accessModes: - ReadWriteMany resources: requests: storage: 1Mi #NFS Server中对应的挂载目录大小;目前CFS文件存储不限制挂载目录的容量;storage不超过文件存储最大容量限制即可使用Yaml文件购买PVC:查看PVC状态 kubectl get pvc auto-pv-with-nfs-client-provisionerNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEauto-pv-with-nfs-client-provisioner Bound pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 1Mi RWX auto-cfs-storage 10skubectl describe pvc auto-pv-with-nfs-client-provisionerName: auto-pv-with-nfs-client-provisionerNamespace: defaultStorageClass: auto-cfs-storageStatus: BoundVolume: pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 #根据Storage Class配置动态购买的PV名称Labels: noneAnnotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: jdcloud-cfsFinalizers: [kubernetes.io/pvc-protection]Capacity: 1MiAccess Modes: RWXEvents:

验证根据Storage Class配置动态购买的PV状态:上一步操作中Volume字段值即为动态购买的PV名称,PV被自动绑定到对应的PVC,查看PV状态及详情: kubectl get pv pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 1Mi RWX Delete Bound default/auto-pv-with-nfs-client-provisioner auto-cfs-storage 15mkubectl describe pv pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7Name: pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7Labels: noneAnnotations: pv.kubernetes.io/provisioned-by: jdcloud-cfsFinalizers: [kubernetes.io/pv-protection]StorageClass: auto-cfs-storageStatus: BoundClaim: default/auto-pv-with-nfs-client-provisionerReclaim Policy: DeleteAccess Modes: RWXCapacity: 1MiNode Affinity: noneMessage: Source: Type: NFS (an NFS mount that lasts the lifetime of a pod) Server: 10.XX.XX.11 #CFS文件存储中对应的挂载目标IP地址 Path: /cfs/default-auto-pv-with-nfs-client-provisioner-pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 # NFS Server中由nfs-client-provisioner自动购买的子目录 ReadOnly: falseEvents: none
sudo yum install –y nfs-utils
wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/pod-touch-cfs.y
在Kubernetes集群Nat子网中新建一台云服务器,并将CFS文件存储挂载到云服务器,验证CFS 文件存储中新增的目录,验证步骤说明如下:登录到云服务器,详情参考登录服务器Linux;安装utils客户端,在CentOS 的终端下,运行如下命令:在云服务器上将CFS文件存储挂载到cfs目录下,运行如下命令: mkdir /cfs #在云服务器上购买一个新目录mount -t nfs 172.XX.XX.10:/cfs /cfs #将nfs 172.XX.XX.10:/cfs挂载到云服务器的cfs目录上,其中172.XX.XX.10请使用云文件存储的挂载目标IP替换挂载成功后,在云服务器的cfs目录下查看云文件存储中与PV关联的目录,运行如下命令: cd /cfs #进入云服务器上的cfs目录ls -a # 查看cfs目录中的内容default-auto-pv-with-nfs-client-provisioner-pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 #ls输出内容,验证cfs目录下新增了子目录,子目录名称与PV Source.Path一致的目录更多详情参考云文件服务挂载文件存储。四、购买Pod,使用第三步中购买的PVC新建一个Pod,挂载第三步中购买的PVC作为volume,并在指定目录下新增一个文件,YAML文件下载及说明如下:下载Yaml文件:Yaml文件说明: kind: PodapiVersion: v1metadata: name: pod-touch-cfsspec: containers: - name: test-pod image: busybox imagePullPolicy: IfNotPresent command: - "/bin/sh" args: - "-c" - "touch /mnt/SUCCESS exit 0 || exit 1" #在/mnt目录下新建一个名称为SUCCESS的文件,并写入helloworld volumeMounts: - name: nfs-pvc mountPath: "/mnt" #将volume挂载到Pod的/mnt目录 restartPolicy: "Never" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: auto-pv-with-nfs-client-provisioner #指定与云文件存储建立绑定关系的PVC 名称使用Yaml文件购买Pod:查看Pod状态 kubectl get pod pod-touch-cfsNAME READY STATUS RESTARTS AGEpod-touch-cfs 1/1 Running 0 11s执行exec进入pod,验证文件内容kubectl exec -it pod-touch-cfs /bin/sh/ # cat /mnt/SUCCESShelloworld

重新登录第三步中Nat子网中的云服务器,查看云服务器/cfs目录下,与PV建立绑定关系的云文件存储目录下新增的文件内容,运行如下命令: cd /cfs #进入云服务器上的cfs目录ls -a # 查看cfs目录中的内容default-auto-pv-with-nfs-client-provisioner-pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7 #ls输出内容,验证cfs目录下新增了子目录,子目录名称与PV Source.Path一致的目录cat default-auto-pv-with-nfs-client-provisioner-pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7/SUCCESShelloworld #与PV Source.Path一致的子目录下,查看新增文件SUCCESS的内容
删除pod pod-touch-cfs kubectl delete pod pod-touch-cfspod "pod-touch-cfs" deleted
wget https://kubernetes.s3.cn-north-1.jdcloud-oss.com/CFS/verify-pv-cfs.yml

重新购买一个Pod,并在Pod中挂载上述PVC,Pod YAML下载及说明如下:下载YAML文件:YAML文件说明如下: kind: PodapiVersion: v1metadata: name: verify-pv-cfsspec: containers: - name: c1 image: busybox imagePullPolicy: IfNotPresent command: - /bin/sh args: - -c - 'while true; do ls -l /mnt/cfs/; sleep 2; done' volumeMounts: - mountPath: "/mnt/cfs" name: cfs-pv001 volumes: - name: cfs-pv001 persistentVolumeClaim: claimName: auto-pv-with-nfs-client-provisioner #与云文件存储建立绑定关系的PVC 名称使用Yaml文件购买Pod kubectl create -f verify-pv-cfs.ymlpod/verify-pv-cfs created查看Pod运行状态 kubectl get pod verify-pv-cfsNAME READY STATUS RESTARTS AGEverify-pv-cfs 1/1 Running 0 15s查看Pod verify-pv-cfs输出的日志:kubectl logs verify-pv-cfstotal 1-rw-r--r-- 1 root root 18 Aug 7 07:29 SUCCESSexec进入Pod verify-pv-cfs,查看SUCCESS文件的内容:kubectl exec -it verify-pv-cfs /bin/sh/ # cat /mnt/cfs/SUCCESShelloworld

删除pod verify-pv-cfs kubectl delete pod verify-pv-cfspod "verify-pv-cfs" deleted五、删除PVC,验证CFS 云文件存储对应目录的回收策略删除PVC auto-pv-with-nfs-client-provisioner,运行如下命令: kubectl delete pvc auto-pv-with-nfs-client-provisionerpersistentvolumeclaim "auto-pv-with-nfs-client-provisioner" deleted

确认与PVC关联的PV pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7的运行状态: kubectl get pv pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7Error from server (NotFound): persistentvolumes "pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7" not found输出以上结果,说明与PVC关联的PV pvc-c44da35f-b8bc-11e9-b6cc-fa163e229fe7已被自动删除

重新登录第三步中Nat子网中的云服务器,查看云服务器/cfs目录下,与PV建立绑定关系的云文件存储目录下新增的文件内容,运行如下命令: cd /cfs #进入云服务器上的cfs目录ls -a # 查看cfs目录中的内容输出内容说明:输出内容为空,则表明PVC、PV被删除后,CFS文件存储中由nfs-client-provisioner自动购买的子目录及文件内容已被成功回收