learning/k8s-intermediate/persistent/pv.md
参考文档: Kubernetes 官方文档 Persistent Volumes
与管理计算资源相比,管理存储资源是一个完全不同的问题。为了更好的管理存储,Kubernetes 引入了 PersistentVolume 和 PersistentVolumeClaim 两个概念,将存储管理抽象成如何提供存储以及如何使用存储两个关注点。
::: tip 关注点分离
Kuboard 可以导出名称空间中应用程序的配置到一个 YAML 文件,然后在新的名称空间导入该 YAML 文件。
通过 PersistentVolume 和 PersistentVolumeClaim,Kubernetes 分离了提供存储和使用存储着两个关注点:
:::
PersistentVolume(PV 存储卷)是集群中的一块存储空间,由集群管理员管理、或者由 Storage Class(存储类)自动管理。PV(存储卷)和 node(节点)一样,是集群中的资源(kubernetes 集群由存储资源和计算资源组成)。PersistentVolumeClaim(存储卷声明)是一种类型的 Volume(数据卷),PersistentVolumeClaim(存储卷声明)引用的 PersistentVolume(存储卷)有自己的生命周期,该生命周期独立于任何使用它的容器组。PersistentVolume(存储卷)描述了如何提供存储的细节信息(NFS、cephfs等存储的具体参数)。
PersistentVolumeClaim(PVC 存储卷声明)代表用户使用存储的请求。Pod 容器组消耗 node 计算资源,PVC 存储卷声明消耗 PersistentVolume 存储资源。Pod 容器组可以请求特定数量的计算资源(CPU / 内存);PersistentVolumeClaim 可以请求特定大小/特定访问模式(只能被单节点读写/可被多节点只读/可被多节点读写)的存储资源。
根据应用程序的特点不同,其所需要的存储资源也存在不同的要求,例如读写性能等。集群管理员必须能够提供关于 PersistentVolume(存储卷)的更多选择,无需用户关心存储卷背后的实现细节。为了解决这个问题,Kubernetes 引入了 StorageClass(存储类)的概念
存储卷和存储卷声明的关系如下图所示:
PersistantVolume 和 PersistantVolumeClaim 的管理过程描述如下:
<p style="max-width: 720px;"> </p>下图主要描述的是 PV 和 PVC 的管理过程,因为绘制空间的问题,将挂载点与Pod关联了,实际结构应该如上图所示:
- Pod 中添加数据卷,数据卷关联PVC
- Pod 中包含容器,容器挂载数据卷
有两种方式为 PersistentVolumeClaim 提供 PersistentVolume : 静态、动态
静态提供 Static <Badge text="Kuboard 界面暂禁用该特性" type="warn"/>
集群管理员实现创建好一系列 PersistentVolume,它们包含了可供集群中应用程序使用的关于实际存储的具体信息。
<p style="max-width: 720px;"> </p>Kuboard界面上暂时禁用了手工创建 PV 的功能,但是您仍然可以使用 YAML 文件创建,并在PVC中使用。
动态提供 Dynamic <Badge text="Kuboard 已支持" type="success"/>
在配置有合适的 StorageClass(存储类)且 PersistentVolumeClaim 关联了该 StorageClass 的情况下,kubernetes 集群可以为应用程序动态创建 PersistentVolume。
<p style="max-width: 720px;"> </p>假设用户创建了一个 PersistentVolumeClaim 存储卷声明,并指定了需求的存储空间大小以及访问模式。Kubernets master 将立刻为其匹配一个 PersistentVolume 存储卷,并将存储卷声明和存储卷绑定到一起。如果一个 PersistentVolume 是动态提供给一个新的 PersistentVolumeClaim,Kubernetes master 会始终将其绑定到该 PersistentVolumeClaim。除此之外,应用程序将被绑定一个不小于(可能大于)其 PersistentVolumeClaim 中请求的存储空间大小的 PersistentVolume。一旦绑定,PersistentVolumeClaim 将拒绝其他 PersistentVolume 的绑定关系。PVC 与 PV 之间的绑定关系是一对一的映射。
PersistentVolumeClaim 将始终停留在 未绑定 unbound 状态,直到有合适的 PersistentVolume 可用。举个例子:集群中已经存在一个 50Gi 的 PersistentVolume,同时有一个 100Gi 的 PersistentVolumeClaim,在这种情况下,该 PVC 将一直处于 未绑定 unbound 状态,直到管理员向集群中添加了一个 100Gi 的 PersistentVolume。
对于 Pod 容器组来说,PersistentVolumeClaim 存储卷声明是一种类型的 Volume 数据卷。Kubernetes 集群将 PersistentVolumeClaim 所绑定的 PersistentVolume 挂载到容器组供其使用。
当用户不在需要其数据卷时,可以删除掉其 PersistentVolumeClaim,此时其对应的 PersistentVolume 将被集群回收并再利用。Kubernetes 集群根据 PersistentVolume 中的 reclaim policy(回收策略)决定在其被回收时做对应的处理。当前支持的回收策略有:Retained(保留)、Recycled(重复利用)、Deleted(删除)
保留 Retain
保留策略需要集群管理员手工回收该资源。当绑定的 PersistentVolumeClaim 被删除后,PersistentVolume 仍然存在,并被认为是”已释放“。但是此时该存储卷仍然不能被其他 PersistentVolumeClaim 绑定,因为前一个绑定的 PersistentVolumeClaim 对应容器组的数据还在其中。集群管理员可以通过如下步骤回收该 PersistentVolume:
删除 Delete
删除策略将从 kubernete 集群移除 PersistentVolume 以及其关联的外部存储介质(云环境中的 AWA EBS、GCE PD、Azure Disk 或 Cinder volume)。
再利用 Recycle <Badge text="Kuboard 暂不支持" type="warn"/>
::: tip 动态提供的 PersistentVolume 将从其对应的 StorageClass 继承回收策略的属性。 :::
Kubernetes v1.15 及以上版本 <Badge text="Kuboard 支持 CephFS 的扩容" type="success"/> 该特性只针对极少数的 PersistentVolume 类型有效。请参考 Expanding Persistent Volumes Claims
Kubernetes 支持 20 种存储卷类型(可参考 Types of Persistent Volumes),如下所示:
针对自建 Kubernetes 集群的情况,Kuboard 支持如下几种存储卷类型:
在 Kuboard 中查看 PersistentVolume 的界面如下图所示:
PersistentVolume 字段描述如下表所示:
| 字段名称 | 可选项/备注 |
|---|---|
| 容量 Capacity | 通常,一个 PersistentVolume 具有一个固定的存储容量(capacity) |
| Volume Mode | FEATURE STATE: Kubernetes v1.13 beta |
| Kubernetes 1.9 之前的版本,所有的存储卷都被初始化一个文件系统。当前可选项有:<li>block:使用一个 块设备(raw block device) </li><li>filesystem(默认值):使用一个文件系统</li> | |
| Access Modes | <li>可被单节点读写-ReadWriteOnce </li><li>可被多节点只读-ReadOnlyMany </li><li>可被多节点读写-ReadWriteMany</li> |
| 存储类 StorageClassName | 带有存储类 StorageClassName 属性的 PersistentVolume 只能绑定到请求该 StorageClass 存储类的 PersistentVolumeClaim。 |
| 没有 StorageClassName 属性的 PersistentVolume 只能绑定到无特定 StorageClass 存储类要求的 PVC。 | |
| 回收策略 Reclaim Policy | <li>保留 Retain – 手工回收 </li><li>再利用 Recycle – 清除后重新可用 (rm -rf /thevolume/*) </li><li>删除 Delete – 删除 PV 及存储介质</li> |
| Mount Options | 挂载选项用来在挂载时作为 mount 命令的参数 |
| 状态 Phase | <li>Available – 可用的 PV,尚未绑定到 PVC</li><li>Bound – 已经绑定到 PVC</li><li>Released – PVC 已经被删除,但是资源还未被集群回收</li><li>Failed – 自动回收失败</li> |
在 Kuboard 中查看存储卷声明的界面如下图所示:
| 字段名称 | 可选项/备注 |
|---|---|
| 存储类 | 只有该 StorageClass 存储类的 PV 才可以绑定到此 PVC |
| 读写模式 Access Modes | <li>可被单节点读写-ReadWriteOnce </li><li>可被多节点只读-ReadOnlyMany </li><li>可被多节点读写-ReadWriteMany</li> |
| Volume Modes | <li>block</li><li>filesystem - default</li> |
| 总量 | 请求存储空间的大小。Kuboard 支持 CephFS 类型存储卷声明的扩容。 |
在您完成存储卷声明的定义后,您可以在 Kuboard 工作复杂编辑器的 数据卷 Volume 区域引用该存储卷声明,如下图所示: