运维开发网

PVC(PersistentVolumeClaim)

运维开发网 https://www.qedev.com 2021-02-26 13:21 出处:51CTO 作者:hellojinni
PVC 作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。

PVC(PersistentVolumeClaim)

PVC 作为用户对存储资源的需求申请,主要包括存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

  name: myclaim

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 8Gi

  storageClassName: slow

  selector:

    matchLabels:

      release: "stable"

    matchExpressions:

      - {key: environment, operator: In, values: [dev]}

PVC的关键配置参数说明如下:

  • 资源请求(Resources):描述对存储资源的请求,目前仅支持request.storage的设置,即存储空间大小。

  • 访问模式(Access Modes):PVC也可以设置访问模式,用于描述用户应用对存储资源的访问权限。三种访问模式的设置与PV的设置相同。

  • 存储卷模式(Volume Modes):PVC也可以设置存储卷模式,用于描述希望使用的PV存储卷模式,包括文件系统和块设备。

  • PV选择条件(Selector):通过对Label Selector的设置,可使PVC对于系统中已存在的各种PV进行筛选。系统将根据标签选出合适的PV与该PVC进行绑定。选择条件可以使用 matchLabels(匹配标签) 和 matchExpressions(匹配表达式)进行设置,如果两个字段都设置了,则Selector的逻辑将是两组条件同时满足才能完成匹配。

  • 存储类别(Class):PVC在定义时可以设定需要的后端存储的类别(通过storageClassName字段指定),以减少对后端存储特性的详细信息的依赖。只有设置了该Class的PV才能被系统选出,并与该PVC进行绑定。

PVC也可以不设置Class需求。如果 storageClassName 字段的是被设置为空(storageClassName=""),则表示该PVC不要求特定的Class,系统将只选择未设定Class的PV与之匹配和绑定。PVC也可以完全不设置storageClassName字段,此时将根据系统是否启动了名为 DefaultStorageClass 的admission controller进行相应的操作。

  • 未启用 DefaultStorageClass :等效于PVC设置 storageClassName 的值为空(storageClassName=""),即只能选择未设定Class的PV与之匹配和绑定。

  • 启动 DefaultStorageClass :要求集群管理员已定义默认的 StorageClass 。如果在系统中不存在默认的StorageClass,则等效于不启用DefaultStorageClass的情况。如果存在默认的StorageClass,则系统将自动为PVC创建一个PV(使用默认 StorageClass 的后端存储),并将它们进行绑定。

注意:pvc和pv都受限于Namespace,pvc在选择pv时受到Namespace的限制,只有相同namespace中的pv才可能与pvc绑定。pod在引用pvc时同样受namespace的限制,只有相同namespace中的pvc才能挂载到pod内。

当selector和class都行了设置时,系统将选择两个条件同时满足的pv与之匹配。

如果资源供应使用的是动态模式,即管理员没有预先定义PV,仅通过StorageClass交给系统自动完成PV的动态创建,那么PVC在设定Selector时,系统将无法为其供应任何存储资源。

在启用动态供应模式的情况下,一旦用户删除了PVC,与之绑定的PV也将根据其默认的回收策略“Delete”被删除。如果需要保留PV(用户数据),则在动态绑定成功后,用户需要将系统自动生成PV的回收策略从“Delete”改为“Retain”(保留)。

Pod使用PVC的存储资源

apiVersion: v1

kind: Pod

metadata:

  name: test

spec:

  containers:

  - name: test

    image: busybox

    command:

    - sleep

    - "3600"

    volumeMounts:

    - name: gluster-volume

      mountPath: "/pv-data"

      readOnly: false

  volumes:

  - name: gluster-volume

    persistentVolumeClaim:

      claimName: pvc-gluster-heketi

一般删除步骤为:先删pod再删pvc最后删pv

但是遇到pv始终处于“Terminating”状态,而且delete不掉,可以使用一下命令删除

kubectl patch pvc yw-localnas-upload-sci-pvc  -p  '{"metadata":{"finalizers":null}}' -n smalltools

查看哪些 pod 正在使用 pvc

kubectl get pods --all-namespaces -o=json | jq -c '.items[] | {name: .metadata.name, namespace: .metadata.namespace, claimName:.spec.volumes[] | select( has ("persistentVolumeClaim") ).persistentVolumeClaim.claimName }'

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号