工作原理

持久卷(PersistantVolume,简称 PV)是 Kubernetes 集群中一部分的存储,而持久卷声明(PersistantVolumeClaim,简称 PVC)是存储的请求。

在 Kubernetes 中有两种使用持久存储的方法:

  • 使用现有的持久卷
  • 配置新的动态存储持久卷

要使用现有的 PV,您的应用程序需要使用已经绑定到 PV 的 PVC,并且 PV 应该包含 PVC 所需的最少资源(容量)。例如,Kubernetes 集群已经绑定了一个 PV,它向 PV 发出了存储请求,需要存储的数据大小为 5GB,如果 PV 的剩余空间大于 5GB,就可以使用该 PV 存储数据;如果 PV 的剩余空间小于 5GB,PVC 所需的资源超过了 PV 能提供的资源,则用户需要配置新的动态存储持久卷。

对于动态存储的配置,您的应用程序需要使用已经绑定到存储类的 PVC,并且存储类应该包含创建新的持久卷的权限。

Setting Up New and Existing Persistent Storage

了解更多信息, 请参阅 Kubernetes 存储的官方文档

持久卷声明简介

持久卷声明(PVC)是向集群请求存储资源的对象。它们类似于您的部署应用可以兑换存储访问的凭证。PVC 作为卷挂载在工作负载中,以便工作负载可以声明其指定的持久化存储份额。

要访问持久化存储,容器必须具有作为卷挂载的 PVC。该 PVC 可让您将部署在 Pod 内的应用数据存储在 Pod 外,如果 Pod 发生故障,您可以启用新的 Pod ,访问外部存储的应用数据,避免应用中断。

Rancher 内每个项目都包含您创建的 PVC 列表,可从导航栏单击资源展开下拉菜单,单击工作负载 > 卷,查看已创建的 PVC(在早于 v2.3.0 的版本,PVC 位于页签中)。已经创建的 PVC 可以重复使用。

新的和现有的持久化存储都需要 PVC

PVC 是 Pod 使用持久化存储的前提条件,无论是使用已有的存储还是配置新存储,都需要挂载 PVC。

如果要为工作负载设置现有存储,则该工作负载会挂载一个 PVC,该 PVC 指向现有 PV,与现有存储基础结构相对应。

如果要为作负载配置新的存储,则该工作负载将挂载 PVC,该 PVC 指的是存储类(StorageClass),该类具有创建 PV 及其基础存储基础结构的能力。

Rancher 允许您在项目中创建任意数量的 PVC。您可以在创建工作负载时将 PVC 挂载到工作负载中,也可以稍后在工作负载运行后将其挂载到工作负载中。

使用 PVC 和 PV 设置已存在的存储

您的 Pod 可以将数据存储在中,但是如果 Pod 发生故障,该数据会丢失。为了解决此问题,Kubernetes 提供了持久卷(PV),PV 是与 Pod 可以访问的外部存储磁盘或文件系统相对应的 Kubernetes 资源,Pod 将应用数据存储在 Pod 外。如果正在运行 Pod 崩溃了,则用户可以使用新的 Pod 访问持久化存储中的数据,把 Pod 崩溃的影响降到最低。

PV 可以是您在内部托管的本地物理磁盘或文件系统,也可以是云供应商托管的存储资源,例如 Amazon EBS 或 Azure Disk。

在 Rancher 中,创建 PV 和创建存储卷是两个独立的过程,创建 PV 并不会创建存储卷,它只会创建一个 Kubernetes 资源,映射到现有的卷。因此,必须先配置存储,然后再创建 PV

重要: PV 是在集群级别创建的,一个集群中可能存在多个项目和命名空间,在多租户集群中,多个用户可以访问同一个 PV。

将 PV 绑定到 PVC

设置 Pod 的持久化存储时,会挂载一个持久性卷声明(PVC),该声明与其他 Kubernetes 卷的挂载方式相同。当创建 PVC 时,Kubernetes Master 将其视为存储请求,并将其绑定到与 PVC 的最低资源(容量)要求匹配的 PV。并非所有 PVC 都能保证绑定到 PV。根据Kubernetes 的文档

如果不存在匹配的卷,则声明将一直保持未绑定的状态。声明变成已绑定状态仅当存在匹配的卷。比如,集群里有很多 50Gi 的 PV,但是无法匹配 100Gi 的声明。当将 100Gi 的 PV 加入集群后,声明将得到绑定。

您可以创建无限量的 PVC,但是只有当 Kubernetes 找到至少匹配其所需的磁盘空间量的 PV 时,它们才会绑定到 PV。

为了动态地提供新的存储,挂载在容器中的 PVC 必须与存储类相对应,而不是与 PV 相对应。

使用 PVC 和存储类型设置新存储

存储类让您可以动态创建 PV,而不必先在基础设施中创建持久化存储。

例如,如果工作负载绑定到 PVC,并且 PVC 引用 Amazon EBS 的存储类,则该存储类可以动态创建 EBS 卷和相应的 PV。

然后 Kubernetes Master 将新创建的 PV 绑定到工作负载的 PVC,从而使您的工作负载可以使用持久化存储。