持久卷声明

在项目中创建应用负载时,您可以为应用负载创建持久卷声明(PVC)。PVC 可用于创建存储请求,从而进一步为应用提供持久化存储。更具体地说,持久卷(PV)资源可用于管理持久化存储。

集群管理员需要用存储类型 (Storage Class) 配置持久卷。也就是说,要在项目中创建 PVC,您的集群中必须要有可用的存储类型。如果在安装 KubeSphere 时没有配置自定义存储类型,集群中将默认安装 OpenEBS 以提供本地持久化存储。然而,OpenEBS 不支持动态为 PVC 动态供应持久卷。在生产环境中,建议您提前配置存储类型从而为应用提供持久化存储服务。

本教程介绍如何创建 PVC、挂载 PVC 和使用 PVC。

准备工作

  • 您需要创建一个企业空间、一个项目和一个用户(例如 project-regular)。该用户必须已邀请至该项目,并具有 operator 角色。有关更多信息,请参阅创建企业空间、项目、用户和角色

  • 如需使用动态卷供应,您需要配置一个支持动态供应的存储类

创建持久性声明

KubeSphere 将 PVC 绑定到满足您设定的请求条件(例如容量和访问模式)的 PV。在创建应用负载时,您可以选择所需的 PVC 并将其挂载到负载。

  1. project-regular 身份登录 KubeSphere Web 控制台并进入项目,在左侧导航栏中点击存储下的持久卷声明。页面上显示所有已挂载至项目工作负载的持久卷声明。

  2. 持久卷声明页面,点击创建以创建持久卷声明。

  3. 在弹出的对话框设置持久卷声明的名称(例如 demo-volume),选择项目,然后点击下一步

    备注

    您可以在对话框右上角启用编辑 YAML 来查看持久卷声明的 YAML 清单文件,并通过直接编辑清单文件来创建持久卷声明。您也可继续执行后续步骤在控制台上创建持久卷声明。

  4. 存储设置页面,选择创建持久卷声明的方式。

    • 通过存储类创建:您可以在 KubeSphere 安装前安装后配置存储类。

    • 通过卷快照创建:如需通过快照创建持久卷声明,您必须先创建卷快照。

    选择通过存储类创建。有关通过卷快照创建持久卷声明的更多信息,请参阅卷快照

  5. 从下拉列表中选择存储类。本教程以青云QingCloud 平台提供的 csi-standard 标准存储类为例。您可以根据需要选择其他存储类。

  6. 选择所需的访问模式。由于一些 PV 只支持特定的访问模式,页面上显示的访问模式会因您选择的存储类而不同。访问模式一共有三种:

    • ReadWriteOnce:持久卷声明以单节点读写的形式挂载。
    • ReadOnlyMany:持久卷声明以多节点只读的形式挂载。
    • ReadWriteMany:持久卷声明以多节点读写的形式挂载。
  7. 卷容量区域,设置持久卷声明的大小,然后点击下一步

  8. 高级设置页面,您可以为持久卷声明添加元数据,例如标签注解。元数据可用作搜索和调度资源的标识符。

  9. 点击创建。新建的持久卷声明会显示在项目的持久卷声明页面。持久卷声明挂载至工作负载后,挂载状态列会显示为已挂载

    备注

    • 新建的持久卷声明也会显示在集群管理中的持久卷声明页面。集群管理员需要查看和跟踪项目中创建的持久卷声明。另一方面,集群管理员在集群管理中为项目创建的持久卷声明也会显示在项目的持久卷声明页面。

    • 一些持久卷声明是动态供应的持久卷声明,它们的状态会在创建后立刻从等待中变为已绑定。其他仍处于等待中的持久卷声明会在挂载至工作负载后变为已绑定。持久卷声明是否支持动态供应取决于其存储类。例如,如果您使用默认的存储类型 (OpenEBS) 安装 KubeSphere,您只能创建不支持动态供应的本地持久卷声明。这类持久卷声明的绑定模式由 YAML 文件中的 VolumeBindingMode: WaitForFirstConsumer 字段指定。

    • 一些持久卷声明是动态供应的持久卷声明,它们的状态会在创建后立刻从等待中变为已绑定。其他仍处于等待中的持久卷声明会在挂载至工作负载后变为已绑定。持久卷声明是否支持动态供应取决于其存储类。例如,如果您使用默认的存储类型 (OpenEBS) 安装 KubeSphere,您只能创建不支持动态供应的本地持久卷声明。这类持久卷声明的绑定模式由 YAML 文件中的 VolumeBindingMode: WaitForFirstConsumer 字段指定。

挂载持久卷

创建部署有状态副本集守护进程集等应用负载时,您可以为它们挂载持久卷声明。

备注

关于如何创建应用负载,请参阅应用负载中的相关指南。

