【云原生--Kubernetes】PV、PVC


容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。

一. PV和PVC

1.1 PV 概念

  1. PersistentVolume(PV) 是集群中由管理员配置的一段网络存储。集群中的资源就像一个节点是一个集群资源,可以从远程的NFS 或分布式对象存储系统中创建得来(PV 存储空间大小、访问方式)。
  2. PV 是诸如卷之类的卷插件,但是只有独立于使用 PV 的任何单个 pod 的生命周期。
  3. 该 API 对象捕获存储的实现细节,即 NFS,ISCSI 或云提供商特定的存储系统。
  4. PV 就是从存储设备中的空间创建出一个存储资源。

1.2 PVC 概念

  1. PersistentVolumeClaim(PVC) 是用户存储的请求。PVC 的使用逻辑:在 pod 中定义一个存储卷(该存储卷类型为PVC),定义的时候直按指定大小,PVC 必须与对应的 PV 建立关系,PVC 会根据定义去 PV 申请,而 PV是由存储空间创建出来的。PV 和 PVC 是 kubernetes 抽象出来的一种存储资源。
  2. 虽然 PersistentVolumeClaims 允许用户使用抽象存储资源,但是常见的需求是,用户需要根据不同的需求去创建PV,用于不同的场景。而此时需要集群管理员提供不同需求的 PV,而不仅仅是 PV 的大小和访问模式,但又不需要用户了解这些卷的实现细节。
  3. 对于这样的需求,此时可以采用 storageclass 资源。

1.3 PV 与 PVC

  • PV 与 PVC 之间的关系
    PV 是集群中的资源,PVC 是对这些资源的请求,也是对资源的索引检查。
  • PV和PVC的生命周期
    PV 和 PVC 之间的相互作用遵循这个生命周期:
    Provisioning(配置) —> Binding(绑定) —> Using(使用) —> Releasing(释放) —> Recycling(回收)
  • Provisioning,即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
  • Binding,将 PV 分配给 PVC
  • Using,Pod 通过 PVC 使用该Volume,并可以通过准入控制StorageProtection(1.9及以前版本为PVCProtection) 阻止删除正在使用的PVC
  • Releasing,Pod 释放 Volume 并删除 PVC
  • Recycling,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
    根据这 5 个阶段,PV 的状态有以下 4 种
  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PV 已经绑定到 PVC
  • Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
  • Failed(失败):表示该 PV 的自动回收失败

1.4 PV 创建流程

  1. 一个PV创建完后状态会变成Available,等待被PVC绑定。
  2. 一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。
  3. Pod使用完后会释放PV,PV的状态变成Released。
  4. 变成Released的PV会根据定义的回收策略做相应的回收工作。

1.5 回收策略

有三种回收策略,Retain、Delete和Recycle。

  1. Retain就是保留现场,K8S集群什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。
  2. Delete策略,K8S会自动删除该PV及里面的数据。
  3. Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

1.6 PV、PVC定义方式

查看pv的定义方式
kubectl explain pv

FIELDS:
	apiVersion: v1
	kind: PersistentVolume
	metadata:    #由于 PV 是集群级别的资源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespace
	  name: 
	spec

查看pv定义的规格
kubectl explain pv.spec

spec:
  nfs:(定义存储类型)
    path:(定义挂载卷路径)
    server:(定义服务器名称)
  accessModes:(定义访问模型,有以下三种访问模型,以列表的方式存在,也就是说可以定义多个访问模式)
    - ReadWriteOnce          #(RWO)存储可读可写,但只支持被单个 Pod 挂载
	- ReadOnlyMany           #(ROX)存储可以以只读的方式被多个 Pod 挂载
	- ReadWriteMany          #(RWX)存储可以以读写的方式被多个 Pod 共享
#nfs 支持全部三种;iSCSI 不支持 ReadWriteMany(iSCSI 就是在 IP 网络上运行 SCSI 协议的一种网络存储技术);HostPath 不支持 ReadOnlyMany 和 ReadWriteMany。
  capacity:(定义存储能力,一般用于设置存储空间)
    storage:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值