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

Kubernetes Persistent Volume Access Modes: ReadWriteOnce vs ReadOnlyMany vs ReadWriteMany

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

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

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

  1. ReadOnlyMany – the volume can be mounted read-only by many nodes

通过这种方法,多个节点上的多个pods运行可以使用一个单个卷读取数据。

如果一个pod以ReadOnlyMany访问模式挂载一个volume,其他pod可以挂载它并执行只读操作。目前 GCP 不支持此方法。

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

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

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

  1. ReadWriteMany – the volume can be mounted as read-write by many nodes

通过这种方法,多个节点上的多个pods运行可以使用一个单卷read/write数据

如果一个pod以ReadWriteMany访问模式挂载一个volume,其他pod也可以挂载它。

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

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

因为它是 ReadWriteMany,如果您的 pod 调度到另一个节点,那么那里的卷和数据也将可用于执行 read/write 操作。

为此,您可以使用 NFS(MinIO, GlusterFS) or EFS 文件系统。

  1. ReadWriteOnce – the volume can be mounted as read-write by a single node

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

这意味着该卷可以挂载到您的 kubernetes 集群的 only 个节点上,您只能执行读取操作。

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

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

当您计划 Pods 需要 写入 到卷时,您应该使用 ReadWriteX,而不仅仅是 从卷中读取 数据。

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

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

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

  • 如果您需要写入该卷,并且您可能有多个 Pods 需要写入该卷,而您更希望将那些 Pods 的灵​​活性安排到不同的节点, ReadWriteMany 是给定 K8s 集群的卷插件的选项,使用 ReadWriteMany.
  • 如果您需要写入卷但您没有要求多个 pods 应该能够写入它,或者 ReadWriteMany 根本不是一个可用的选项对你来说,使用 ReadWriteOnce.
  • 如果您只需要从卷中读取,并且您可能有多个 Pods 需要从卷中读取,您更希望将那些 Pods 的灵​​活性安排到不同的节点,并且 ReadOnlyMany 是给定 K8s 集群的卷插件的选项,使用 ReadOnlyMany.
  • 如果您只需要从卷中读取但您没有要求多个 pods 应该能够从中读取,或者 ReadOnlyMany 根本不可用您的选项,请使用 ReadWriteOnce。在这种情况下,您希望该卷是只读的,但您的卷插件的限制迫使您选择 ReadWriteOnce(没有 ReadOnlyOnce 选项)。作为一种好的做法,请考虑将 Pod 规范中的 containers.volumeMounts.readOnly 设置为 true,以便与旨在为只读的卷相对应的卷安装。

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

  1. ReadOnlyMany (ROX)

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

  1. ReadWriteMany (RWX)

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

  1. ReadWriteOnce (RWO)

在这种模式下多个pods运行只有一个节点可以连接到存储并进行读写操作。

  1. ReadWriteOncePod (RWOP)

在此模式下,卷可以由单个 Pod 安装为 read-write。如果要确保整个集群中只有一个 pod 可以读取或写入该 PVC,请使用 ReadWriteOncePod 访问模式。这仅支持 CSI 卷和 Kubernetes 版本 1.22+。

关注 documentation 以获得更多见解。