存储管理1:理解PV、PVC对象
一个优秀的云计算项目自然少不了存储资源的管理。在kubernetes中,为了简化用户使用持久化存储的门槛,引入了一组叫作 Persistent Volume(PV)和Persistent Volume Claim(PVC)的 API 对象。
1.1、PV对象
PV对象用于描述集群中的存储资源。它主要定义了存储服务的访问信息(或实现细节),比如一个NFS服务的共享信息。通常情况下,PV对象是由集群管理员事先创建的,以供集群用户使用。比如,运维人员可以定义一个这样的NFS类型的PV,如下所示:
1 |
|
有关PV对象更多的属性以及其它类型PV的定义方式可参考kubernetes官方文档。
1.2、PVC对象
PVC对象用于描述Pod所需要的持久化存储信息。比如,存储大小、访问权限等。PVC通常由要使用存储资源的用户创建,或者以PVC模板的形式出现在StatefulSet对象中,然后由StatefulSet控制器创建带编号的PVC。比如,开发人员可以声明一个1GB大小的PVC,如下:
1 |
|
有关PVC对象更多的属性可参考kubernetes官方文档。
1.3、Pod使用PVC
PVC资源只有在和某个符合条件的PV绑定后,才能被Pod使用。这里的条件包括:
- 它们有相同的storageClassName;
- PV能满足PVC对存储资源的要求。比如,PV的存储大小能满足PVC的需要。
一旦PVC和PV绑定后,Pod就能像使用hostPath等常规类型的Volume一样,在自己的对象文件里声明它要使用的PVC,如下:
1 |
|
可以看到,我们只需要在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/