2.2. 卷和声明的生命周期

PV 是集群中的资源。PVC 是对这些资源的请求,也是对该资源的声明检查。PV 和 PVC 之间的交互有以下生命周期。

2.2.1. 置备存储

根据 PVC 中定义的开发人员的请求,集群管理员配置一个或者多个动态置备程序用来置备存储及一个匹配的 PV。

另外,集群管理员也可以预先创建多个 PV,它们包含了可用存储的详情。PV 存在于 API 中,且可以被使用。

2.2.2. 绑定声明

当您创建 PVC 时,您会要求特定的存储量,指定所需的访问模式,并创建一个存储类来描述和分类存储。master 中的控制循环会随时检查是否有新的 PVC,并把新的 PVC 与一个适当的 PV 进行绑定。如果没有适当的 PV,则存储类的置备程序会创建一个适当的 PV。

所有 PV 的大小可能会超过 PVC 的大小。这在手动置备 PV 时尤为如此。要最小化超额,OpenShift Container Platform 将会把 PVC 绑定到匹配所有其他标准的最小 PV。

如果匹配的卷不存在,或者相关的置备程序无法创建所需的存储,则请求将会处于未绑定的状态。当出现了匹配的卷时,相应的声明就会与其绑定。例如:在一个集群中有多个手动置备的 50Gi 卷。它们无法和一个请求 100Gi 的 PVC 相匹配。当在这个集群中添加了一个 100Gi PV 时, PVC 就可以和这个 PV 绑定。

2.2.3. 使用 pod 和声明的 PV

pod 使用声明(claim)作为卷。集群通过检查声明来找到绑定的卷,并为 pod 挂载相应的卷。对于那些支持多个访问模式的卷,您必须指定作为 pod 中的卷需要使用哪种模式。

一旦您的声明被绑定后,被绑定的 PV 就会专属于您,直到您不再需要它。您可以通过在 pod 的 volumes 定义中包括 persistentVolumeClaim 来调度 pod 并访问声明的 PV。

2.2.4. 使用中的存储对象保护

使用中的存储对象保护功能确保了被 pod 使用的活跃的 PVC 以及与其绑定的 PV 不会从系统中移除,如果删除它们可能会导致数据丢失。

使用中的存储对象保护功能被默认启用。

注意

当使用 PVC 的 Pod 对象存在时,这个 PVC 被认为是被 Pod 使用的活跃的 PVC。

如果用户删除一个被 pod 使用的活跃的 PVC,这个 PVC 不会被立刻删除。这个删除过程会延迟到 PVC 不再被 pod 使用时才进行。另外,如果集群管理员删除了绑定到 PVC 的 PV,这个 PV 不会被立即删除。这个删除过程会延迟到 PV 不再绑定到 PVC 时才进行。

2.2.5. 释放持久性卷

当不再需要使用一个卷时,您可以从 API 中删除 PVC 对象,这样相应的资源就可以被重新声明。当声明被删除后,这个卷就被认为是已被释放,但它还不可以被另一个声明使用。这是因为之前声明者的数据仍然还保留在卷中,这些数据必须根据相关政策进行处理。

2.2.6. 持久性卷的重新声明策略

持久性卷重新声明(reclaim)策略指定了在卷被释放后集群可以如何使用它。卷重新声明政策包括 RetainRecycleDelete

  • Retain 策略可为那些支持它的卷插件手动重新声明资源。
  • Recycle 策略在从其请求中释放后,将卷重新放入到未绑定的持久性卷池中。
重要

在 OpenShift Container Platform 4 中, Recycle 重新声明策略已被弃用。我们推荐使用动态置备功能。

  • Delete 策略删除 OpenShift Container Platform 以及外部基础架构(如 AWS EBS 或者 VMware vSphere)中相关的存储资源中的 PersistentVolume
注意

动态置备的卷总是被删除。

2.2.7. 手动重新声明持久性卷

删除持久性卷生命(PVC)后,持久性卷(PV)仍然存在,并被视为"released(释放)"。但是,由于之前声明的数据保留在卷中,所以无法再使用 PV。

流程

要以集群管理员的身份手动重新声明 PV:

  1. 删除 PV:

    $ oc delete <pv-name>

    外部基础架构(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中的关联的存储资产在 PV 被删除后仍然存在。

  2. 清理相关存储资产中的数据。
  3. 删除关联的存储资产。另外,若要重复使用同一存储资产,请使用存储资产定义创建新 PV。

重新声明的 PV 现在可供另一个 PVC 使用。

2.2.8. 更改持久性卷的重新声明策略

更改持久性卷的重新声明策略:

  1. 列出集群中的持久性卷:

    $ oc get pv

    输出示例

    NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM             STORAGECLASS     REASON    AGE
     pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Delete          Bound     default/claim1    manual                     10s
     pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Delete          Bound     default/claim2    manual                     6s
     pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Delete          Bound     default/claim3    manual                     3s

  2. 选择一个持久性卷并更改其重新声明策略:

    $ oc patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. 验证您选择的持久性卷是否具有正确的策略:

    $ oc get pv

    输出示例

    NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM             STORAGECLASS     REASON    AGE
     pvc-b6efd8da-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Delete          Bound     default/claim1    manual                     10s
     pvc-b95650f8-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Delete          Bound     default/claim2    manual                     6s
     pvc-bb3ca71d-b7b5-11e6-9d58-0ed433a7dd94   4Gi        RWO           Retain          Bound     default/claim3    manual                     3s

    在前面的输出中,绑定到声明 default/claim3 的卷现在具有 Retain 重新声明策略。当用户删除声明 default/claim3 时,这个卷不会被自动删除。