一、认识PV、PVC
PersistentVolume(PV)是指集群管理员配置提供的某存储系统上的一段存储空间,它是对底层共享存储的抽象,将共享存储作为一种可由用户申请使用的资源,实现了"存储消费"机制。通过存储插件,PV支持使用多种网络存储或云端存储等多种后端存储系统,例如,前面使用到的NFS、还有其他的如RBD、Cinder等。PV是集群级别的资源,不属于任何的名称空间,用户对PV资源的使用需要通过PersistentVolumeClaim(PVC)提出的使用申请(或称为声明)来完成绑定,PVC是PV资源对象的消费者,它向PV申请特定大小的空间及访问模式(如读写或只读),从而创建出PVC存储卷,而后再由Pod资源通过PersistentVolumeClaim存储卷关联使用。
尽管PVC使得用户可以以抽象的方式访问存储资源,但是很多时候还是会涉及到PV的不少属性,例如,用于不同场景时设置的性能参数等。为此,集群管理员不得不通过多种方式提供多种不同的PV以满足用户不同的使用需求,两者衔接上的偏差必然会导致用户的需求无法全部及时有效的得到满足。Kubernetes自1.4版本起引入了一个新的资源对象StorageClass,可用于将存储资源定义为具有显着特性的类别(Class)而不是具体的PV,例如"fast"、“slow"或"glod”、“silver”、"bronze"等等。用户通过PVC直接向意向的类别发出申请,匹配由管理员事先创建的PV,或者由其按需为用户动态创建PV,这样做甚至免去了需要事先创建PV的过程。
二、Kubernetes的存储系统
Kubernetes挂载Volume的过程:
1)用户创建一个好汉PVC的Pod(使用动态存储卷);
2)PV Controller发现这个PVC处于待绑定状态,调用Volume-Pliugin(in-tree或out-of-tree)创建存储卷;并创建PV对象,并将创建的PV与PVC绑定;
3)Scheduler根据Pod配置、节点状态、PV配置等信息,把Pod调度到Worker节点Node上;
4)AD Controller发现Pod处于待挂载状态,调用Volume Plugin(in-tree或out-of-tree)实现设备挂载到目标节点(/dev/sdb);
5)在Worker节点上,Kubelet(Volume Manager)等待设备挂载完成,通过Volume Plugin将设备挂载至指定目录:/var/lib/kubelet/pods/f9433060-ba17-4ab5-96b3-4aacd1dc0dd6/volumes/
6)Kubelet在被告知挂载目录准备好后,启动Pod中的containers,用Docker -v方式(bind)将已经挂载到本地的卷映射到容器中;
三、创建PV
PersistentVolume Spec主要支持以下几个通用字段,用于定义PV的容量、访问模式和回收策略。
Capacity:当前PV的容量;目前,Capacity仅支持空间设定,将来应该还可以指定IOPS和throughput。
访问模式:尽管在PV层看起来并无差别,但是存储设备支持及启用的功能特性却可能不尽相同。例如NFS存储支持多客户端同时挂载及读写操作,但是也可能是在共享时仅启用了只读模式,其他存储系统也存在类似的可配置特性。因此,PV底层的设备或许存在其特有的访问模式下,用户使用时必须在其特定范围内设定其功能,具体各PV的支持访问模式如下图:
ReadWriteOnce:仅可被单个节点读写挂载;命令行中可简写为RWO。
ReadOnlyMany:可被多个节点同时只读挂载;命令行中可简写为ROX。
ReadWriteMany:可被多个节点同时读写挂载;命令行中可简写为RWX。
persistentVolumeReclaimPolicy:PV空间被释放时的处理机制;可用类型仅为Retain(默认)、Recycle或Delete,具体说明如下:
Retain:保持不动,由管理员随后手动回收