k8s的pv和pvc

简介

PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需关注用户如何使用,同样的用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。

pvc和pv的关系与pod和node关系类似,前者消耗后者的资源。pvc可以向pv申请指定大小的存储资源并设置访问模式。

生命周期

pv和pvc遵循以下生命周期:

  • 供应准备。管理员在集群中创建多个pv供用户使用。
  • 绑定。用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
  • 使用。用户可在pod中像volume一样使用pvc。
  • 释放。用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
  • 回收。pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
    • 保留策略允许人工处理保留的数据。
    • 删除策略将删除pv和外部关联的存储资源,需要插件支持。
    • 回收策略将执行清除操作,之后可以被新的pvc使用,需要插件支持。

pv类型

pv支持以下类型:

  • GCEPersistentDisk
  • AWSElasticBlockStore
  • NFS
  • iSCSI
  • RBD (Ceph Block Device)
  • Glusterfs
  • HostPath (single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
  • -

pv属性

pv拥有以下属性:

  • 容量。目前仅支持存储大小,未来可能支持IOPS和吞吐量等。
  • 访问模式。ReadWriteOnce:单个节点读写。ReadOnlyMany:多节点只读。ReadWriteMany:多节点读写。挂载时只能使用一种模式。
  • 回收策略。目前NFS和HostPath支持回收。 AWS、EBS、GCE、PD和Cinder支持删除。
  • 阶段。分为Available(未绑定pvc)、Bound(已绑定)、Released(pvc已删除但资源未回收)、Failed(自动回收失败)

    可以通过

kubectl get pv       查看

pvc属性

  • 访问模式。与pv的语义相同。在请求资源时使用特定模式。
  • 资源。申请的存储资源数量

pv和pvc运行原理

PersistentVolumeClaimBinder以单例模式运行在master上,它会监控所有pvc并将它们绑定到与请求资源最接近的足量的pv上。也就是说pvc占用的实际存储资源可能会大于请求的资源。k8s不保证底层存储的高可用,需要提供者负责。

NewPersistentVolumeOrderedIndex用来索引不同访问模式的pv并基于容量排序。PersistentVolumeClaimBinder根据pvc的需求来查找索引。

pv是全局的,pvc可以指定namespace。

默认情况下pv使用的回收策略为Retain,此时如果绑定的pvc删除后,pv将处于“Released”状态,需要手动处理pv或自定义回收脚本。

猜你喜欢

转载自blog.csdn.net/luanpeng825485697/article/details/81670879