PrefacePV用于定义持久存储卷,可以将NFS/GFS/CFS等外部存储定义为K8S内部对象,是一个服务提供者。PVC会找到一个合适的PV来绑定。绑定成功后,就可以将PVC提供给pod了。更新历史20200710-初稿-左成礼原文地址-https://blog.zuolinux.com/2020/07/10/storage-pv-pvc.htmlDefinePV/PVCDefineaPV[root@master01~]#catpv.yamlapiVersion:v1kind:PersistentVolumemetadata:name:nfs1-pvspec:storageClassName:manualcapacity:storage:1GiaccessModes:-ReadWriteManynfs:server:192.168.10.17path:"/data/nfs"定义一个PVC[root@master01~]#catpvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:nfs1-pvcspec:accessModes:-ReadWriteManystorageClassName:manualresources:requests:storage:1Gi#kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEnfs1-pv1GiRWX保留释放default/nfs1-pvcmanual118s#kubectlgetpvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEnfs1-pvcPendingmanual14sPVC将查找storageClassName同名的PV,然后在这些PV中查找满足spec.resources.requests.storage条件的PV,找到后将PVC绑定到PV上。如果没有满足条件的PV,则PVC会处于pending状态。K8S的一个名为PersistentVolumeController的controller会不断检查是否有pendingPVC,是否有合格的PV。一旦出现符合条件的PV,就会将pendingPVC绑定到该PV上,然后PVC的状态变为Bound。在Pod中使用PVC/PV创建Pod[root@master01~]#catpod.yamlapiVersion:v1kind:Podmetadata:name:mypodspec:containers:-name:webimage:nginxvolumeMounts:-name:nfsmountPath:"/usr/share/nginx/html"volumes:-name:nfspersistentVolumeClaim:claimName:nfs1-pvcspec.volumes.persistentVolumeClaim指定哪个PVCspec.containers.volumeMounts用于卷指定哪个卷(名称)挂载到哪个目录(mountPath)容器在容器挂载目录下写一个index.html文件kubectlexec-itmypod--touch/usr/share/nginx/html/index.html在远程NFS上可以看到新建的文件[root@work03~]#ls/data/nfs/index.html显示挂载成功。Pod上运行的节点,即work01#df-h|grepnfs192.168.10.107:/data/nfs15G6.7G6.8G50%/var/lib/kubelet/pods/6adcbab7-63cd-4c4e-8db7-7234b9b49999/volumes/kubernetes.io~nfs/nfs1-pv运行df可以看到K8S将NFS目录挂载到主机的/var/lib/kubelet/pods/{podid}/volumes/kubernetes.io~nfs/{PV名称},在这个本地目录下,然后挂载该目录在容器中。结论PVC不关心后端存储提供者是NFS还是GFS,哪种类型的存储由PV定义,PVC只与隐藏了存储实现细节的PV连接。这种方法是静态分配。如果有1000个Pod,每个Pod都有一个PVC,那么管理员需要手动创建1000个PV。随着集群规模的扩大,将无法进行有效的管理。K8S提供了一种可以动态分配的工作机制,自动创建PV。该机制依赖于一个名为StorageClass的API对象。联系我微信公众号:zuolinux_com
