Elasticsearch旨在以集群模式运行,我所要做的就是通过环境变量在集群中定义相关的节点IP,只要网络连接可用,它就会连接并将其他节点连接到集群。
我有3个节点,1个充当docker swarm管理器,另外两个是worker。我已经初始化了管理器并加入了工作节点,从这个角度来看,一切看起来还不错。
现在我正在尝试以允许我将所有节点加入同一个弹性搜索集群的方式运行elasticsearch容器,但是,我希望节点使用其覆盖网络接口加入,这意味着我需要在运行docker service create
命令时知道容器内部IP地址,我该怎么做?我是否必须使用像领事这样的东西来实现这一目标?
一些澄清:
我需要知道,在为服务创建时,所有Elasticsearch参与者的IP地址(或DNS名称)都可以正确启动集群。这必须是在创建时而不是之后。另外,据我所知,我可以为所有服务公开端口9200/9300并使用外部机器IP并使其工作,但我想使用覆盖网络来完成所有这些通信(我认为这是什么群模式是为了。)
答案 0 :(得分:2)
这里只有部分解决方案。 因此,在将服务附加到自定义覆盖网络时,您确实可以访问Docker的自定义服务发现功能。在尝试将其与您的问题联系起来之前,我将详细介绍Docker Swarm模式的网络功能。
我将使用服务和任务的不同术语,其中服务可以是 elasticsearch ,而任务是该弹性搜索服务的单个实例。
我们的想法是,对于您创建的每个服务,docker会分配虚拟IP(VIP)和自定义DNS别名。您可以使用docker service inspect myservice
命令检索此VIP。
但是,有两种模式可以将服务附加到覆盖网络 dnsrr 和 VIP 。您可以使用--endpoint-mode
的{{1}}选项选择这些选项。
VIP模式(我相信它是默认模式,或者至少是最常用的模式)会影响虚拟IP到服务的dns别名。这意味着执行docker service create
将返回给您一个单独的vip,在幕后,将以循环方式链接到您的一个容器。但是,还有一个特殊的dns别名,可让您访问所有实例ips(所有任务ips ):nslookup servicename
。
因此,在VIP模式下,您可以使用简单的tasks.myservice
检索所有任务ips,其中myservice是服务名称。
另一种模式是dnsrr。此模式只是摆脱了VIP,并以循环方式将dns别名连接到不同的任务( =服务实例)。这样,您只需执行nslookup tasks.myservice
即可检索不同的服务实例ip。
好的,首先,我并不熟悉elasticsearch让你聚类的方式。根据我对您的问题的理解,您需要在运行elasticsearch二进制文件时,将其作为参数提供,以及需要与其进行聚类的其他节点的所有的地址。
所以我要做的是创建一个自定义Elasticsearch图像,可能是基于默认库中的图像,我将添加一个自定义nslookup myservice
,首先运行脚本来检索其他任务IP
我相信保持VIP模式适合您,因为有Entrypoint
个dns别名。然后,您需要解析输出以检索任务ip(并可能删除您的任务)。然后,您就可以将它们保存在配置文件环境变量中,或者将它们用作弹性搜索二进制文件的运行时选项。
修改:要创建自定义覆盖网络,您需要使用tasks.myservice
命令,并使用docker network create