在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://www.digitalocean.com/community/questions/kubernetes-readwritemany-or-the-same-effect),来个摘要,这位小哥正在寻找一个容器平台上运行WordPress的方案,需要在多个Pod上同时访问同一份数据(Master上可读可写,其它节点只读)。
?
人民的力量是巨大的,也不是没有解决方案,见下图(https://blog.openebs.io/setting-up-persistent-volumes-in-rwx-mode-using-openebs-142632244cb2?gi=1a701ed8e4bd), 我们看到它是利用类似于Re-Export的方式,将块存储暴露出NFS的接口来实现了。但它真的好吗? 暂且不说性能如何,这里存在着单点啊,因为图中的RWO卷只能挂载给一个NFS。
焱融YRCloudFile是一款专门针对容器场景开发的高性能分布式文件存储,天生的支持ReadWriteMany的读写方式,通过如下的拓扑结构,完美的解决了有状态应用WordPress的高可用结构,无论是共享的目录,还是MySQL数据库需要的存储目录,统一管理,高性能支持。
在下一篇文章中,作者将结合上图,以高可靠、高可扩展的WordPress架构为例,实际地演示如何结合焱融容器存储,部署基于ReadWriteMany读写模式的应用。
原文:https://blog.51cto.com/u_15191752/2951305