在 Kubenetes 体系内,针对每一个持久化存储卷,都有三种访问方式: ReadWriteOnce(RWO), ReadOnlyMany(ROX), ReadWriteMany(RWX)。
在当前的定义中,这三种方式都是针对节点级别的,也就是说,对于一个 Persistent Volume, 如果是RWO, 那么只能被挂载在某一个Kubernetes的工作节点(以下简称节点)上,当再次尝试在其他节点挂载的时候,系统会报Multi-Attach的错误(当然,在只有一台可调度节点的情况,即使RWO也是能够被多个Pod同时使用的,但除了开发测试,有谁会这么用呢?)
如果是RMX, 那么可以同时在多个节点上挂载并被不同的Pod使用。
在官方文档中(https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes),我们可以了解到目前存储支持ReadWriteMany的情况如下:
从列表中我们可以看到,只有文件类的存储能够支持ReadWriteMany, 而所有的块存储,无论是公有云,还是Ceph, iSCSI,都无法支持RWX。
那么RWX到底意味着什么? 对于用户的应用来说有什么影响呢? 我们以实际的一个应用WordPress为例,典型的拓扑结构如下:
多个WordPress实例之间需要一个共享的卷作为Uploads目录, 同时还需要一个MySQL服务。这个共享卷就是一个很典型的ReadWriteMany的需求,当WordPress实例需要快速横向扩展的时候,新扩展的实例可以直接访问到原有的用户上传的数据,不需要复制等操作,因为大家共享的是一份数据,这种需求对于不支持ReadWriteMany的块存储来说,就非常尴尬了。
也不是没有解决方案,见下图(https://blog.openebs.io/setting-up-persistent-volumes-in-rwx-mode-using-openebs-142632244cb2?gi=1a701ed8e4bd), 我们看到它是利用类似于Re-Export的方式,将块存储暴露出NFS的接口来实现了。
暂且不说性能如何,这里存在着单点,因为图中的RWO卷只能挂载给一个NFS。
0 评论