如何在Kubernetes pods之间共享存储空间?

Mar*_*ina 40 docker google-cloud-platform kubernetes

我正在评估Kubernetes作为我们新应用程序的平台.现在,它看起来非常令人兴奋!但是,我遇到了一个问题:我在GCE上托管我的集群,我需要一些机制来在两个pod之间共享存储 - 连续集成服务器和我的应用服务器.使用kubernetes这样做的最佳方法是什么?没有任何卷类型似乎符合我的需要,因为如果一个pod需要写入磁盘,则无法共享GCE磁盘.NFS是完美的,但似乎需要kubernetes集群的特殊构建选项?

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

EDIT2:例如,这个页面描述了如何设置Elasticsearch集群,但是用永久存储连接起来是不可能的(如这里所述),这使得它毫无意义:(

Ian*_*her 27

回答这个问题有点迟,但根据我迄今为止Kubernetes/MSA的经验,这里的问题更多的是你的设计模式.在MSA中经常出现的基本设计模式之一是对服务进行适当的封装,其中还包括其数据.

您的服务应该关注与其关注领域相关的数据,并且与OOP非常相似,应该允许通过接口(API,PUBSUB消息等)访问此数据到其他服务.对数据的多服务访问是一种类似于OOP中的全局变量的反模式.

我认为Google也有同样的观点,这就是Kubernetes以这种方式建立的原因.

例如,如果您想要写日志,您应该拥有一个日志服务,每个服务可以使用它需要记录的相关数据来调用.直接写入共享磁盘意味着,如果更改了日志目录结构等,则需要更新每个容器,或者决定在错误上添加电子邮件等额外功能.

  • 问题是您尝试运行 ** 其他人的 ** 应用程序,而这些应用程序从一开始就没有遵守此准则。(我在看着你 *Magento*) (7认同)
  • 当有人遇到实际上很容易克服的绊脚石时,说“您应该重新构建您的软件以遵循 MSA 最佳实践”并没有多大帮助。这些最佳实践通常比仅使用文件系统复杂得多(因此容易出错)。 (3认同)
  • 我可以看到这个论点的有效性,但我想知道 Kubernetes 诸神希望我们如何运行 Rails、Laravel、Drupal、Wordpress 和其他一些东西?他们都喜欢以某种形式保存文件,这些文件必须在所有“服务器”(在本例中为 Pod)上共享。至于 GKE,遗憾的是您不能使用外部 NFS 磁盘,例如来自 Filestore 的 :-( (2认同)

小智 24

NFS是一个内置的卷插件,支持多个pod编写器.没有特殊的构建选项可以让NFS在Kube中运行.

我在Kubernetes的Red Hat工作,主要专注于存储.

  • AzureFile、CephFS、Glusterfs、Quobyte、(VsphereVolume) 和 PortworxVolume 也支持多个写入器,请参阅 https://kubernetes.io/docs/concepts/storage/persistent-volumes 上“访问模式”下的表格 (4认同)

Van*_*uan 14

首先。Kubernetes没有集成功能可以在主机之间共享存储。以下是几个选项。但是首先,如果您已经设置了一些卷,则如何共享存储。

要在多个Pod之间共享卷,您需要使用访问模式ReadWriteMany创建PVC。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
    name: my-pvc
spec:
    accessModes:
      - ReadWriteMany
    storageClassName: myvolume
    resources:
        requests:
            storage: 1Gi
Run Code Online (Sandbox Code Playgroud)

之后,您可以将其安装到多个Pod:

apiVersion: v1
kind: Pod
metadata:
  name: myapp1
spec:
  containers:
...
      volumeMounts:
        - mountPath: /data
          name: data
          subPath: app1
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: 'my-pvc'
---
apiVersion: v1
kind: Pod
metadata:
  name: myapp2
spec:
  containers:
...
      volumeMounts:
        - mountPath: /data
          name: data
          subPath: app2
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: 'my-pvc'
Run Code Online (Sandbox Code Playgroud)

当然,持久卷必须可以通过网络访问。否则,您需要确保所有吊舱都已调度到具有该卷的节点。

有几种适合于此的卷类型,并且与任何云提供商无关:

  • NFS
  • RBD(Ceph块设备)
  • 头文件
  • Glusterfs
  • Portworx卷

当然,要使用一个卷,您首先需要拥有它。也就是说,如果要使用NFS,则需要在K8s群集中的所有节点上设置NFS。如果要使用Ceph,则需要设置Ceph集群等。

开箱即用的唯一支持Kubernetes的卷类型是Portworks。有关如何在GKE中进行设置的说明。

为了在K8s中设置Ceph集群,有一个正在开发中的名为Rook的项目。

但是,如果您只希望一个节点中的文件夹在另一个节点中可用,这一切都是大材小用。在这种情况下,只需设置NFS服务器。这不会比配置其他卷类型难,并且将消耗更少的cpu /内存/磁盘资源。


San*_*esh 7

更新:最好的选择可能是 Cloud Filestore,一个托管的 NFS 系统。与仅支持上传/下载的 GCS 不同,这为您提供了对文件的完全随机读/写访问权限。请参阅此处的文档。

原文:你试过谷歌云存储吗?您甚至可以使用FUSE 适配器像网络磁盘一样映射它。


Chr*_*ski 5

如果您希望将日志写入磁盘,我建议您查看logspout https://github.com/gliderlabs/logspout。这将收集每个 pod 的日志记录,然后您可以使用 google 云平台相当新的使用 fludd 的日志记录服务。这样,每个 Pod 中的所有日志都会收集到一个位置。

如果数据通常会写入数据库或类似性质的数据,我建议在运行数据库的 kubernetes 集群之外拥有一个单独的服务器。

编辑

为了在 pod 之间共享文件,我建议将 google 云存储驱动器安装到 kubernetes 集群中的每个节点,然后将其设置为每个 pod 中的一个卷,该卷安装到节点上的已安装目录,而不是直接安装到驱动器。将其安装到每个节点是很好的,因为 Pod 不在指定节点上运行,因此在这种情况下最好将其集中化。