• PersistentVolumeClaim
    • 1. PVC概述
    • 2. PVC的属性
      • 2.1. accessModes
      • 2.2. volumeMode
      • 2.3. resources
      • 2.4. selector
      • 2.5. storageClassName
    • 3. 将PVC作为Volume

    PersistentVolumeClaim

    1. PVC概述

    PersistentVolumeClaim(简称PVC)是用户存储的请求,PVC消耗PV的资源,可以请求特定的大小和访问模式,需要指定归属于某个Namespace,在同一个Namespace的Pod才可以指定对应的PVC。

    当需要不同性质的PV来满足存储需求时,可以使用StorageClass来实现。

    每个 PVC 中都包含一个 spec 规格字段和一个 status 声明状态字段。

    1. kind: PersistentVolumeClaim
    2. apiVersion: v1
    3. metadata:
    4. name: myclaim
    5. spec:
    6. accessModes:
    7. - ReadWriteOnce
    8. volumeMode: Filesystem
    9. resources:
    10. requests:
    11. storage: 8Gi
    12. storageClassName: slow
    13. selector:
    14. matchLabels:
    15. release: "stable"
    16. matchExpressions:
    17. - {key: environment, operator: In, values: [dev]}

    2. PVC的属性

    2.1. accessModes

    对应存储的访问模式,例如:ReadWriteOnce

    2.2. volumeMode

    对应存储的数据卷模式,例如:Filesystem

    2.3. resources

    声明可以请求特定数量的资源。相同的资源模型适用于Volume和PVC。

    2.4. selector

    声明label selector,只有标签与选择器匹配的卷可以绑定到声明。

    • matchLabels:volume 必须有具有该值的标签
    • matchExpressions:条件列表,通过条件表达式筛选匹配的卷。有效的运算符包括 In、NotIn、Exists 和 DoesNotExist。

    2.5. storageClassName

    通过storageClassName参数来指定使用对应名字的StorageClass,只有所请求的类与 PVC 具有相同 storageClassName 的 PV 才能绑定到 PVC。

    PVC可以不指定storageClassName,或者将该值设置为空,如果打开了准入控制插件,并且指定一个默认的 StorageClass,则PVC会使用默认的StorageClass,否则就绑定到没有StorageClass的 PV上。

    之前使用注解 volume.beta.kubernetes.io/storage-class 而不是 storageClassName 属性。这个注解仍然有效,但是在未来的 Kubernetes 版本中不会支持。

    3. 将PVC作为Volume

    将PVC作为Pod的Volume,PVC与Pod需要在同一个命名空间下,其实Pod的声明如下:

    1. kind: Pod
    2. apiVersion: v1
    3. metadata:
    4. name: mypod
    5. spec:
    6. containers:
    7. - name: myfrontend
    8. image: dockerfile/nginx
    9. volumeMounts:
    10. - mountPath: "/var/www/html"
    11. name: mypd
    12. volumes:
    13. - name: mypd
    14. persistentVolumeClaim: # 使用PVC
    15. claimName: myclaim

    PersistentVolumes 绑定是唯一的,并且由于 PersistentVolumeClaims 是命名空间对象,因此只能在一个命名空间内挂载具有“多个”模式(ROXRWX)的PVC。

    参考文章:

    • https://kubernetes.io/docs/concepts/storage/persistent-volumes/