我正在编写一个要部署到Kubernetes的应用程序,我希望每个Pod都可以容纳在其中 与副本集中所有其他Pod的TCP连接,因此任何容器都可以通知另一个 在某些用例中的容器。如果添加了Pod,则应在其与所有对象之间创建新的连接 副本集中的其他Pod。
如何从给定的容器中打开到所有其他容器的TCP连接?即,我如何发现所有 他们的IP地址?
我有一个ClusterIP服务DNS名称,该名称通过选择器指向这些容器。 到目前为止,我已经考虑过尝试使用。例如,在服务器中反复打开与该DNS名称的TCP连接 循环,每次通过连接请求一个容器ID,至少在我至少说一遍后暂停 每个容器ID三个连接。然后大约每分钟重复一次,以获得新的吊舱 已添加。可以使用keepalive删除与已消失的Pod的连接。
有更好的方法吗?
如果有关系,我将使用Go编写此应用程序。
答案 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 Membership或Path cache之一。
一旦吊舱启动,它将与Zookeeper建立长期连接。这将用于跟踪当前可用的窗格。吊舱断开时,连接断开,因此列表中只有活动成员。
答案 2 :(得分:0)
如果上述吊舱之间的通讯不是该应用程序的主要功能,而是该应用程序需要此功能,则我强烈建议您不要重新发明轮子,而是使用第三方组件。
Redis看起来非常不错,尤其是Redis的Pub/Sub机制。
因此,所有Pod都将订阅Redis中的某个频道,并且当Pod想要通知其他人时,它只会在同一频道上发布一条消息。
Redis具有多种语言的客户端库,包括Go。也很容易通过其Helm chart部署到Kubernetes。