Kubernetes基础知识学习-PV和PVC
1、概念
Kubernetes 中的持久卷(Persistent Volume),是集群中的一块存储,可以由管理员事先制备,或者使用存储类(Storage Class)来动态制备。持久卷是集群资源,就像节点也是集群资源一眼g.PV持久卷和普通的Volume一样,也是使用卷插件来实现的,只是他们拥有独立于任何使用PV的Pod的生命周期。此API对象中记述了存储的实现细节,无论背后是NFS、ISCSI还是特定于云平台的存储系统。
持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上于Pod类似。Pod会耗尽节点的资源,而PVC申领会耗用PV资源。Pod可以请求特定梳理的资源(CPU和内存);同样PVC申领也可以请求特定的大小和访问模式(例如,可以要求PV卷能够ReadWriteOnce、ReadOnlyMany或ReadWriteMang模式之一来挂载)。
尽管PersistentVolumeClaim允许用户消耗抽象的存储资源,常见的情况是针对不同的问题用户需求的是具有不同熟悉的PersistentVolume卷。集群管理员需要能够提供不同性质的PersistentVolume,并且这些Pv卷之间的差别不仅限于卷大小和访问模式,同事又不能将卷是如何实现的这些细节保留给用户,为了满足这些需求,就有了存储类(StorageClass)资源。
卷和申领的生命周期
PV卷是集群中的资源。PVC申领是对这些资源的请求,也被用来执行资源的申领检查。PV卷和PVC申领之间的互动遵循如下生命周期:
制备:
PV卷的制备有两种方式:静态制备或动态制备。
静态制备:
集群管理员创建若干PV卷。这些卷对象带有真实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在与kubernetesAPI中,可供用户消费(使用)。
动态制备:
如果管理员所创建的所有静态PV卷都无法与用户的PersistentVolumeClaim匹配,集群可以尝试为该PVC申领动态制备一个存储。这一制备操作是基于StorageClass来实现的:PVC申领必须请求某个存储类,同时集群管理员必须已经创建并配置了该类,这样动态制备卷的动作才发生,如果PVC申领指定存储类为"",则相当于为自身禁止使用动态制备的卷。
为了基于存储类完成动态的存储制备,集群管理员需要在API服务器上启用DefaultStorageClass准入空哦之气,距离而言,可以通过保证DefaultStorageClass出现在API服务器组件的--enable-admission-plugins标志值中实现这点;该标志的值可以是逗号分割的有序列表。
绑定
用户穿件一个带有特定存储容量和特定访问模式需求的PersistentVolumeClaim对象;在动态制备场景下,这个PVC对象可能已经创建完毕。主控制节点中的控制回路检测新的PVC对象,寻找与之匹配PV卷(如果可能的化),并将二者绑定到一起。如果为了新的PVC申领动态制备的PV卷,则控制回路总是将改PC绑定到这一PVC申领。否则,用户总是能够获得他们所需求的资源,只是所获取的PV卷可能会超出所请求的配置。一旦绑定关系建立,则PersistentVOlumeClaim绑定就是排他性的,无论改PVC申领是如何与PV卷建立的绑定关系。PVC申领与PV卷之间的绑定是一种对一的一社,实现上使用ClainREf来记述PV卷与PVC申领间的双向绑定关系。
如果找不到匹配的PV卷,PVC申领会无限期的处于未绑定状态。当与之匹配的PV卷可用时,PVC申领会被绑定。例如,及时谋集群上制备了很多50GID爱笑的PV卷,也无法与请求100GID爱笑的存储的PVC匹配,当新的100GiPV卷被加入到进群时候,该PVC才有可能被绑定。
使用
Pod将PVC申领当作存储卷来使用,集群会监视PVC申领,找到绑定的卷,并为Pod挂载该卷。对于支持多种访问模式的卷,用户要在Pod中以卷的模式使用申领时指定期望访问模式。
一旦用户有了申领对象并该申领已经被绑定,则绑定的PV卷在用户任然需要它一直属于该用户。用户通过在Pod的volumes快中包含persistentVolumeClaim节区来调度Pod,访问所申领的PV卷。
2、参数说明
apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /tmp server: 172.17.0.2
2.1 persistentVolumeReclaimPolicy:
Recycle 如果配置Recycle,PVC删除,则PV内的数据也清空
Retain 保留
Delete: PVC------>PV,删除PVC后PV也会被删除,这一类的PV,需要支持删除功能,动态存储默认方式。
2.2 Capacity PV的容量
2.3 volumeMode 挂载的类型
2.4 accessModes 访问模式
ReadWriteOnce RWO可以被单节点读写形式挂载
ReadWriteMany RWX可以被多个节点读写形式挂载
ReadOnlyMany ROX可以被多个节点以只读的形式挂载
2.5 stroageClassName
每个 PV 可以属于某个类(Class),通过将其 storageClassName 属性设置为某个 StorageClass 的名称来指定。 特定类的 PV 卷只能绑定到请求该类存储卷的 PVC 申领。 未设置 storageClassName 的 PV 卷没有类设定,只能绑定到那些没有指定特定存储类的 PVC 申领。
早前,Kubernetes 使用注解 volume.beta.kubernetes.io/storage-class 而不是 storageClassName 属性。这一注解目前仍然起作用,不过在将来的 Kubernetes 发布版本中该注解会被彻底废弃
3、创建PV
apiVersion: v1 kind: PersistentVolume metadata: name: pv001 spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /data/nfs/rw server: 192.168.43.5
查看创建的PV
[root@master01 pvtest]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 5Gi RWO Recycle Available slow 3h18m
Avaiable: 没有被PVC绑定,Bond:已经被PVC绑定;Released:PVC被删除,但是资源为被重新使用,资源未被集群回收;Failed:自动回收失败;
4、创建PVC (PersistentVolumeClaim)
你作为集群管理员创建由物理存储支持的 PersistentVolume。你不会将该卷与任何 Pod 关联。
你现在以开发人员或者集群用户的角色创建一个 PersistentVolumeClaim, 它将自动绑定到合适的 PersistentVolume。
你创建一个使用以上 PersistentVolumeClaim 作为存储的 Pod
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 1Gi storageClassName: slow
查看创建的pvc
[root@master01 pvtest]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myclaim Bound pv002 2Gi RWO nfs-slow 5s
已经和pv绑定上了,查看pv的状态:
[root@master01 pvtest]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv002 2Gi RWO Recycle Bound default/myclaim nfs-slow 2m19s
接下来我们创建个pod开调用pvc
apiVersion: v1 kind: Pod metadata: name: podtopv namespace: default labels: app: myapp spec: volumes: - name: pod-volume-test persistentVolumeClaim: claimName: myclaim containers: - name: myapp image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: /tmp/pvc name: pod-volume-test
示例二:
首先创建一个PV
apiVersion: v1 kind: PersistentVolume metadata: name: pvc007 labels: type: local spec: storageClassName: number capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/root/data"
创建一个PVC
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-test spec: storageClassName: number accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
创建一个Pod
apiVersion: v1 kind: Pod metadata: name: pvpvcpod namespace: default labels: app: pvpvc spec: containers: - name: test-pv-pvc image: nginx ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: task-pv-storage volumes: - name: task-pv-storage persistentVolumeClaim: claimName: pvc-test