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

2023-11-24

我正在评估 Kubernetes 作为我们新应用程序的平台。现在看来,一切都非常令人兴奋!但是,我遇到了一个问题:我在 GCE 上托管集群,并且需要某种机制在两个 pod(持续集成服务器和我的应用程序服务器)之间共享存储。使用 kubernetes 执行此操作的最佳方法是什么?似乎没有一种卷类型能够满足我的需求,因为如果一个 pod 需要写入磁盘,则无法共享 GCE 磁盘。 NFS 是完美的,但似乎需要针对 kubernetes 集群的特殊构建选项?

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

编辑2:例如,这一页描述了如何设置 Elasticsearch 集群,但将其与持久存储连接起来是不可能的(如此处所述),这使得它毫无意义:(


首先,你是否really需要多个读者/作者?

根据我对 Kubernetes/微服务架构 (MSA) 的经验,这个问题通常与你的设计模式更相关。 MSA 的基本设计模式之一是服务的正确封装,其中包括每个服务拥有的数据。

与 OOP 非常相似,您的服务应该照顾与其关注领域相关的数据,并且应该允许其他服务通过接口访问这些数据。该接口可以是 API、直接处理或通过代理服务处理的消息,或者使用协议缓冲区和 gRPC。一般来说,对数据的多服务访问是一种反模式,类似于 OOP 和大多数编程语言中的全局变量。

例如,如果您希望写入日志,则应该有一个日志服务,每个服务都可以使用其需要记录的相关数据来调用该服务。直接写入共享磁盘意味着,如果您更改日志目录结构,或者决定添加额外的功能(例如针对某些类型的错误发送电子邮件),则需要更新每个容器。

在大多数情况下,您应该在使用文件系统之前使用某种形式的最小接口,以避免意外的副作用海仑定律您在使用文件系统时所接触到的。如果服务之间没有适当的接口/契约,您构建可维护和有弹性的服务的能力就会大大降低。

好的,您的情况最好使用文件系统来解决。有多种选择...

显然,有时可以处理多个并发写入器的文件系统可以提供比更“传统”MSA 形式的通信更优越的解决方案。 Kubernetes 支持大量卷类型,可以找到here。虽然此列表相当长,但其中许多卷类型不支持多个写入器(也称为ReadWriteMany在 Kubernetes 中)。

那些支持的卷类型ReadWriteMany可以找到这张桌子在撰写本文时,这是 Azure File、Ceph、Glusterfs、Quobyte、NFS 和 Portworx Volume。

还有一些运营商,例如流行的rook.io它们功能强大并提供了一些很棒的功能,但是当您只想要一个简单的解决方案并继续前进时,此类系统的学习曲线可能会很困难。

最简单的方法。

根据我的经验,最好的初始选择是 NFS。这是学习基本思想的好方法ReadWriteManyKubernetes 存储将服务于大多数用例,并且是最容易实现的。在您掌握了多服务持久性的应用知识后,您就可以做出更明智的决策来使用功能更丰富的产品,而这通常需要更多的工作来实施。

设置 NFS 的细节根据集群的运行方式和位置以及 NFS 服务的细节而有所不同,我之前写过两篇关于如何设置 NFS 的文章本地集群并使用 AWS NFS 等效项EKS 集群上的 EFS。这两篇文章很好地对比了如何根据您的特定情况使用不同的实现。

举个最低限度的例子,您首先需要一个 NFS 服务。如果您想要进行快速测试或者您的 SLO 要求较低,请执行以下操作这篇 DO 文章是在 Ubuntu 上设置 NFS 的快速入门指南。如果您现有的 NAS 提供 NFS 并且可以从集群访问,那么这也可以。

一旦有了 NFS 服务,您就可以创建类似于以下内容的持久卷:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-name
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  nfs:
    server: 255.0.255.0 # IP address of your NFS service
    path: "/desired/path/in/nfs"

这里需要注意的是,您的节点需要安装二进制文件才能使用 NFS,我在我的文章中详细讨论了这一点本地集群文章。这也是你的原因need在 EKS 上运行时使用 EFS,因为您的节点无法连接到 NFS。

设置持久卷后,使用它就像使用任何其他卷一样简单。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-name
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: p-name
          volumeMounts:
            - mountPath: /data
              name: v-name
      volumes:
        - name: v-name
          persistentVolumeClaim:
            claimName: pvc-name
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kubernetes Pod 之间共享存储? 的相关文章

随机推荐

  • TextEncodings.Base64Url.Decode 与 Convert.FromBase64String

    我正在致力于创建一种生成 JWT 令牌的方法 该方法的一部分从我的 web config 中读取一个值 该值作为 秘密 用于生成用于创建 JWT 令牌签名的哈希值
  • 删除 Firestore 集合中的所有文档

    我正在寻找一种方法来清除整个集合 我看到有一个批量更新选项 但这需要我知道集合中的所有文档 ID 我正在寻找一种方法来简单地删除集合中的每个文档 Edit 下面的答案是正确的 我使用了以下内容 func delete collection
  • mongodb打开连接问题

    我的 mongo 控制台中有以下日志 Tue Jul 23 17 20 01 301 initandlisten waiting for connections on port 27017 Tue Jul 23 17 20 01 401 w
  • 如何删除 VB.NET 中的事件处理程序[重复]

    这个问题在这里已经有答案了 可能的重复 VB NET RemoveHandler 和匿名方法 如果我添加这样的事件处理程序 AddHandler s Click AddressOf Panel1 Click 我怎样才能删除事件处理程序 Pr
  • Apache 2.4.37 与 openssl 1.1.1:无法执行握手后身份验证

    我将 apache 更新到最新版本 2 4 37 将 openssl 更新到 1 1 1 现在 当客户端进行身份验证时 我仅在 Firefox 63 中收到此错误 但在 Chrome 中则不会 ssl error AH verify cli
  • 使用子模块将 Git 推送到 azure 网站

    到目前为止 我已经通过 Git 将站点发布到 Windows Azure 网站 没有出现任何问题 但今天我们向项目添加了一个子模块 而 Azure 似乎不喜欢使用子模块 构建失败 因为我的应用程序依赖于子模块 而 Azure 看到的是空文件
  • 如何使用 get_posts 获取大于 X (ID) 的帖子

    args array numberposts gt 10 tag gt my tag ID gt 555 posts get posts args 我只想从特定标签中获取 10 条记录 并且 ID 小于数字 有没有办法用 get posts
  • 如何 $watch 指令中的多个内插属性?

    我不明白如何在链接函数中同时监视多个属性 因此我创建了一个包含所有参数的对象并监视它 但我注意到链接函数中的属性是一个字符串而不是一个对象 所以我使用 angular fromJson val 我发现的所有示例都只使用一个参数 您能解释一下
  • Symfony2 没有要处理的元数据类

    创建实体后 php app console doctrine generate entity 并在使用时 php app console doctrine schema update force 我遇到过 没有要处理的元数据类 Entity
  • 相对于 HTML 中的绝对路径

    我需要通过 URL 创建新闻通讯 为此 我 创建一个WebClient 使用WebClient的方法DownloadData获取字节数组中的页面源 从 source html 字节数组中获取字符串并将其设置为新闻通讯内容 但是 我在路径方面
  • PostSharp后pdb文件丢失

    我正在使用 PostSharp 版本 2 1 6 4 也尝试了最新版本 2 1 7 35 有时 pdb 文件丢失 并且其中有一个 pssym 文件
  • 拥有 SQLite 和多个表的自己的 ContentProvider

    我在读本教程关于实现我自己的 ContentProvide 以使用 SQLite 在 ContentProvider query 中 有一些事情让我困惑 它似乎非常硬编码为一张表 教程中的待办事项表 但也许我只是不明白 现在 如果我想查询另
  • Python-删除旧文件

    我对 python 有点陌生 一直在尝试自己解决这个问题 但到目前为止只得到了一些零碎的东西 基本上 我正在寻找一个脚本 它将递归搜索目录及其子目录 并删除至少 24 小时前的文件 但不会更改目录 非常感谢任何建议或示例 这使用了os wa
  • jQuery 真正支持哪些 CSS3 选择器,例如:第n个最后一个孩子()?

    根据http api jquery com category selectors 我们可以在 jQuery 中使用大量的 CSS 选择器 但是例如 nth last child 那里没有提到 然而 当我测试以下内容时 使用来自 Google
  • 生成固定长度整数分区的所有唯一排列的算法?

    我正在寻找一种生成整数固定长度分区的所有排列的算法 顺序并不重要 例如 对于 n 4 且长度 L 3 0 2 2 2 0 2 2 2 0 2 1 1 1 2 1 1 1 2 0 1 3 0 3 1 3 0 1 3 1 0 1 3 0 1 0
  • 单个 Git 存储库中的公共和私有代码

    我参与的一个研究小组目前将所有代码托管在一个私有 SVN 存储库中 我们想开放我们的代码并将大部分代码移至 Github 上 问题是 有些代码是敏感的 不应该开放 但我们仍然希望它处于版本控制之下 目前 我们在 Github 上有开放代码
  • WPF:PropertyChangedCallback 仅触发一次

    我有一个用户控件 它公开一个名为 VisibileItems 的 DependencyProperty 每次更新该属性时 我都需要触发另一个事件 为了实现这一点 我添加了带有 PropertyChangedCallback 事件的 Fram
  • 限制对 Elastic Beanstalk 的 HTTP 访问

    是否可以将对 Elastic Beanstalk 应用程序的 HTTP 访问限制为仅某些 IP 地址 我已尝试向环境的安全组添加规 则 但这些规则似乎没有任何效果 这是因为所有 HTTP 流量都是通过弹性负载均衡器路由的吗 isn t安全组
  • C# 继承和默认构造函数

    假设有一个基类A和一个班级B源自A 那么我们知道类的构造函数A永远不会被类继承B 然而 当一个新对象B创建 然后 类的默认构造函数A在类的默认 自定义构造函数之前调用B被调用 也许这样做的目的是类的字段A需要初始化为默认值 现在 假设该类A
  • 如何在 Kubernetes Pod 之间共享存储?

    我正在评估 Kubernetes 作为我们新应用程序的平台 现在看来 一切都非常令人兴奋 但是 我遇到了一个问题 我在 GCE 上托管集群 并且需要某种机制在两个 pod 持续集成服务器和我的应用程序服务器 之间共享存储 使用 kubern