副本集中所有Pod之间的消息传递

时间:2019-12-19 21:22:53

标签: networking kubernetes

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

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

我有一个ClusterIP服务DNS名称,该名称通过选择器指向这些容器。 到目前为止,我已经考虑过尝试使用。例如,在服务器中反复打开与该DNS名称的TCP连接 循环,每次通过连接请求一个容器ID,至少在我至少说一遍后暂停 每个容器ID三个连接。然后大约每分钟重复一次,以获得新的吊舱 已添加。可以使用keepalive删除与已消失的Pod的连接。

有更好的方法吗?

如果有关系,我将使用Go编写此应用程序。

3 个答案:

答案 0 :(得分:1)

  

例如,循环重复地打开与该DNS名称的TCP连接,每次在该连接上请求一个容器ID,在我说出每个容器ID至少三个连接时暂停。然后大约每分钟重复一次,以获取已添加的新Pod。

这听起来不是很可靠的解决方案。

Kubernetes不会提供您正在寻找的现成功能。

检测豆荚

一个可能的解决方案是查询Kubernetes API Server,查找与您的选择器(标签)匹配的Pod。使用client-go并查看例如example on how to list Pods。您可能需要监视以查找新的广告连播,或定期查询。

连接到豆荚

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

答案 1 :(得分:0)

一个更简单的解决方案是使用Zookeeper对当前活动的Pod进行簿记。 Zookeeper是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务。

Kafka等组件用于领导者选举,小组成员资格等。

您可以使用食谱Group MembershipPath cache之一。

一旦吊舱启动,它将与Zookeeper建立长期连接。这将用于跟踪当前可用的窗格。吊舱断开时,连接断开,因此列表中只有活动成员。

答案 2 :(得分:0)

如果上述吊舱之间的通讯不是该应用程序的主要功能,而是该应用程序需要此功能,则我强烈建议您不要重新发明轮子,而是使用第三方组件。

Redis看起来非常不错,尤其是Redis的Pub/Sub机制。

因此,所有Pod都将订阅Redis中的某个频道,并且当Pod想要通知其他人时,它只会在同一频道上发布一条消息。

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