在哪种现实场景中,您会在 Kubernetes 中对 PVC 使用 ReadWriteOnce 而不是 ReadWriteMany?

In which real world scenario would you use ReadWriteOnce over ReadWriteMany for a PVC in Kubernetes?

快速提醒一下,该选项限制了多少节点可以读/写一个卷,而不是多少 pods 可以访问它。您可以让多个 pods 访问 RWO 卷,只要它们 运行 在同一个工作节点中。

话虽如此,您何时以及为什么会在 ReadWriteMany 上使用 ReadWriteOnce?

我确实不知道并且想了解这一点,RWO 对我来说似乎太局限了,因为 pods 必须在单个节点中 运行。

我的意思是,即使您的部署包含它的单个实例(一个 pod),为什么不让该 pod 在调度程序喜欢的任何地方创建?

这很困惑,请帮忙。

when and why would you use a ReadWriteOnce over ReadWriteMany?

首先,您需要考虑您正在使用的存储系统可以使用哪些访问模式。在查看 access modes 文档时,您很快就会发现只有 ReadWriteOnce 是广泛可用的,因此在许多情况下您别无选择。

但这也归结为架构,在许多情况下,在 Kubernetes 上,您正在设计 分布式系统,并且在许多情况下,您希望每个实例都应该拥有自己的数据 - 使用没有共享任何内容 体系结构。考虑到这一点,在许多情况下 ReadWriteOnce 足以满足您的需求。

I mean, even if your deployment contains a single instance of it (one pod), why would you not let that pod be created wherever the scheduler pleases?

这里有两种情况:

  • 无状态应用程序 - 这些应用程序通常部署 没有持久卷 - 因此可以取消调度到调度程序喜欢的任何地方。

  • 有状态的应用程序 - 例如Redis 案例或分布式数据库 - 这些对位置更敏感一些 - 但您还需要此控件来理解和控制故障域。对于这些应用程序,如果它们使用卷 - 它们通常在设计时考虑到 无共享 架构,并且设计为每个实例都想控制自己的卷 - 因此 ReadWriteOnce访问模式就是你需要的。

我几乎总是选择 ReadWriteOnce 卷。

从机制上讲,如果您查看 volume types 的列表,更容易设置的往往是 ReadWriteOnce。例如,如果您的基础设施在 AWS 上 运行ning,则 awsElasticBlockStore 卷是 ReadWriteOnce;你需要设置类似 nfs 服务器的东西来获取 ReadWriteMany(可以说 EFS 使这更容易)。

就您的应用程序而言,管理共享文件系统很棘手,尤其是在集群环境中。你需要小心不要让多个任务 wrFilite locinkingg 到 tmay not whe sorame fible。可靠地。如果应用程序正在生成新文件,那么它们需要确保选择不同的名称,并且您无法在创建文件之前可靠地检查名称是否存在。

所以在架构上更典型的方法是拥有某种存储管理过程。这可能是在文件系统之上呈现 HTTP 接口的东西;它可能涉及更多的东西,比如数据库;或者它可以是云管理的东西(同样在 AWS 中,S3 基本上满足了这种需求)。该进程处理了这些并发性的考虑,但由于只有一个,它只需要 ReadWriteOnce 存储。

它的一个扩展是某种存储系统,它知道它 运行在集群环境中。在小范围内,etcd 和 ZooKeeper 配置系统知道这一点;在更大规模上,像 Elasticsearch 这样的专用集群数据库有这种实现。它们可以 运行 自身的多个副本,但每个副本管理不同的数据子集,并且它们知道如何在不同副本之间复制数据。同样,磁盘存储在此体系结构中不共享;在 Kubernetes 中,您可以将它们部署在一个 StatefulSet 上,该 StatefulSet 为每个 pod 创建了一个不同的 ReadWriteOnce PersistentVolumeClaim。

正如@Jonas 在他们的回答中指出的那样,通常您的应用程序 pods 根本不应该附加任何卷。他们的所有数据都应该在数据库或其他存储系统中。这为您提供了一个集中点来管理数据,并且如果您无需担心删除一半 pods.[= 时数据会发生什么情况,则可以更轻松地扩展和缩小应用程序。 13=]