存储页面,您可以为工作负载挂载不同的持久卷声明。

  • 添加持久卷声明模板(仅对有状态副本集可用):持久卷声明模板用于动态创建 PVC。您需要设置 PVC 名称前缀、存储类、访问模式、卷容量和挂载路径(以上参数都由 volumeClaimTemplates 字段指定),以便将对应 StorageClass 的 PVC 挂载至容器组。

  • 挂载卷:支持 emptyDir 卷和 PVC。

    挂载卷页面支持以下三种模式:

    • 持久卷:使用 PVC 挂载。

      持久卷可用于保存用户的持久数据。您需要提前创建持久卷声明(PVC),持久卷声明创建后会显示在列表中供选择。

    • 临时卷:用 emptyDir 卷挂载。

      临时卷即 emptyDir 卷,它在容器组分配到节点时创建,并且只要容器组在节点上运行就会一直存在。emptyDir 卷提供了一个空目录,可由容器组中的容器读写。取决于您的部署环境,emptyDir 卷可以存放在节点所使用的任何介质上,例如机械硬盘或 SSD。当容器组由于某些原因从节点上移除时,emptyDir 卷中的数据也会被永久删除。

    • HostPath 卷:用 hostPath 卷挂载。

      hostPath 卷将主机节点文件系统中的文件或目录挂载至容器组。大多数容器组可能不需要这类卷,但它可以为一些应用提供了强大的逃生舱 (Escape Hatch)。有关更多信息,请参阅 Kubernetes 官方文档

  • 挂载配置字典或保密字典:支持配置字典保密字典键值对。

    保密字典卷用于为容器组提供密码、OAuth 凭证、SSH 密钥等敏感信息。该卷由 tmpfs(基于 RAM 的文件系统)支持,所以数据不会写入非易失性存储中。

    配置字典卷以键值对的形式存放配置数据。ConfigMap 资源可用于向容器组中注入配置数据。存放在 ConfigMap 对象中的数据可以由 configMap 类型的卷引用,并由容器组中运行的容器化应用使用。ConfigMap 通常用于以下场景:

    • 设置环境变量。
    • 设置容器中的命令参数。
    • 创建卷中的配置文件。

查看和管理持久性声明

持久性声明创建后,您可以查看持久性声明的详情、编辑持久性声明和使用持久性声明功能。

查看持久性声明详情

持久性声明页面,点击一个持久性声明名称可打开持久性声明详情页面。

  1. 点击资源状态页签,查看持久卷用量和挂载的容器组。

  2. 点击元数据页签,查看持久卷声明的标签和注解。

  3. 点击事件页签,查看持久卷声明的事件。

  4. 点击快照页签,查看卷快照。

编辑持久性声明

在持久性声明详情页面,您可以点击编辑信息修改持久性声明的基本信息。点击更多操作可编辑 YAML 文件或删除持久性声明。

如需删除持久性声明,请确保该持久性声明未挂载至任何工作负载。如需卸载工作负载的持久性声明,请进入该工作负载的详情页面,点击更多操作,从下拉菜单中选择编辑设置,在弹出的对话框中选择存储,然后点击垃圾桶图标卸载该持久性声明。

在您点击删除后,如果持久性声明长时间处于删除中状态,请使用以下命令手动删除:

  1. kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'

使用持久性声明功能

更多操作下拉菜单提供了其它额外功能,这些功能基于 KubeSphere 的底层存储插件 Storage Capability。具体如下:

  • 克隆:创建一个相同的持久性声明。
  • 创建快照:创建一个持久性声明快照,可用于创建其他持久性声明。有关更多信息,请参阅卷快照
  • 扩容:增加持久性声明的容量。请注意,您无法在控制台上减少持久性声明的容量,因为数据可能会因此丢失。

有关 Storage Capability 的更多信息,请参阅设计文档

备注

Storage Capability 可能尚未覆盖一些树内 (in-tree) 或特殊的 CSI 插件。如果某些功能在 KubeSphere 集群中没有正确显示,您可以按照此文档修改设置。

监控持久性声明

KubeSphere 从 Kubelet 获取 Filesystem 模式的 PVC 的指标数据(包括容量使用情况和 inode 使用情况),从而对持久性声明进行监控。

有关持久性声明监控的更多信息,请参阅 Research on Volume Monitoring

查看持久卷列表并管理持久卷

查看持久卷列表

  1. 持久卷声明页面,点击持久卷页签,可以查看以下信息:

    参数描述
    Name持久卷名称,在该持久卷的清单文件中由 .metadata.name 字段指定。
    状态持久卷的当前状态,在该持久卷的清单文件中由 .status.phase 字段指定,包括:
    • 可用:持久卷可用,尚未绑定至持久卷声明。
    • 已绑定:持久卷已绑定至持久卷声明。
    • 删除中:正在删除持久卷。
    • 失败:持久卷不可用。
    容量持久卷的容量,在该持久卷的清单文件中由 .spec.capacity.storage 字段指定。
    访问模式持久卷的访问模式,在该持久卷的清单文件中由 .spec.accessModes 字段指定,包括:
    • RWO:持久卷可挂载为单个节点读写。
    • ROX:持久卷可挂载为多个节点只读。
    • RWX:持久卷实例可挂载为多个节点读写。
    回收策略持久卷实例的回收策略,在该持久卷实例的清单文件中由 .spec.persistentVolumeReclaimPolicy 字段指定,包括:
    • Retain:删除持久卷声明后,保留该持久卷,需要手动回收。
    • Delete:删除该持久卷,同时从卷插件的基础设施中删除所关联的存储设备。
    • Recycle:清除持久卷的数据,使该持久卷可供新的持久卷声明使用。
    创建时间持久卷的创建时间。
  2. 点击持久卷实例右侧的 并在下拉菜单中选择一项操作:

    • 编辑信息:编辑持久卷信息。
    • 编辑 YAML:编辑持久卷的 YAML 文件。
    • 删除:删除持久卷。处于已绑定状态的持久卷不可删除。

查看持久卷实例详情页面

  1. 点击持久卷的名称,进入其详情页面。

  2. 在详情页面,点击编辑信息以编辑持久卷的基本信息。

  3. 点击更多操作,在下拉菜单中选择一项操作:

    • 查看 YAML:查看持久卷的 YAML 文件。
    • 删除:删除持久卷并返回列表页面。处于已绑定状态的持久卷不可删除。
  4. 点击资源状态页签,查看持久卷所绑定的持久卷声明。

  5. 点击元数据页签,查看持久卷的标签和注解。

  6. 点击事件页签,查看持久卷的事件。