Kubernetes 持久卷访问模式:ReadWriteOnce vs ReadOnlyMany vs ReadWriteMany

ACl*_*mer 22 kubernetes persistent-volumes

根据这个官方文档,Kubernetes Persistent Volumes 支持三种类型的访问模式。

  1. 只读多
  2. 一次读写
  3. 读写多

文档中对它们的给定定义是非常高级的。如果有人可以更详细地解释它们以及我们应该使用一个与另一个的不同用例的一些示例,那就太好了。

Ami*_*pta 47

ReadWriteX当您计划拥有需要写入卷而不是仅从卷读取数据的Pod 时,您应该使用。

XMany当您希望 Pod 能够在这些工作负载在 Kubernetes 集群中的不同节点上运行时访问给定的卷时,您应该使用。这些 Pod 可能是属于一个 Deployment 的多个副本,也可能是完全不同的 Pod。在许多情况下,希望在不同节点上运行 Pod,例如,如果单个 Deployment 有多个 Pod 副本,那么让它们在不同节点上运行有助于确保一定程度的持续可用性,即使其中一个节点出现故障或正在更新。

如果您不使用XMany,但您确实有多个 Pod 需要访问给定的卷,这将迫使 Kubernetes 将所有这些 Pod 安排在卷首先安装到的任何节点上运行,如果有,这可能会使该节点过载太多这样的 Pod,并且会影响部署的可用性,这些部署的 Pod 需要访问该卷,如上一段所述。

所以把所有这些放在一起:

  • 如果您需要写入卷,并且您可能有多个 Pod 需要写入卷,您更喜欢将这些 Pod 灵活地调度到不同节点,并且ReadWriteMany是给定 K8s 集群的卷插件的一个选项,使用ReadWriteMany.
  • 如果您需要写入该卷,但您不要求多个 Pod 应该能够写入该卷,或者ReadWriteMany根本不适合您,请使用ReadWriteOnce.
  • 如果您只需要从卷中读取,并且您可能有多个 Pod 需要从卷中读取,您更喜欢将这些 Pod 灵活地调度到不同节点,并且ReadOnlyMany是给定 K8s 集群的卷插件的一个选项,使用ReadOnlyMany
  • 如果您只需要从卷中读取,但您不要求多个 pod 应该能够从中读取,或者ReadOnlyMany根本不适合您,请使用ReadWriteOnce. 在这种情况下,您希望卷是只读的,但卷插件的限制迫使您做出选择ReadWriteOnce(没有ReadOnlyOnce选项)。作为一种好的做法,请考虑在您的 Pod 规范中为与旨在为只读的卷相对应的卷挂载containers.volumeMounts.readOnly设置true

  • 很好的解释。 (2认同)
  • 出色的!谢谢 (2认同)

Adi*_*yan 6

在 Kubernetes 中,您可以静态(使用存储类)或动态(持久卷)配置存储。一旦存储可供绑定和声明,您需要配置 Pod 或节点连接到存储(持久卷)的方式。可以配置为以下四种模式。

  1. 只读许多 (ROX)

在这种模式下,运行在不同节点上的多个 Pod 可以连接到存储并执行读取操作。

  1. 读写多 (RWX)

在这种模式下,运行在不同节点上的多个 Pod 可以连接到存储并执行读写操作。

  1. 一次读写 (RWO)

在这种模式下,仅在一个 Node 上运行的多个 Pod可以连接到存储并执行读写操作。

  1. ReadWriteOncePod (RWOP)

在此模式下,卷可以由单个 Pod 以读写方式挂载。如果要确保整个集群中只有一个 pod 可以读取该 PVC 或对其进行写入,请使用 ReadWriteOncePod 访问模式。仅 CSI 卷和 Kubernetes 版本 1.22+ 支持此功能。

请遵循文档以获得更多见解。


Har*_*var 5

  1. ReadOnlyMany – 卷可以被许多节点以只读方式挂载

如果一个 pod 挂载了一个 ReadOnlyMany 访问模式的卷,其他 pod 可以挂载它并且只执行读取操作。现在 GCP 不支持这种方法。

这意味着卷可以挂载在 Kubernetes 集群的一个或多个节点上,并且您只能执行读取操作。

您有一个 Pod 在节点上运行,并且您正在从卷中读取存储的文件。在同一卷上,您无法执行写入操作。

由于它是 ReadOnlyMany,如果您的 pod 被调度到另一个节点,那么卷和数据也将可用于执行读取操作。

  1. ReadWriteMany – 卷可以被许多节点以读写方式挂载

如果一个 pod 挂载了一个 ReadWriteMany 访问方式的卷,其他 pod 也可以挂载它。

这意味着卷可以挂载在 kubernetes 集群的一个或多个节点上,您可以同时执行读写操作。

您在一个节点上运行了一个 pod,并且您正在从卷中读取和写入存储的文件。

由于它是 ReadWriteMany,如果您的 pod 调度到另一个节点,那么卷和数据也将在那里可用以执行读/写操作。

  1. ReadWriteOnce – 卷可以由单个节点以读写方式挂载

如果 pod 以 ReadWriteOnce 访问模式挂载卷,则其他 pod 无法挂载它。在 GCE (Google Compute Engine) 中,唯一允许的模式是 ReadWriteOnce 和 ReadOnlyMany。因此,要么一个 pod 挂载 ReadWrite 卷,要么一个或多个 pod 挂载 ReadOnlyMany 卷。

这意味着卷可以挂载在onlykubernetes 集群的一个节点上,并且您只能执行读取操作。

您在节点上运行了一个 pod,并且您正在从卷中读取存储的文件。在同一卷上时,您无法执行写入。

因为它是 ReadWriteOnce 如果您的 pod 被安排到另一个节点,那么可能 mossible 卷将附加到该节点并且您无法访问那里的数据。

  • 即使在 RWO 模式下,多个 Pod 也可以写入公共持久卷声明引用的同一持久卷。此外,在本地存储卷上,不同节点上的多个 Pod 可以写入同一 PV,因为这种情况下的 PV 可能是指向附加到节点的不同物理磁盘的单个逻辑实体。总而言之,不同 PV 类型的访问模式的具体行为会有所不同,Kubernetes 官方文档对此并不太清楚。 (2认同)