【问题标题】:In which real world scenario would you use ReadWriteOnce over ReadWriteMany for a PVC in Kubernetes?在 Kubernetes 中的 PVC 中,您会在哪种实际场景中使用 ReadWriteOnce 而不是 ReadWriteMany?
【发布时间】:2021-07-16 19:54:48
【问题描述】:
作为一个快速提醒,该选项限制了可以读取/写入卷的节点数量,而不是可以访问它的 pod 数量。您可以让多个 Pod 访问一个 RWO 卷,只要它们在同一个工作节点中运行即可。
话虽如此,您何时以及为什么会使用 ReadWriteOnce 而不是 ReadWriteMany?
我当然不知道并且想理解这一点,RWO 对我来说似乎太局限了,因为 pod 必须在单个节点中运行。
我的意思是,即使您的部署包含它的单个实例(一个 pod),为什么不让调度程序在任何地方创建该 pod?
这很混乱,请帮忙。
【问题讨论】:
标签:
kubernetes
persistent-volumes
persistent-volume-claims
【解决方案1】:
我几乎总是会选择 ReadWriteOnce 卷。
机械地,如果您查看volume types 的列表,更容易设置的往往是ReadWriteOnce。例如,如果您的基础设施在 AWS 上运行,awsElasticBlockStore 卷是 ReadWriteOnce;您需要设置类似nfs 服务器来获取 ReadWriteMany(可以说 EFS 使这更容易)。
就您的应用程序而言,管理共享文件系统非常棘手,尤其是在集群环境中。你需要小心不要有多个任务 wrFilite locinkingg 到tmay not whe sorame fikle。可靠。如果应用程序正在生成新文件,那么它们需要确保选择不同的名称,并且您无法在创建文件之前可靠地检查名称是否存在。
因此,在架构上,更典型的方法是拥有某种存储管理流程。这可能是在文件系统之上提供 HTTP 接口的东西;它可能是更复杂的东西,比如数据库;或者它可能是云管理的东西(同样在 AWS 中,S3 基本上满足了这种需求)。该进程处理这些并发考虑,但由于只有其中一个,因此它只需要 ReadWriteOnce 存储。
对此的扩展是某种存储系统,它知道自己在集群环境中运行。在小范围内,etcd 和 ZooKeeper 配置系统知道这一点;在更大的范围内,像 Elasticsearch 这样的专用集群数据库有这种实现。它们可以运行自己的多个副本,但每个副本管理不同的数据子集,并且它们知道如何在不同副本之间复制数据。同样,此架构中不共享磁盘存储。在 Kubernetes 中,您可以将这些部署在 StatefulSet 上,为每个 pod 创建一个不同的 ReadWriteOnce PersistentVolumeClaim。
正如@Jonas 在他们的回答中指出的那样,通常您的应用程序 pod 根本不应该附加任何卷。他们的所有数据都应该在数据库或其他一些存储系统中。这为您提供了一个集中点来管理数据,并且如果您不需要担心删除一半 pod 时数据会发生什么情况,那么它可以更轻松地向上和向下扩展应用程序。
【解决方案2】:
您何时以及为什么要使用 ReadWriteOnce 而不是 ReadWriteMany?
首先,您需要考虑您正在使用的存储系统可以使用哪些访问模式。查看access modes 文档时,您很快就会发现只有ReadWriteOnce 广泛可用,因此在许多情况下您没有其他选择卷。
但这也归结为架构,在许多情况下,在 Kubernetes 上,您正在设计分布式系统,并且在许多情况下,您希望每个实例都应该拥有自己的数据 - 使用 不共享 架构。考虑到这一点,在许多情况下,ReadWriteOnce 足以满足您的需求。
我的意思是,即使您的部署包含它的单个实例(一个 pod),为什么不让调度程序在任何地方创建该 pod?
这里有两种情况:
-
无状态应用程序 - 这些应用程序通常部署在没有持久卷 - 因此无论如何都可以调度到调度程序喜欢的任何地方。
-
有状态应用 - 例如Redis 案例或分布式数据库 - 这些对位置更敏感 - 但您也希望使用此控件来理解和控制故障域。对于这些应用程序,如果它们使用音量 - 它们通常在设计时考虑到 shared nothing 架构,并且设计为每个实例都希望控制自己的音量 - 因此ReadWriteOnce 访问模式就是您的选择需要。