根据这份官方文档,Kubernetes Persistent Volumes 支持三种类型的访问模式。
- 只读多
- 读写一次
- 读写多
文档中对它们的给定定义是非常高级别的。如果有人可以更详细地解释它们以及我们应该使用一个与另一个的不同用例的一些示例,那就太好了。
当您计划让 Pod 需要写入卷而不仅仅是从卷中读取数据时,您应该使用ReadWriteX
。
当您希望 Pod 能够在这些工作负载在 Kubernetes 集群中的不同节点上运行时访问给定卷时,您应该使用XMany
。 这些 Pod 可能是属于一个部署的多个副本,也可能是完全不同的 Pod。在许多情况下,Pod 需要在不同的节点上运行,例如,如果你有多个 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 规范中true
与只读卷对应的卷挂载的containers.volumeMounts.readOnly
设置。
1. 只读多 – 卷可以由多个节点以只读方式挂载
- 通过这种方法,在多个节点上运行的多个 Pod可以使用单个卷和读取数据。
- 如果某个 Pod 以 ReadOnlyMany 访问模式挂载卷,则其他 Pod 可以 挂载它并仅执行读取操作。现在 GCP 不是 支持此方法。
- 这意味着卷可以挂载到您的一个或多个节点上 Kubernetes 集群和你只能执行读取操作。
- 您有一个 Pod 正在节点上运行,并且您正在读取存储的文件 从音量。在同一卷上时,您无法执行写入操作。
- 由于它是只读的,如果你的Pod 被调度到另一个节点,那么 此外,卷和数据也可用于执行读取操作。
阿拉伯数字。读写多 – 卷可由许多节点作为读写挂载
- 通过这种方法,在多个节点上运行的多个 Pod可以 使用单个卷和读/写数据。 如果某个容器使用读写
- 访问模式挂载卷,则其他容器 也可以安装它。
- 这意味着卷可以装载到您的一个或多个节点上 Kubernetes 集群,你可以同时执行读取和写入 操作。 你
- 有一个 pod 在一个节点上运行,你正在读取和写入 卷中存储的文件。
- 因为它是 ReadWriteMany,如果你的 pod 调度到另一个节点,那么也 卷和数据将在那里可用以执行读/写 操作。
- 为此,您可以使用NFS(MinIO,GlusterFS)或EFS 文件系统也。
3.读写一次 – 卷可以由单个节点作为读写方式装载
- 如果某个容器使用读写一次访问模式挂载卷,则不会挂载其他 Pod 可以安装它。在GCE(谷歌计算引擎)中,唯一允许的模式 是 ReadWriteOnce 和 ReadOnlyMany。因此,任何一个 pod 都会安装 卷读写,或一个或多个 Pod 挂载卷只读多个。
- 这意味着卷可以挂载
only
在 Kubernetes 集群,你只能执行读取操作。 - 您有一个 Pod 在节点上运行,并且您正在从中读取存储的文件卷。在同一卷上时,您无法执行写入操作。
- 因为它是ReadWriteOnce如果你的 pod 被调度到另一个节点,那么 可能苔藓卷将附加到节点,您无法获得 在那里访问数据。
在 Kubernetes 中,您可以静态(使用存储类)或动态(持久卷)配置存储。一旦存储可供绑定和声明,您需要以 Pod 或节点连接到存储(持久卷)的方式对其进行配置。可以在以下四种模式下进行配置。
- 只读多 (ROX)
在这种模式下,在不同节点上运行的多个 Pod 可以连接到存储并执行读取操作。
- ReadWriteMany (RWX)
在这种模式下,在不同节点上运行的多个 Pod 可以连接到存储并执行读写操作。
- ReadWriteOnce (RWO)
在这种模式下,仅在一个节点中运行的多个 Pod可以连接到存储并执行读写操作。
- ReadWriteOncePod (RWOP)
在这种模式下,卷可以由单个 Pod 以读写方式挂载。如果要确保整个群集中只有一个 Pod 可以读取或写入该 PVC,请使用 ReadWriteOncePod 访问模式。这仅支持 CSI 卷和 Kubernetes 版本 1.22+。
浏览文档以获得更多见解。