K8s系列之:Persistent Volume
Volume是定义在Pod上的,属于计算资源的一部分,实际上,网络存储是相对独立于计算资源存在的一种实体资源。比如在使用虚拟机的情况下,通常会先定义一个网络存储,然后从中划出一个网盘并挂接到虚拟机上。
Persistent Volume(PV)和与之相关联的Persistent Volume Claim(PVC)起到了类似的作用。
PV可以理解成K8s集群中的某个网络存储中对应的一块存储,与Volume很类似,但有以下区别:
- PV只能是网络存储,不属于任何Node,但可以在每个Node上访问
- PV并不是定义在Pod上的,而是独立于Pod之外定义
- PV目前支持的类型包括:gcePersistentDisk、awsElasticBlockStore、AzureFile、AzureDisk、FC(Fibre Channel)、Flocker、NFS、iSCSI、RBD(Rados Block Device)、CephFS、Cinder、GlusterFS、VsphereVolume、
示例:给出NFS类型PV的一个yaml定义文件,声明了需要5Gi的存储空间
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
path: /somepath
server: 172.17.0.2
比较重要的是PV的accessModes属性,目前有以下类型:
- ReadWriteOnce:读写权限,并且只能被单个Node挂载
- ReadOnlyMany:只读权限,允许被多个Node挂载
- ReadWriteMany:读写权限,允许被多个Node挂载
某个Pod想申请某种类型的PV,则首先需要定义一个PersistentVolumeClaim(PVC)对象:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
然后在Pod的Volume定义中引用上述PVC即可:
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
PV是有状态的对象,有以下几种状态:
- Available:空闲状态
- Bound:已经绑定到某个PVC上
- Released:对应的PVC已经删除,但资源还没有被集群收回
- Failed:PV自动回收失败