Kubernetes 存储围绕三个关键概念展开:PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass。它们定义了集群内存储的请求、分配和配置方式。在底层,CSI(Container Storage Interface)驱动程序通常负责实际的存储供应和挂载。下面我们简要介绍每个组件,并突出 CSI 驱动的作用。
PersistentVolume (PV) 是集群中已被预配的存储(可以是管理员静态配置,也可以通过 StorageClass 动态配置)。它代表底层存储——例如云提供商的磁盘或网络附加文件系统——并作为集群中的一种资源存在,类似于节点。
PersistentVolumeClaim (PVC) 是对存储的请求。用户定义所需的存储容量和访问模式(例如读写)。如果有合适的 PV 可用或可以通过 StorageClass 动态供应,PVC 就会与该 PV “绑定”。绑定后,Pod 可以引用 PVC 来持久化或共享数据。
Kubernetes 的通用临时卷功能允许你在 Pod 生命周期中使用由 CSI 驱动的 temporary
卷,这类似于 emptyDir
,但功能更强大,支持挂载任何类型的 CSI 卷(支持快照、扩展等功能)。
更多用法请参考 Generic ephemeral volumes
emptyDir 是一种临时存储卷,类型为空目录。
它在 Pod 调度到节点时创建,存储位于该节点的本地文件系统(默认是节点磁盘)上。
当 Pod 被删除时,emptyDir 中的数据也会被清除。
更多用法请参考 Using an emptyDir
在 Kubernetes 中,hostPath 卷是一种特殊类型的卷,它将宿主节点文件系统中的文件或目录直接映射到 Pod 的容器中。
它允许 Pod 访问宿主节点上的文件或目录。
适用于:
访问宿主级资源(例如 Docker socket)
调试
使用节点上已有的数据
Kubernetes 中的 ConfigMap 是一种 API 对象,用于以键值对形式存储非敏感的配置信息。它使配置与应用代码解耦,提高应用的可移植性和易管理性。
在 Kubernetes 中,Secret 是一种 API 对象,用于存储敏感数据,例如:
密码
OAuth 令牌
SSH 密钥
TLS 证书
数据库凭据
Secret 通过避免将敏感数据直接存储在 Pod 规格或容器镜像中,帮助保护这些数据。
StorageClass 描述了卷应如何动态供应。它映射到特定的供应器(通常是 CSI 驱动),并可以包含存储层级、性能特征或其他后端配置参数。通过创建多个 StorageClass,可以向开发者提供多种类型的存储选择。
图示:PVC、PV 和 StorageClass 之间的关系。
Container Storage Interface (CSI) 是 Kubernetes 用于集成存储驱动的标准 API。它允许第三方存储提供商构建外部插件,这意味着你可以安装或更新存储驱动而无需修改 Kubernetes 本身。
一个 CSI 驱动 通常包含两个组件:
控制器组件:运行在集群中(通常以 Deployment 形式),负责高级操作,如创建或删除卷。对于网络存储,它还可能负责将卷挂载或卸载到节点。
节点组件:运行在每个节点上(通常以 DaemonSet 形式),负责在该节点上挂载和卸载卷。它与 kubelet 通信,确保卷对 Pod 可用。
当用户创建引用使用 CSI 驱动的 StorageClass 的 PVC 时,CSI 驱动会监测该请求并相应地供应存储(如果需要动态供应)。存储创建完成后,驱动通知 Kubernetes,Kubernetes 创建对应的 PV 并将其绑定到 PVC。每当 Pod 使用该 PVC 时,驱动的节点组件负责挂载卷,使存储在容器内可用。
通过利用 PV、PVC、StorageClass 和 CSI,Kubernetes 实现了强大且声明式的存储管理方式。管理员可以定义一个或多个 StorageClass 来表示不同的存储后端或性能层级,而开发者只需通过 PVC 请求存储,无需关心底层基础设施。