PVC-持久卷声明
Last updated
Was this helpful?
Last updated
Was this helpful?
PVC的出现,可以使得创建Pod时,不用再去管底层的存储类型,只需要声明该Pod需要的存储空间大小即可,即将Pod与底层存储技术解耦。
PVC(持久卷声明)和PV(持久卷)是成对出现的,PV与底层存储技术密切相关。Pod通过挂载PVC资源,令PVC申请满足条件的PV作为Pod的存储卷。
Tips: 若使用StorageClass自动创建PV的话,则无需显示的创建PV了。
PV资源不属于任何一个命名空间,它是集群层面的资源。
PVC和PV使用时如下:
Pod使用PVC申请PV,总共需要以下两步:
集群管理员根据底层存储技术,创建PV资源;
集群使用者/管理员,根据所需存储卷的读写权限、大小等创建PVC资源;
集群使用者在Pod中挂载PVC资源,间接挂载PV卷;
PV与底层的存储技术是息息相关的,因此在创建PV资源时,需要在spec
中确定底层的存储技术。
PV资源不属于任何一个命名空间,是集群层面的资源。
在spec.accessModes
中可以指定PV卷的访问模式,共有以下三种:
ReadWriteOnce(RWO):PV能以read-write模式挂载到单个Node;
ReadWriteMany(RWX):PV能以read-write模式挂载到多个Node;
ReadOnlyMany(ROX):PV能以read-only模式挂载到多个Node;
在spec.persistentVolumeReclaimPolicy
中可以指定PV卷被PVC资源释放时的回收操作,即当PVC释放PV时,该PV卷的操作:
Retain:删除PVC时,PV和底层数据都不会被删除,需要管理员手工回收;当删除PVC后,PV仅呈现为Released状态,尝试使用PVC重新绑定也不行,需要重新部署PV才行,且数据不会被清除;(因为PV中可能包含前一个Pod留下的数据,为了安全,所以暂时不能被使用)
Recycle:删除PVC时,PV不会被删除,但底层数据被删除,效果相当于执行rm -rf /thevolume/*;k8s会启动一个容器负责清除数据的操作。通过这种方式,PV可以被不同的PVC绑定,和不同的Pod反复使用。
Delete:删除PVC时,PV被删除,但底层数据不被删除;
PVC资源需要先创建,然后才能被挂载至Pod中。
在创建PVC时,需要指定申请的PV卷的容量大小、访问模式等,相当于筛选条件,进而从StorageClass中申请PV资源。
下面介绍一个创建PVC资源的例子,
在Pod中挂载PVC,同样需要两步:
定义卷:此处定义的是PVC资源,即在spec.volumes.persistentVolumeClaim
中指定claimName
为预先创建好的PVC资源的名字,即与PVC相关联;
挂载卷:在Pod的spec.container.volumeMounts
中指定挂载点和挂载卷名;
下面举一个例子,创建一个名为mongodb
的Pod,其在内部的名为mongodb
的容器的/data/db
下挂载一个名为mongodb-data
的PVC卷,该卷与名为mongodb-pvc
的PVC资源关联:
例如,在下面这个例子中,创建一个名为mypv1
的nfs类型的PV,其存储容量为1Gi
,其访问模式有被单个Node挂载为读写模式
和被多个Node挂载为只读模式
两种,并且该PV的回收模式为Recycle
,其所属的StorageClass为nfs
(是被用来动态创建PV的):