存储管理1:理解PV、PVC对象

一个优秀的云计算项目自然少不了存储资源的管理。在kubernetes中,为了简化用户使用持久化存储的门槛,引入了一组叫作 Persistent Volume(PV)和Persistent Volume Claim(PVC)的 API 对象。

1.1、PV对象

PV对象用于描述集群中的存储资源。它主要定义了存储服务的访问信息(或实现细节),比如一个NFS服务的共享信息。通常情况下,PV对象是由集群管理员事先创建的,以供集群用户使用。比如,运维人员可以定义一个这样的NFS类型的PV,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
kind: PersistentVolume
apiVerson: v1
meatdata:
name: nfs
spec:
nfs:
server: 10.244.1.4
path: "/"
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: manual

有关PV对象更多的属性以及其它类型PV的定义方式可参考kubernetes官方文档

1.2、PVC对象

PVC对象用于描述Pod所需要的持久化存储信息。比如,存储大小、访问权限等。PVC通常由要使用存储资源的用户创建,或者以PVC模板的形式出现在StatefulSet对象中,然后由StatefulSet控制器创建带编号的PVC。比如,开发人员可以声明一个1GB大小的PVC,如下:

1
2
3
4
5
6
7
8
9
10
11
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: manual

有关PVC对象更多的属性可参考kubernetes官方文档

1.3、Pod使用PVC

PVC资源只有在和某个符合条件的PV绑定后,才能被Pod使用。这里的条件包括:

  • 它们有相同的storageClassName;
  • PV能满足PVC对存储资源的要求。比如,PV的存储大小能满足PVC的需要。

一旦PVC和PV绑定后,Pod就能像使用hostPath等常规类型的Volume一样,在自己的对象文件里声明它要使用的PVC,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
- name: nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs

可以看到,我们只需要在Pod对象的volumes字段中声明要使用的PVC的名字。当创建这个Pod时,kubelet就会把这个PVC所对应的PV,也就是一个NFS类型的Volume,挂载到Pod容器内的目录上。

1.4、PersistentVolumeController

在 Kubernetes 中,实际上存在着一个专门处理持久化存储的控制器,叫作 Volume Controller。这个 Volume Controller 维护着多个控制循环,其中有一个循环,其作用就是将PVC与某个符合条件的PV进行绑定。它的名字叫作 PersistentVolumeController。

PersistentVolumeController 会不断地查看当前每一个 PVC是不是已经处于 Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的 PV,并尝试将其与这个“单身”的 PVC 进行绑定。这样,Kubernetes 就可以保证用户提交的每一个 PVC,只要有合适的 PV 出现,它就能够很快进入绑定状态,从而结束“单身”之旅。

将一个 PV 与 PVC 进行“绑定”,其实就是将这个 PV 对象的名字,填在了 PVC 对象的 spec.volumeName 字段上。所以, Kubernetes 只要获取到这个 PVC 对象,就一定能够找到它所绑定的 PV。

1.5、小结

在Kubernetes中PVC和PV的设计,仍然符合“面向对象”的思想。其中,PVC是接口,用于描述用户所需要的存储(存储大小、读写权限等);PV是实现,用于定义存储服务的访问信息(或实现细节)。PVC和PV之间相互独立,通过PersistentVolumeContronller就能将PVC和符合条件的PV进行绑定。

1.6、参考

https://time.geekbang.org/column/intro/100015201

https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/


存储管理1:理解PV、PVC对象
https://kuberxy.github.io/2020/10/05/存储管理1:理解PV、PVC体系/
作者
Mr.x
发布于
2020年10月5日
许可协议