如何在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系统。
- 在Google云上部署应用程序时发生纱线错误
- 从Google Cloud Container Registry中提取Docker镜像时,权限被拒绝
- 在Docker中运行的Python / Flask中运行Vision API演示时的StatusCode.UNAUTHENTICATED
- Docker推到谷歌registry的速度令人难以置信
- 如何加快谷歌云平台上的bazel构build
- Kubernetes:如何从保存的检查点部署容器?
- Google Cloud实例上的独立kubelet持久磁盘安装
- 如何使用BitBucketpipe道在推送后更新Google云计算引擎实例?
- 自动重新启动Google Compute Engine上的Docker容器