PV/PVC是什么?
PV(Persistent Volume):描述的是持久化的Volume实体概念,生命周期与Pod创建和销毁事件无关。要么运行事先准备好,要么通过动态创建。
PVC(PersistentVolumeClaim):PVC是对PV的请求,申明Pod所希望使用的持久化存储的属性,例如容量,读写权限。
Kubernete Volumes能够帮忙应用持久化数据,PV/PVC是Kubernetes Volumes存储类型的一种,其它类型还有:
本地存储:emptyDir / hostPath
网络存储:
in-tree: aws ElasticBlockStore / gcePersistentDisk / nfs
out-of-tree:csi等网络存储插件
Project Volume:secret / configmap / downwardAPI / serviceAccountToken
PV/PVC的意义
- 使用不同的控制器来管理计算与存储资源,解耦POD与Volume的生命周期,实现计算与存储分离。
- PVC只需要关注应用需要知道的配置,如存储大小、访问模式,读写模式等,而不需要知道存储的细节,实现开发与运维职责分离。开发只需要提需求,知道自己需要的存储容量,模式就够了,他并不关心存储是由什么设备提供的,资源池的够不够,而运维人员则相反,他更关心的底层的存储状态。
PV创建的两种方式:静态与动态
静态创建方式,下图为静态创建的示意图。
- 研发用户需要创建存储资源,于是创建了PVC(持久化存储卷请求),申明需要的存储资源大小以及访问模式
- 集群管理人员(运维人员)根据需求配置手动创建对应的PV(持久化存储卷)
- OpenShift/K8S会根据配置将PV/PVC进行绑定,让PVC与真实的存储资源关联。
这种方式有几个问题:
- 需要手动创建PV,增加了运维管理的复杂度。
- 如果有大量配置一样的PVC需求时,PVC与设定的PV需要单独的设置进行绑定。
动态创建方式,下图为动态创建的示意图。
- 集群管理人员(运维人员)提前部署好存储的provisioner,并创建好对应storageclass
- 研发用户需要创建存储资源,于是创建了PVC(持久化存储卷请求),申明需要的存储的provisioner以及存储大小
- provisioner监听到PVC资源的创建,自动创建PV,并与PVC进行绑定,让PVC与真实的存储资源关联。
一旦准备好动态创建存储环境,存储资源便以服务的方式提供给研发人员,实现存储资源自服务。
如何将PV与PVC绑定
在上一部分介绍了静态创建存储资源与动态创建存储资源的过程与特点,很明显动态创建存储资源使用更方便,但是在生产中,受到环境的限制,静态创建存储资源的方式仍然很常见。这时,如何准确地绑定PVC与对应的PV就是需要注意的问题了。下面列出了解决这个问题的三种方法。
第一种,在PV中添加label,在PVC中添加matchLabels进行关联
创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.2.1.2
path: "/exports/pv1"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
selector:
matchLabels:
pv: "nfs-pv1"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
# 本地盘PV
kind: PersistentVolume
apiVersion: v1
metadata:
name: test2-pv
namespace: kubeflow
labels:
pv: test2
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/test2"
第二种,PV配置中指定关联的PVC
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 1Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: openldap-volume-1
namespace: openldap
accessModes:
- ReadWriteMany
nfs:
server: 10.2.1.2
path: "/exports/pv1"
第三种,PVC中设置volumeName
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: nfs-pv1