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

 

posted @ 2023-03-26 22:31  中仕  阅读(32)  评论(0编辑  收藏  举报