# Kubernetes 存储 Kubernetes 为容器平台(或集群管理员)和应用开发人员提供了一些增强特性以支持运行有状态的工作负载。 这些特性确保了只要调度容器(包括卷的供应/创建、附加、挂载、解除挂载、拆分和删除)、存储容量管理(容器临时存储使用率、卷扩缩容等), 都可以使用不同类型的文件和块存储(临时存储或持久化存储、本地存储或远程存储),这会影响基于存储的容器调度(数据重力、可用性等)和快照等常规存储操作。 在使用 HwameiStor 运行有状态工作负载时,需理解 Kubernetes 存储的几个抽象概念。 ## 容器存储接口 容器存储接口 (CSI) 是在 Kubernetes 这种容器编排体系上将任意文件存储和块存储系统暴露给容器化工作负载的一个标准。 使用 CSI 后,像 HwameiStor 这样的第三方存储提供商可以写入和部署新的存储卷插件,例如 HwameiStor LocalDisk 和 LocalVolumeReplica,而无需修改 Kubernetes 核心代码。 当集群管理员安装 HwameiStor 时,所需的 HwameiStor CSI 驱动程序组件也将安装到 Kubernetes 集群中。 ```csharp //在 CSI 之前,Kubernetes 支持使用 out-of-tree 资源调配器(也称为外部资源调配器)添加新的存储提供商。Kubernetes 树状卷 (in-tree) 早于外部资源调配器。而 Kubernetes 社区也在努力使用基于 CSI 的卷来替代树状卷。) ``` ## 存储类和动态资源调配 StorageClass 为管理员提供了一种描述存储“类别”的方法。 不同的类别可能会映射到集群管理员确定的服务质量水平、备份策略或任意策略。 在某些存储系统中,StorageClass 这个概念称为“配置文件”。 有了动态资源调配功能后,集群管理员无需预先调配存储资源。 它会在用户请求时自动调配存储资源。动态卷资源调配的实现基于 StorageClass 这个抽象概念。 集群管理员可以根据需要,定义尽可能多的 StorageClass 对象,每个对象都会指定一个调配卷的插件(也称为调配器),并在资源调配时配置传递给该调配器的一组参数。 集群管理员可以在集群内定义和公开(来自相同或不同存储系统的)多种存储类型,每种类型都可以自定义参数。 这种设计还确保最终用户不必担心存储配置的复杂性和细微差别,但仍然能够从多个存储选项中进行选择。 安装 HwameiStor 后将附带了两个默认存储类,允许用户创建本地卷 (HwameiStor LocalVolume) 或副本 (HwameiStor LocalVolumeReplica)。 集群管理员可以启用所需的存储引擎,然后为数据引擎创建存储类。 ## 持久卷声明 PersistentVolumeClaim (PVC) 是由集群管理员提供的 StorageClass 服务的用户存储请求。 在容器上运行的应用可以请求某种类型的存储。例如,容器可以指定所需的存储大小或存取数据的方式(只读、单次读/写、多次读写等)。 除了存储大小和存取模式之外,管理员还可以创建存储类,为 PV 提供自定义属性,例如磁盘类型(HDD 和 SSD)、性能水平或存储层级(常规存储或冷存储)。 ## 持久卷 PersistentVolume (PV) 由存储提供商在用户请求 PVC 时动态调配。PV 包含容器如何消耗存储的详细信息。 Kubernetes 和卷驱动程序使用 PV 中的细节将存储附加/解除附加到容器运行的节点,并将存储挂载/解除挂载到容器。 HwameiStor 控制面动态设置 HwameiStor 本地卷和副本,并帮助在集群中创建 PV 对象。 ## 有状态和无状态 Kubernetes 提供了几个内置的有状态和无状态负载资源,让应用开发人员定义在 Kubernetes 上运行的负载。 通过创建 Kubernetes 无状态/有状态负载,并使用 PVC 将其连接到 PV,可以运行有状态负载。 例如,可以用 YAML 创建引用 PVC 的 MySQL 无状态负载。 无状态负载引用的 MySQL PVC 应该使用请求的大小和 StorageClass 创建。 一旦 HwameiStor 控制平面为所需的 StorageClass 和容量提供了 PV,则声明设置为已满足。 然后,Kubernetes 将挂载 PV 并启动 MySQL 无状态负载。