date: 2020-07-23title: k8s之PV、SC、PVC的关系 #标题
tags: k8s存储 #标签
categories: k8s # 分类

用于记录下k8s集群中pv(Persistent)、sc(Storeage Class)、pvc(PersistenVolumeClaim)的相关概念。
PersistentVolume(PV 存储卷)是集群中的一块存储空间,由集群管理员管理、或者由 Storage Class(存储类)自动管理。PV(存储卷)和 node(节点)一样,是集群中的资源(kubernetes 集群由存储资源和计算资源组成)。PersistentVolumeClaim(存储卷声明)是一种类型的 Volume(数据卷),PersistentVolumeClaim(存储卷声明)引用的 PersistentVolume(存储卷)有自己的生命周期,该生命周期独立于任何使用它的容器组。PersistentVolume(存储卷)描述了如何提供存储的细节信息(NFS、cephfs等存储的具体参数)。

PersistentVolumeClaim(PVC 存储卷声明)代表用户使用存储的请求。Pod 容器组消耗 node 计算资源,PVC 存储卷声明消耗 PersistentVolume 存储资源。Pod 容器组可以请求特定数量的计算资源(CPU / 内存);PersistentVolumeClaim 可以请求特定大小/特定访问模式(只能被单节点读写/可被多节点只读/可被多节点读写)的存储资源。

根据应用程序的特点不同,其所需要的存储资源也存在不同的要求,例如读写性能等。集群管理员必须能够提供关于 PersistentVolume(存储卷)的更多选择,无需用户关心存储卷背后的实现细节。为了解决这个问题,K8s 引入了 StorageClass(存储类)的概念。

PV和PVC的关系

  • PV是集群中的存储资源,通常由集群管理人员创建和管理;
  • SC用于对PV进行分类,如果正确配置,SC可以根据PVC的请求动态创建PV;
  • PVC是使用该资源的请求,通常由应用程序提出的请求,并指定对应的SC和需要的存储空间大小;
  • PVC可以作为数据卷的一种,被挂载到容器中使用。

PVC的管理过程

PV和PVC的管理过程如下:

k8s之PV、SC、PVC的关系 - 图1

存储资源的回收策略

当用户不在需要其数据卷时,可以删除掉其 PVC,此时其对应的 PV 将被集群回收并再利用。K8s 集群根据 PV 中的 reclaim policy(回收策略)决定在其被回收时做对应的处理。当前支持的回收策略有:Retained(保留)、Recycled(重复利用)、Deleted(删除)

Retain

保留策略需要集群管理员手工回收该资源。当绑定的 PVC 被删除后,PV 仍然存在,并被认为是”已释放“。但是此时该存储卷仍然不能被其他 PVC 绑定,因为前一个绑定的 PVC 对应容器组的数据还在其中。

可以通过如下步骤回收该 PV:

  • 删除该 PersistentVolume。PV删除后,其数据仍然存在于对应的外部存储介质中(nfs、cefpfs、glusterfs 等)
  • 手工删除对应存储介质上的数据
  • 手工删除对应的存储介质,也可以创建一个新的PV并再次使用该存储介质。

Recycle

  • 再利用策略将在 PV 回收时,执行一个基本的清除操作(rm -rf /thevolume/*),并使其可以再次被新的 PVC 绑定。
  • 也可以自定义一个 recycler pod template,用于执行清除操作。参考: 官方文档

Delete

删除策略将从 k8e 集群移除 PV 以及其关联的外部存储介质(云环境中的 AWA EBS、GCE PD、Azure Disk 或 Cinder volume)。