kubernetes PVC 详解

122 阅读4分钟

概述

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]}

属性解析:

  • 申请8GiB存储空间
  • 访问模式 ReadWriteOnce
  • PV选择条件为包含标签 “release: "stable"”,并且包含条件为“environment In [dev]”标签
  • 存储类别为“slow”

PVC相关配置

  • 资源请求:描述对存储资源的请求,目前只支持requests.storage的设置, 存储空间设置。
  • 访问模式:用于描述用户应用对存储资源的访问权限。与PV设置相同。
  • 存储卷模式:包括文件系统和块设备
  • PV选择条件:通过Label Selector设置,可以使用PVC对于系统中已经存在的PV做筛选,可使用matchLabelsmatchExpressions进行设置,如果两个都设置,取交集。
  • 存储类别:PVC在定义时可以设定需要的后端存储的类别,storageClassName字段定义。只有设置了classPV 才能被系统选出并绑定。
    • 未启用:等效于PVC设置storageClassName的值为空,只能选择未设定classPV与之配合绑定
    • 启用:要求集群管理员已定义默认的StorageClass,如果系统中不存在默认的,则等效于不启用。

注意:PVC 受限于NamespacePod在引用PVC时同样受Namespace的限制,只有相同Namespace中的PVC才能挂载到Pod内。

SelectorClass都进行了设置,那么系统将选择两个条件同时满足的PV与之匹配。

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

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

结语

Kubernetes Persistent Volume Claim (PVC) 是 Kubernetes 对象模型中的一个核心概念,它在管理应用的存储资源方面发挥着关键作用。下面是对 PVC 的意义和功能的总结:

  1. 存储抽象化PVC 实现了存储资源的抽象化,允许用户以声明式的方式请求存储,而无需关注底层存储的具体实现(如云存储、本地磁盘等)。这种方式提高了应用部署的可移植性和灵活性。
  2. 动态供给Kubernetes 支持基于 PVC 的动态存储分配。当用户创建一个 PVC 时,如果配置得当,Kubernetes 存储插件会自动匹配合适的 Persistent Volume(PV)或在云提供商处创建新的存储资源来满足需求。这样,开发者无需预先手动配置存储卷。
  3. 资源申请与绑定PVC 代表了用户对存储资源的需求说明,包括存储大小、访问模式(读写、只读)等。Kubernetes 会负责将 PVC 与合适的 PV 绑定,确保应用能够获得符合需求的存储资源。
  4. 生命周期管理PVC 的生命周期与 Pod 分离,这意味着即使 Pod 被重启或重新调度,与之关联的 PVC 仍然存在,数据得以保留。这为有状态应用提供了持久化的数据存储解决方案。
  5. 资源复用与扩容PVC 允许在多个 Pod 之间共享存储资源(通过 ReadWriteMany 访问模式),并可以在不中断服务的情况下进行存储资源的扩容操作,提高了资源利用率和系统的弹性。
  6. 简化存储管理:对于运维团队而言,通过 PVC 管理存储资源可以极大地简化流程,自动化存储分配、绑定和回收过程,降低了人为错误,提升了运维效率。

总之,Kubernetes Persistent Volume Claim 是实现应用存储资源自动化管理、提高存储灵活性和应用可移植性的重要机制。它作为 Kubernetes 存储架构的关键组件,使得在容器化环境中管理和使用存储变得更加高效和便捷。