核心概念

Kubernetes 存储围绕三个关键概念展开:PersistentVolume (PV)PersistentVolumeClaim (PVC)StorageClass。它们定义了在集群中如何请求、分配和配置存储。CSI(Container Storage Interface)驱动程序通常负责存储的实际供给和挂载。

Persistent Volume (PV)

PersistentVolume (PV) 是集群中一块已经被供给的存储(可以由管理员静态供给,也可以通过 StorageClass 动态供给)。它表示底层存储——例如云提供商上的磁盘或网络附加文件系统——并被视为集群中的一种资源,类似于节点。

Persistent Volume Claim (PVC)

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

Generic Ephemeral Volumes

Kubernetes 的 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 访问主机节点上的文件或目录。

  • 适用于:

    • 访问主机级资源

    • 调试

    • 使用节点上已存在的数据

ConfigMap

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

Secret

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

  • 密码

  • OAuth 令牌

  • SSH 密钥

  • TLS 证书

  • 数据库凭据

Secret 通过避免将这些数据直接存储在 Pod 规范或容器镜像中,来帮助保护这些数据。

StorageClass

StorageClass 描述了卷应如何动态供给。它映射到特定的 provisioner(通常是 CSI 驱动程序),并且可以包含存储层级、性能特征或其他后端配置等参数。通过创建多个 StorageClass,你可以向开发人员提供不同类型的存储。

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

Container Storage Interface (CSI)

Container Storage Interface (CSI) 是 Kubernetes 用于与存储驱动程序集成的标准 API。它允许第三方存储提供商构建 out-of-tree 插件,这意味着你可以在不修改 Kubernetes 本身的情况下安装或更新存储驱动程序。

一个 CSI driver 通常包含两个组件:

  1. Controller 组件:在集群中运行(通常作为 Deployment),负责高层操作,例如创建删除卷。对于网络存储,它还可能负责将卷挂载到节点和从节点卸载卷。
  2. Node 组件:在每个节点上运行(通常作为 DaemonSet),负责在该特定节点上挂载卸载卷。它会与 kubelet 通信,以确保 Pod 能够访问该卷。

当用户创建一个引用了使用 CSI 驱动程序的 StorageClass 的 PVC 时,CSI 驱动程序会观察到该请求,并相应地供给存储(如果需要动态供给)。当存储创建完成后,驱动程序会通知 Kubernetes,Kubernetes 随即创建对应的 PV 并将其绑定到 PVC。只要 Pod 使用该 PVC,驱动程序的节点组件就会负责卷挂载,从而使存储在容器内可用。


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