服务器之家:专注于服务器技术及软件下载分享
分类导航

服务器资讯|IT/互联网|云计算|区块链|软件资讯|操作系统|手机数码|百科知识|免费资源|头条新闻|

服务器之家 - 新闻资讯 - 云计算 - K8s 持久化存储 PV 与 PVC,到底有哪些不同?

K8s 持久化存储 PV 与 PVC,到底有哪些不同?

2023-07-13 12:00未知服务器之家 云计算

HostPath 是一种持久化存储,但 HostPath 内容是存储在节点上,导致只适合读取。 如果要求 Pod 重新调度后仍然能使用之前读写过的数据,就只能使用网络存储了,网络存储种类非常多,且有不同的使用方法,常见公有云提供商有块存

HostPath 是一种持久化存储,但 HostPath 内容是存储在节点上,导致只适合读取。

如果要求 Pod 重新调度后仍然能使用之前读写过的数据,就只能使用网络存储了,网络存储种类非常多,且有不同的使用方法,常见公有云提供商有块存储、文件存储、对象存储三种。

K8s 解决这个问题的方式是抽象了PV 和 PVC 来解耦这个问题,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像 CPU 和内存一样,声明要多少即可。

  • PV:描述是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录。

  • PVC:描述是 Pod 所希望使用的持久化存储的属性,比如,Volume 存储的大小、可读写权限等等。

Kubernetes 管理员设置好网络存储的类型,提供对应的 PV 描述符配置到 K8s,使用者需要存储的时候只需要创建 PVC,然后在 Pod 中使用 Volume 关联 PVC,即可让 Pod 使用到存储资源,它们之间的关系如下图所示。
K8s 持久化存储 PV 与 PVC,到底有哪些不同?

CSI

Kubernetes 提供了 CSI 接口(Container Storage Interface,容器存储接口),基于 CSI 这套接口,可以开发定制出 CSI 插件,从而支持特定的存储,达到解耦的目的。
例如在 kube-system 命名空间下 everest-csi-controller 和 everest-csi-driver 就是某厂商开发的存储控制器和驱动。有了这些驱动就可以使用块存储、文件存储、对象存储。

$kubectlgetpo--namespace=kube-systemNAMEREADYSTATUSRESTARTSAGEeverest-csi-controller-6d796fb9c5-v22df2/2Running09m11severest-csi-driver-snzrr1/1Running012meverest-csi-driver-ttj281/1Running012meverest-csi-driver-wtrk61/1Running012m

PV

来看一下 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

这里 csi 下面的内容是特定的字段,在其他地方无法使用。
下面创建这个PV并查看。

    
    $ kubectl create -f pv.yaml
    
    persistentvolume/pv-example created
    
    
    
    $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-example 10Gi RWX Retain Available

    RECLAIM POLICY 是指 PV 的回收策略, Retain 表示 PVC 被释放后 PV 继续保留。 STATUS 值为 Available,表示 PV 处于可用的状态。

    PVC

    PVC 可以绑定一个 PV,示例如下。

    apiVersion:v1kind:PersistentVolumeClaimmetadata:name:pvc-examplespec:accessModes:-ReadWriteManyresources:requests:storage:10Gi#声明存储的大小volumeName:pv-example#PV的名称

    创建PVC并查看。

      
      $ kubectl 
      create -f pvc.yaml
      
      persistentvolumeclaim/pvc-example created
      
      
      
      $ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-example Bound pv-example 10Gi RWX

      这里可以看到状态是Bound,VOLUME是pv-example,表示PVC已经绑定了PV。
      再来看下PV。

      $kubectlgetpvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEpv-example10GiRWXRetainBounddefault/pvc-

      可以看到状态也变成了 Bound,CLAIM 是 default/pvc-example,表示这个 PV 绑定了 default 命名空间下的 pvc-example 这个 PVC。
      这里一个比较有意思的地方是 CLAIM 是 default/pvc-example,为什么要显示 default 呢,这是因为 PV 是集群级别的资源,并不属于某个命名空间,而 PVC 是命名空间级别的资源,PV 可以与任何命名空间的 PVC 资源绑定。
      K8s 持久化存储 PV 与 PVC,到底有哪些不同?

      来源:本文转自“运维小白之路”。


      延伸 · 阅读

      精彩推荐