> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/devops/kubernetes/ji-chu-zhi-shi/kubernetes-cun-chu/persistentvolume-pv.md).

# PersistentVolume（PV）

<mark style="color:blue;">**持久卷（PersistentVolume，PV）是集群中的一块存储，可以由管理员事先制备， 或者使用存储类（Storage Class）来动态制备**</mark>。

* **PV 持久卷是集群资源**，就像节点也是集群资源一样。
* **PV 持久卷拥有独立于任何使用 PV 的 Pod 的生命周期，**&#x7BA1;理员可以单独对PV进行增删改查，不受Pod的影响。
* 和单独配置Volume类似，PV也可以使用NFS、GFS、CEPH等常用的存储后端，并且可以提供更加高级的配置，比如访问模式、空间大小以及回收策略等。

<mark style="color:blue;">**持久卷申领（PersistentVolumeClaim，PVC） 表达的是用户对存储的请求**</mark>。概念上与 Pod 类似：&#x20;

* Pod 会耗用节点资源，而 PVC 申领会耗用 PV 资源
* Pod 可以请求特定数量的资源（CPU 和内存）；同样 PVC 申领也可以请求特定的大小和访问模式 （例如，可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载）

## PV回收策略

<mark style="color:blue;">**当用户使用完Volume时，可以从API中删除PVC对象，从而允许回收资源。回收策略会告诉PV如何处理该Volume。**</mark>目前回收策略可以设置为**Retain**、**Recycle**和**Delete**：

### **保留（Retain）**

<mark style="color:blue;">**回收策略 Retain 使得用户可以手动回收资源：**</mark>

* 当 PersistentVolumeClaim 对象被删除时，PersistentVolume 卷仍然存在，对应的数据卷被视为"已释放（released）"。&#x20;
* 由于卷上仍然存在这前一申领人的数据，该卷还不能用于其他申领。

**管理员可以通过下面的步骤来手动回收该卷：**

1. **删除 PersistentVolume 对象**。与之相关的、位于外部基础设施中的存储资产 （例如 AWS EBS 或 GCE PD 卷）在 PV 删除之后仍然存在。
2. **根据情况，手动清除所关联的存储资产上的数据**。
3. **手动删除所关联的存储资产。**

如果你希望重用该存储资产，可以基于存储资产的定义创建新的 PersistentVolume 卷对象。

### **删除（Delete）**

<mark style="color:blue;">**对于支持 Delete 回收策略的卷插件，删除动作会将 PersistentVolume 对象从 Kubernetes 中移除，同时也会从外部基础设施（如 AWS EBS 或 GCE PD 卷）中移除所关联的存储资产**</mark>。&#x20;

<mark style="color:orange;">**动态制备的卷会继承其 StorageClass 中设置的回收策略， 该策略默认为 Delete**</mark>。

### **回收（Recycle）**

<mark style="color:red;">**回收策略 Recycle 已被废弃，取而代之的建议方案是使用动态制备。**</mark>

## PV访问策略

目前支持的访问策略如下：

* <mark style="color:blue;">**ReadWriteOnce**</mark>：可以被**单节点**以**读写**模式挂载，命令行中可以被缩写为RWO。
* <mark style="color:blue;">**ReadOnlyMany**</mark>：可以被**多个节点**以**只读**模式挂载，命令行中可以被缩写为ROX。
* <mark style="color:blue;">**ReadWriteMany**</mark>：可以被**多个节点**以**读写**模式挂载，命令行中可以被缩写为RWX。
* <mark style="color:blue;">**ReadWriteOncePod**</mark>：只能被**一个Pod**以**读写**的模式挂载，命令中可以被缩写为RWOP。

**虽然PV在创建时可以指定不同的访问策略，但是也要后端的存储支持才行**。比如一般情况下大部分块存储是不支持ReadWriteMany的。

## PV的状态

在创建PV后，可以通过<mark style="color:blue;">**kubectl get pv**</mark>查看已经创建的PV的状态：

{% code overflow="wrap" lineNumbers="true" %}

```properties
$ kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS    REASON   AGE
hostpath-pv   5Gi        RWO            Delete           Available           slow-hostpath            4s
```

{% endcode %}

字段STATUS表示当前PV的状态，会有以下几种状态：

* <mark style="color:blue;">**Available**</mark>：可用，没有被PVC绑定的空闲资源。
* <mark style="color:blue;">**Bound**</mark>：已绑定，已经被PVC绑定。
* <mark style="color:blue;">**Released**</mark>：已释放，PVC被删除，但是资源还未被重新使用。
* <mark style="color:blue;">**Failed**</mark>：失败，自动回收失败。
