如何在Kubernetes Pod之间共享存储?

我正在评估Kubernetes作为我们新应用的平台。 就目前而言,它看起来非常令人兴奋! 但是,我遇到了一个问题:我在GCE上托pipe我的集群,我需要一些机制来共享两个pod之间的存储 – 持续集成服务器和我的应用程序服务器。 用kubernetes做这个最好的方法是什么? 没有任何卷types似乎符合我的需求,因为如果一个群集需要写入磁盘,则无法共享GCE磁盘。 NFS将是完美的,但似乎需要kubernetes集群的特殊构build选项?

编辑:共享存储似乎是我现在使用Kubernetes多次遇到的问题。 有多个用例,我只想拥有一个卷并将其挂接到多个Pod(具有写权限)。 我只能假设这是一个常见的用例,不是吗?

编辑2:例如, 这个页面描述了如何build立一个Elasticsearch集群,但是用永久存储来连接它是不可能的( 如这里所描述的 ),这种描述使得它没有意义:(

有一点迟到回答这个问题,但从我到目前为止Kubernetes / MSA的经验,这里的问题更多的是在您的devise模式。 MSA中经常出现的一些基本devise模式之一就是对服务进行适当的封装,其中还包括其数据。

您的服务应该关注与其关注领域有关的数据,就像OOP一样,应该允许通过接口(API,PUBSUB消息等)将这些数据访问到其他服务。 多服务访问数据是一种类似于OOP中的全局variables的反模式。

我认为Google也有同样的观点,这就是为什么Kubernetes以这种方式成立的原因。

举个例子,如果你想在哪里写日志,你应该有一个日志服务,每个服务可以调用它需要logging的相关数据。 直接写入共享磁盘意味着你需要更新每个容器,如果你改变你的日志目录结构等或决定添加额外的function,如错误的电子邮件。

NFS是一个内置的卷插件,支持多个pod作者。 在Kube中没有特殊的构build选项可以使NFS工作。

我在Kubernetes的红帽工作,主要关注存储。

您是否尝试过Google云端存储 ? 您甚至可以使用FUSE适配器将其映射为networking磁盘。

如果是你想要写入磁盘的日志,我build议你看看logspout https://github.com/gliderlabs/logspout 。 这将收集每个吊舱的日志logging,然后你可以使用谷歌云平台的相当新的日志logging服务,使用fluentd。 这样,每个吊舱的所有日志都被收集到一个地方。

如果是通常写入数据库的数据或其他types的数据,则build议在运行数据库的kubernetes集群之外安装单独的服务器。

编辑

为了在pod中共享文件,我build议在你的kubernetes集群中的每个节点上安装一个谷歌云存储驱动器,然后将其设置为一个卷,将其挂载到节点上的挂载目录而不是直接连接到驱动器。 安装到每个节点是好的,因为pod不在指定的节点上运行,所以最好在这种情况下集中它。

你看过kubernetes 卷吗? 您可能正在创build一个gcePersistentDisk

gcePersistentDisk卷将Google计算引擎(GCE)永久磁盘安装到您的容器中。 与删除Pod时删除的emptyDir不同,PD的内容将被保留,而卷仅仅被卸载。 这意味着PD可以预先填充数据,并且数据可以在Pod之间“切换”。 重要提示:您必须使用gcloud或GCE API或UI创buildPD才能使用它使用gcePersistentDisk时有一些限制:运行Pod的节点必须是GCE VM,这些VM需要在同一个GCE项目中和PD作为PD的一个特点,就是它们可以被多个用户同时安装为只读。 这意味着您可以使用数据集预先填充PD,然后根据需要从多个Pod中并行提供。 不幸的是,PD只能由一个消费者以读写模式安装 – 不允许同时写入。 在由ReplicationController控制的pod上使用PD将会失败,除非PD是只读的或者副本计数是0或1。

为了支持来自各种豆荚的多次写入,您可能需要创build一个结实的节点或套接字types的服务来暴露readFromDisk和WriteToDisk方法。

@Marco – 关于Maven的相关问题,我的build议是停止将这看作一个集中存储问题,也许把它看作是一个服务问题。

我以前在HTTP下运行Maven仓库(只读)。 我只需创build一个Maven仓库,并通过它自己的pod(docker容器)中的Apache / Nginx公开它,然后使用服务发现将其链接到您的应用程序和构build系统。