有多种方法可以为 Kubernetes 集群上运行的应用程序配置数据存储。 其中一些已经过时,另一些则是最近才出现的。 在本文中,我们将研究连接存储系统的三个选项的概念,包括最新的一个 - 通过容器存储接口连接。
方法一:在pod清单中指定PV
描述 Kubernetes 集群中 pod 的典型清单:
清单中描述连接哪个卷以及连接位置的部分以颜色突出显示。
在第 卷挂载 指示安装点 (mountPath) - 永久卷将安装在容器内的哪个目录中,以及卷的名称。
在第 x 列出 Pod 中使用的所有卷。 指定每个卷的名称以及类型(在我们的示例中:awsElasticBlockStore)和连接参数。 清单中列出的参数取决于卷类型。
相同的卷可以同时安装在多个 Pod 容器中。 这样,不同的应用程序进程就可以访问相同的数据。
这种连接方法是在一开始就被发明的,当时 Kubernetes 还处于起步阶段,而今天这种方法已经过时了。
使用时存在几个问题:
- 所有卷都必须手动创建;Kubernetes 无法为我们创建任何内容;
- 每个卷的访问参数都是唯一的,并且必须在使用该卷的所有 pod 的清单中指定它们;
- 要更改存储系统(例如,从 AWS 迁移到 Google Cloud),您需要更改所有清单中已安装卷的设置和类型。
所有这些都非常不方便,所以实际上这个方法只用于连接一些特殊类型的卷:configMap、secret、emptyDir、hostPath:
-
configMap 和 Secret 是服务卷,允许您使用容器中 Kubernetes 清单中的文件创建卷。
-
emptyDir 是一个临时卷,仅为 pod 的生命周期创建。 方便用于测试或存储临时数据。 当删除 pod 时,emptyDir 卷也会被删除,并且所有数据都会丢失。
-
hostPath - 允许您在应用程序的容器内挂载运行应用程序的服务器本地磁盘上的任何目录,包括 /etc/kubernetes。 这是一项不安全的功能,因此安全策略通常禁止使用此类卷。 否则,攻击者的应用程序将能够在其容器内挂载 HTC Kubernetes 目录并窃取所有集群证书。 通常,hostPath 卷仅允许在 kube-system 命名空间中运行的系统应用程序使用。
方法 2. 连接 SC/PVC/PV 炉床
另一种连接方法是Storage类、PersistentVolumeClaim、PersistentVolume的概念。
存储类 将连接参数存储到数据存储系统。
持久卷声明 描述应用程序所需的要求。
持久卷 存储访问参数和卷状态。
这个想法的本质是:在 pod 清单中,它们指示 PersistentVolumeClaim 类型的卷,并在 ClaimName 参数中指示该实体的名称。
PersistentVolumeClaim 清单描述了应用程序所需的数据量的要求。 包括:
- 磁盘大小;
- 访问方式:ReadWriteOnce 或 ReadWriteMany;
- 链接到存储类 - 我们要在其中创建卷的数据存储系统。
存储类清单存储与存储系统的连接的类型和参数。 多维数据集需要它们将卷安装到其节点上。
PersistentVolume 清单指示特定卷的存储类和访问参数(卷 ID、路径等)。
创建 PVC 时,Kubernetes 会查看所需的卷大小和存储类别,并选择一个空闲的 PersistentVolume。
如果这样的PV不可用,Kubernetes可以启动一个特殊的程序——Provisioner(它的名字在Storage类中标明)。 该程序连接到存储系统,创建所需大小的卷,接收标识符并在 Kubernetes 集群中创建与 PersistentVolumeClaim 关联的 PersistentVolume 清单。
所有这组抽象允许您从应用程序清单级别到管理级别删除有关应用程序正在使用哪个存储系统的信息。
连接数据存储系统的所有参数都位于Storage类中,由集群管理员负责。 从 AWS 迁移到 Google Cloud 时,您所需要做的就是将应用程序清单中的存储类名称更改为 PVC。 将使用Provisioner程序在集群中自动创建用于数据存储的持久卷。
方法三:容器存储接口
所有与各种存储系统交互的代码都是 Kubernetes 核心的一部分。 错误修复或新功能的发布与新版本相关;必须针对所有受支持的 Kubernetes 版本更改代码。 所有这些都很难维护和添加新功能。
为了解决这个问题,来自 Cloud Foundry、Kubernetes、Mesos 和 Docker 的开发人员创建了容器存储接口(CSI)——一个简单的统一接口,描述容器管理系统和与特定容器一起工作的特殊驱动程序(CSI Driver)之间的交互。存储系统。 所有与存储系统交互的代码都从 Kubernetes 核心移至单独的系统。
通常,CSI驱动程序由两个组件组成:节点插件和控制器插件。
节点插件运行在每个节点上,负责安装卷并对其执行操作。 控制器插件与存储系统交互:创建或删除卷、分配访问权限等。
目前,旧的驱动程序仍然保留在 Kubernetes 内核中,但不再建议使用它们,并且建议每个人专门为其将要使用的系统安装 CSI 驱动程序。
这项创新可能会吓到那些已经习惯通过 Storage 类设置数据存储的人,但实际上并没有发生什么可怕的事情。 对于程序员来说,没有什么真正改变——他们只使用存储类这个名称,并将继续这样做。 对于管理员来说,添加了 helm 图表安装,并且设置的结构已更改。 如果以前将设置直接输入到 Storage 类中,那么现在必须首先在 helm 图表中设置它们,然后再在 Storage 类中设置。 如果你仔细观察的话,并没有什么不好的事情发生。
让我们通过一个示例来了解一下改用 CSI 驱动程序连接 Ceph 存储系统可以获得的好处。
使用 Ceph 时,CSI 插件提供了比内置驱动程序更多的存储系统选项。
- 动态磁盘创建。 通常,RBD 磁盘仅在 RWO 模式下使用,但 Ceph 的 CSI 允许它们在 RWX 模式下使用。 不同节点上的多个 Pod 可以在其节点上挂载相同的 RDB 磁盘并并行使用它们。 公平地说,并非一切都那么光明 - 该磁盘只能作为块设备连接,这意味着您必须调整应用程序以在多访问模式下使用它。
- 创建快照。 在 Kubernetes 集群中,您可以创建一个清单,并要求创建快照。 CSI 插件将看到它并从磁盘获取快照。 基于它,您可以制作 PersistentVolume 的备份或副本。
- 增加磁盘大小 Kubernetes 集群中的存储和 PersistentVolume。
- 配额。 Kubernetes 中内置的 CephFS 驱动程序不支持配额,但带有最新 Ceph Nautilus 的新 CSI 插件可以在 CephFS 分区上启用配额。
- 指标。 CSI 插件可以为 Prometheus 提供各种指标,包括哪些卷已连接、正在进行哪些通信等。
- 拓扑感知。 允许您在清单中指定集群的地理分布方式,并避免将位于阿姆斯特丹的存储系统连接到在伦敦运行的 Pod。
如何通过 CSI 将 Ceph 连接到 Kubernetes 集群,请参阅
文章作者:Sergey Bondarev,Southbridge 执业架构师,Kubernetes 认证管理员,kubespray 开发者之一。
一点Post Scriptum不是为了广告,而是为了利益......
PS Sergey Bondarev 主持两门强化课程:更新
来源: habr.com