【问题标题】:Message-passing between all pods in a replica set副本集中所有 pod 之间的消息传递
【发布时间】:2020-04-12 11:34:36
【问题描述】:

我正在编写一个要部署到 Kubernetes 的应用程序,我希望每个 pod 都在其中保存 与副本集中所有其他 pod 的 TCP 连接,因此任何容器都可以通知另一个容器 某些用例中的容器。如果添加了一个 pod,应该在它和所有的 pod 之间创建一个新的连接 副本集中的其他 pod。

如何从给定的 pod 中打开与所有其他 pod 的 TCP 连接?即,我如何发现所有 他们的 IP 地址?

我有一个 ClusterIP 服务 DNS 名称,它通过选择器指向这些 pod,这就是机制 到目前为止,我一直在尝试使用。例如,重复打开一个到该 DNS 名称的 TCP 连接 循环,每次都通过连接请求容器 ID,至少在我说完时暂停 每个容器 ID 的三个连接。然后每隔一分钟左右重复一次以获得新的豆荚 已添加。 keepalive 可用于删除与已消失的 pod 的连接。

有没有更好的方法?

如果重要的话,我正在用 Go 编写这个应用程序。

【问题讨论】:

    标签: networking kubernetes


    【解决方案1】:

    例如,在循环中重复打开到该 DNS 名称的 TCP 连接,每次都通过连接请求容器 ID,当我为每个容器 ID 获得至少三个连接时暂停。然后每隔一分钟左右重复一次以获取已添加的新 pod。

    这听起来不像是一个可靠的解决方案。

    Kubernetes 确实提供您正在寻找的开箱即用功能。

    检测 pod

    一种可能的解决方案是查询 Kubernetes API 服务器,以获取与您的 选择器(标签)匹配的 pod。使用client-go 并查看例如example on how to list Pods。您可能希望观看新的 pod,或定期查询。

    连接到 Pod

    当您知道要连接的 pod 的名称时,您可以使用DNS to connect to pods

    【讨论】:

      【解决方案2】:

      如果提到的 pod 之间的通信不是此应用程序的主要功能,而是应用程序需要此功能,我强烈建议不要重新发明轮子并使用 3rd 方组件。

      Redis 看起来是一个非常好的候选者,尤其是 Redis 的Pub/Sub 机制。

      所以,所有的 Pod 都会订阅 Redis 中的某个频道,当一个 Pod 想要通知其他人时,它会简单地在同一个频道上发布一条消息。

      Redis 拥有多种语言的客户端库,包括 Go。通过Helm chart 也很容易部署到 Kubernetes。

      【讨论】:

        【解决方案3】:

        更简单的解决方案是使用 Zookeeper 来记录当前活动的 pod。 Zookeeper 是用于维护配置信息、命名、提供分布式同步和提供组服务的集中式服务。

        它被 Kafka 等组件用于领导选举、组成员资格等。

        您可以使用Group MembershipPath cache 配方之一。

        一旦 pod 出现,它就会与 Zookeeper 建立长时间运行的连接。这将用于跟踪当前可用的 pod。当 pod 关闭时,连接消失,因此列表中只有活动成员。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-18
          • 2016-04-30
          • 2021-09-22
          • 2012-03-02
          • 1970-01-01
          • 2012-10-06
          相关资源
          最近更新 更多