HostPath 是一种持久化存储,但 HostPath 内容是存储在节点上,导致只适合读取。
如果要求 Pod 重新调度后仍然能使用之前读写过的数据,就只能使用网络存储了,网络存储种类非常多,且有不同的使用方法,常见公有云提供商有块存储、文件存储、对象存储三种。
K8s 解决这个问题的方式是抽象了PV 和 PVC 来解耦这个问题,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像 CPU 和内存一样,声明要多少即可。
PV:描述是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录。
PVC:描述是 Pod 所希望使用的持久化存储的属性,比如,Volume 存储的大小、可读写权限等等。

$ kubectl get po --namespace=kube-systemNAME READY STATUS RESTARTS AGEeverest-csi-controller-6d796fb9c5-v22df 2/2 Running 0 9m11severest-csi-driver-snzrr 1/1 Running 0 12meverest-csi-driver-ttj28 1/1 Running 0 12meverest-csi-driver-wtrk6 1/1 Running 0 12m
来看一下 PV 如何描述持久化存储,如创建了一个文件存储,这个文件存储 ID 为 68e4a4fd-d759-444b-8265-20dc66c8c502 ,挂载地址为 nas01-mycloud.com:/share-96314776。如果想在k8s中使用这个文件存储,则需要先创建一个PV来描述这个存储,如下所示。
apiVersion: v1kind: PersistentVolumemetadata: name: pv-examplespec: accessModes: - ReadWriteMany # 读写模式 capacity: storage: 10Gi # 定义PV的大小 csi: driver: nas.csi.everest.io # 声明使用的驱动 fsType: nfs # 存储类型 volumeAttributes: everest.io/share-export-location: nas01-mycloud.com:/share-96314776 # 挂载地址 volumeHandle: 68e4a4fd-d759-444b-8265-20dc66c8c502
$ kubectl create -f pv.yamlpersistentvolume/pv-example created$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-example 10Gi RWX Retain Available
PVC 可以绑定一个 PV,示例如下。
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-examplespec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi # 声明存储的大小 volumeName: pv-example # PV的名称
创建PVC并查看。
$ kubectl create -f pvc.yamlpersistentvolumeclaim/pvc-example created$ kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-example Bound pv-example 10Gi RWX
$ kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv-example 10Gi RWX Retain Bound default/pvc-

来源:本文转自“运维小白之路”。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70013542/viewspace-2963875/ ,如需转载,请注明出处,否则将追究法律责任。