核心概念

Kubernetes 存储围绕三个关键概念展开:PersistentVolume (PV)PersistentVolumeClaim (PVC)StorageClass。它们定义了集群内存储的请求、分配和配置方式。在底层,CSI(Container Storage Interface)驱动程序通常负责实际的存储供应和挂载。下面我们简要介绍每个组件,并重点说明 CSI 驱动的作用。

目录

Persistent Volume (PV)

PersistentVolume (PV) 是集群中已被预配的存储(可以由管理员静态配置,也可以通过 StorageClass 动态配置)。它代表底层存储,例如云服务商的磁盘或网络附加文件系统,并作为集群中的一种资源存在,类似于节点。

Persistent Volume Claim (PVC)

PersistentVolumeClaim (PVC) 是对存储的请求。用户定义所需的存储容量和访问模式(例如读写)。如果有合适的 PV 可用,或者可以通过 StorageClass 动态供应,PVC 就会与该 PV “绑定”。绑定后,Pod 可以引用 PVC 来持久化或共享数据。

通用临时卷(Generic Ephemeral Volumes)

Kubernetes 引入的通用临时卷功能允许您在 Pod 生命周期内使用由 CSI 驱动的 temporary 卷,这类似于 emptyDir,但功能更强大,支持挂载任何类型的 CSI 卷(支持快照、扩展等功能)。

更多用法请参考 Generic ephemeral volumes

emptyDir

  1. emptyDir 是一种临时存储卷,类型为空目录。

  2. 它在 Pod 被调度到节点时创建,存储位于该节点的本地文件系统(默认是节点磁盘)。

  3. 当 Pod 被删除时,emptyDir 中的数据也会被清除。

更多用法请参考 Using an emptyDir

hostPath

在 Kubernetes 中,hostPath 卷是一种特殊类型的卷,它将宿主节点文件系统中的文件或目录直接映射到 Pod 的容器中。

  • 它允许 Pod 访问宿主节点上的文件或目录。

  • 适用于:

    • 访问宿主级资源(例如 Docker 套接字)

    • 调试

    • 使用节点上已有的数据

ConfigMap

Kubernetes 中的 ConfigMap 是一种 API 对象,用于以键值对形式存储非敏感的配置信息。它允许您将配置与应用代码解耦,使应用更具可移植性且易于管理。

Secret

在 Kubernetes 中,Secret 是一种 API 对象,用于存储敏感数据,例如:

  • 密码

  • OAuth 令牌

  • SSH 密钥

  • TLS 证书

  • 数据库凭据

Secret 通过避免将敏感数据直接存储在 Pod 规格或容器镜像中来保护这些数据。

StorageClass

StorageClass 描述了卷应如何动态供应。它映射到特定的供应器(通常是 CSI 驱动),并可以包含存储层级、性能特征或其他后端配置参数。通过创建多个 StorageClass,您可以为开发者提供多种类型的存储选择。

图示:PVC、PV 和 StorageClass 之间的关系。

Container Storage Interface (CSI)

Container Storage Interface (CSI) 是 Kubernetes 用于集成存储驱动的标准 API。它允许第三方存储提供商构建外部插件,这意味着您可以安装或更新存储驱动而无需修改 Kubernetes 本身。

一个 CSI 驱动 通常包含两个组件:

  1. 控制器组件:运行在集群中(通常以 Deployment 形式),负责高级操作,如 创建删除 卷。对于网络存储,它还可能负责将卷附加或分离到节点。

  2. 节点组件:运行在每个节点上(通常以 DaemonSet 形式),负责在该节点上 挂载卸载 卷。它与 kubelet 通信,确保卷对 Pod 可用。

当用户创建引用使用 CSI 驱动的 StorageClass 的 PVC 时,CSI 驱动会监听该请求并相应地供应存储(如果需要动态供应)。存储创建完成后,驱动通知 Kubernetes,Kubernetes 创建对应的 PV 并将其绑定到 PVC。每当 Pod 使用该 PVC 时,驱动的节点组件负责挂载卷,使存储在容器内可用。


通过利用 PVPVCStorageClassCSI,Kubernetes 实现了强大且声明式的存储管理方式。管理员可以定义一个或多个 StorageClass 来代表不同的存储后端或性能层级,而开发者只需通过 PVC 请求存储,无需关心底层基础设施。