在群集模式下运行Elasticsearch容器

Elasticsearch被devise为在集群模式下运行,我所要做的就是通过环境variables在集群中定义相关的节点IP,只要networking连接可用,它就会连接并将其他节点连接到集群。

我有3个节点,1个充当dockerpipe理员,另外两个是工作人员。 我已经初始化了pipe理器,并join了工作节点,从这个angular度来看,一切看起来都不错。

现在我试图以允许我将所有节点连接到同一个elasticsearch集群的方式运行elasticsearch容器,但是,我希望节点使用其覆盖networking接口进行连接,这意味着我需要知道容器运行docker service create命令时的内部IP地址,我该怎么做? 我必须使用领事这样的事情来达到这个目的吗?

一些澄清

在服务创build时,我需要知道所有Elasticsearch参与者的IP地址(或DNS名称),以便我可以正确启动群集。 这必须在创build时,而不是在之后。 此外,据我所知,我可以暴露端口9200/9300的所有服务,并与外部机器IP工作,并得到它的工作,但我想使用覆盖networking做所有这些通信(我认为这是什么swarm模式是)。

这里只是部分解决scheme。 因此,将服务附加到自定义覆盖networking时,确实可以访问Docker的自定义服务发现function。 我将详细介绍Docker Swarm模式的networkingfunction,然后尝试将其与您的问题联系起来。

我将使用服务任务的不同术语,其中服务可以是弹性search ,而任务是弹性search服务的单个实例

Dockernetworking

这个想法是,对于你创build的每个服务 ,docker分配一个虚拟IP(VIP)和一个自定义的dns别名。 您可以使用docker service inspect myservice命令检索此VIP。

但是,将服务附加到覆盖networkingdnsrrVIP有两种模式。 您可以使用--endpoint-mode docker service create--endpoint-mode选项来select这些选项。

VIP模式(我相信这是默认的,或者至less是最常用的),影响虚拟IP到服务的DNS别名。 这意味着执行nslookup servicename将返回给你一个单一的vip,在幕后,将以循环方式链接到你的一个容器。 但是,还有一个特殊的dns别名,可以让你访问所有的实例ips( 你的所有任务ips ): tasks.myservice

所以在VIP模式下,您可以使用简单的nslookup tasks.myservice检索所有任务ips,其中myservice是一个服务名称。

另一种模式是dnsrr。 这种模式简单地摆脱了VIP,并以循环方式将dns别名连接到不同的任务( =服务实例 )。 这样,你只需要做一个nslookup myservice来检索不同的服务实例ip。

Elasticsearch集群

好的,首先我不太了解elasticsearch让你聚类的方式。 从我所了解的问题中,您需要运行elasticsearch二进制文件时,将其作为一个参数,它需要与其他所有节点进行集群。

所以我要做的是创build一个自定义的Elasticsearch映像,可能是基于默认库中的一个,我将添加一个自定义的Entrypoint ,它将首先运行脚本来检索其他任务IP。

我相信,留在VIP模式适合你,因为有tasks.myservice dns别名。 然后你需要parsing输出来检索任务IP(可能会删除你的)。 然后,您可以将它们保存在configuration文件环境variables中,或者将它们用作您的elasticsearch二进制文件的运行时选项。

编辑 :要创build自定义覆盖networking,您需要使用--network docker network create命令,并使用--network docker service create--network选项docker service create

这个答案主要是基于Swarm模式的networking文档