我正在评估 Kubernetes 作为我们新应用程序的平台。现在,看起来一切都非常令人兴奋!但是,我遇到了一个问题:我在 GCE 上托管我的集群,我需要一些机制来在两个 pod 之间共享存储 - 持续集成服务器和我的应用程序服务器。使用 kubernetes 执行此操作的最佳方法是什么?似乎没有一种卷类型适合我的需求,因为如果一个 pod 需要写入磁盘,则无法共享 GCE 磁盘。 NFS 将是完美的,但似乎需要 kubernetes 集群的特殊构建选项?
编辑:共享存储似乎是我现在使用 Kubernetes 多次遇到的问题。有多个用例,我只想拥有一个卷并将其连接到多个 pod(具有写访问权限)。我只能假设这将是一个常见的用例,不是吗?
EDIT2:例如, 此页面 描述了如何设置 Elasticsearch 集群,但是不可能将其与持久存储连接起来( 如此处所述),这使得它毫无意义:(
原文由 Marco Lamina 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,你 真的 需要多个读者/作者吗?
根据我对 Kubernetes / 微服务架构 (MSA) 的经验,这个问题通常与您的设计模式更相关。 MSA 的基本设计模式之一是对服务的适当封装,这包括每个服务拥有的数据。
与 OOP 大致相同,您的服务应处理与其关注领域相关的数据,并应允许通过接口访问其他服务的数据。这个接口可以是一个 API、直接或通过代理服务处理的消息,或者使用协议缓冲区和 gRPC。通常,对数据的多服务访问是一种反模式,类似于 OOP 和大多数编程语言中的全局变量。
举个例子,如果你想写日志,你应该有一个日志服务,每个服务都可以调用它需要记录的相关数据。直接写入共享磁盘意味着如果您更改日志目录结构,或者决定添加额外功能(例如针对某些类型的错误发送电子邮件),则需要更新每个容器。
在大多数情况下,您应该在使用文件系统之前使用某种形式的最小接口,以避免在使用文件系统时遇到的 Hyrum 定律 的意外副作用。如果您的服务之间没有适当的接口/合同,您将大大降低构建可维护和弹性服务的能力。
好的,您的情况最好使用文件系统来解决。有很多选择…
显然,有时可以处理多个并发写入者的文件系统提供了优于更“传统”的 MSA 通信形式的解决方案。 Kubernetes 支持大量的卷类型,可以在 这里 找到。虽然这个列表很长,但其中许多卷类型不支持多个写入器(在 Kubernetes 中也称为
ReadWriteMany
)。那些支持
ReadWriteMany
的卷类型可以在 此表 中找到,在撰写本文时是 AzureFile、CephFS、Glusterfs、Quobyte、NFS 和 PortworxVolume。还有一些运营商,例如流行的 rook.io ,它们功能强大并提供了一些很棒的功能,但是当您只想要一个简单的解决方案并继续前进时,此类系统的学习曲线可能会很困难。
最简单的方法。
根据我的经验,最好的初始选项是 NFS。这是了解
ReadWriteMany
Kubernetes 存储的基本思想的好方法,将服务于大多数用例并且最容易实现。在您建立了多服务持久性的工作知识之后,您可以做出更明智的决定来使用功能更丰富的产品,而这些产品通常需要更多的工作来实现。设置 NFS 的细节因集群的运行方式和位置以及 NFS 服务的细节而异,我之前写过两篇关于如何为 本地集群 设置 NFS 和 在 EKS 上使用 AWS NFS 等效 EFS 的文章集群。这两篇文章很好地对比了如何根据您的特定情况执行不同的实现。
举个最简单的例子,您首先需要一个 NFS 服务。如果您希望进行快速测试或者您的 SLO 要求较低,那么按照 这篇 DO 文章 是在 Ubuntu 上设置 NFS 的快速入门指南。如果您有一个现有的 NAS,它提供 NFS 并且可以从您的集群访问,这也可以。
拥有 NFS 服务后,您可以创建类似于以下内容的持久卷:
这里需要注意的是,您的节点需要安装二进制文件才能使用 NFS,我在我 的本地集群 文章中对此进行了更多讨论。这也是您在 EKS 上运行时 需要 使用 EFS 的原因,因为您的节点无法连接到 NFS。
一旦设置了持久卷,就可以像使用任何其他卷一样使用它。