2016-11-21 40 views
12

Elasticsearch设计为以集群模式运行,我所要做的就是通过环境变量在集群中定义相关的节点IP,只要网络连接可用,它就会连接并加入集群的其他节点。以群模式运行Elasticsearch容器

我有3个节点,1个充当码头群管理员,另外两个是工作人员。我已经初始化了管理员并加入了工作节点,从这个角度来看,一切看起来都不错。

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

一些澄清

我需要知道,在服务创建时所有参与者Elasticsearch的IP地址(或DNS名称),这样我就可以正常启动群集。这必须在创建时,而不是在之后。此外,据我所知,我可以公开端口9200/9300的所有服务,并与外部机器IP协同工作,但我想使用覆盖网络来完成所有这些通信(我认为这是什么群集模式是)。

+0

此外领事那里也是Zookeeper和Etcd。 –

+0

@MattSchuchard我不能用群体的核心来做到这一点吗? *我*有*使用外部服务发现吗? –

+0

不知道;因此评论并没有回答。不要在乎我自己;更喜欢Mesosphere(Zookeeper)或Kubernetes(Consul/Etcd?)。 Swarm似乎对我来说太黑了。 –

回答

2

这里只有部分解决方案。 因此,将服务附加到自定义覆盖网络时,您确实可以访问Docker的自定义服务发现功能。我将详细介绍Docker Swarm模式的网络功能,然后再尝试将它与您的问题联系起来。

我将使用的服务任务,其中,服务可能是elasticsearch不同的期限,而任务是elasticsearch服务的单个实例

泊坞网络

的想法是,为创建的每个服务,码头工人分配一个虚拟IP(VIP),和一个自定义DNS别名。您可以使用docker service inspect myservice命令检索此VIP。

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

VIP模式(我相信它是默认的,或者至少是最常用的),会影响虚拟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二进制文件时将其作为参数,它需要与其他节点进行集群的地址全部

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

我相信,留在VIP模式适合你,因为有tasks.myservice DNS别名。然后你需要解析输出来检索任务ip(并可能删除你的)。然后,您可以将它们保存在配置文件环境变量中,或将它们用作您的elasticsearch二进制文件的运行时选项。

编辑:要创建一个自定义的覆盖网络,你将需要使用docker network create命令,并使用docker service create

--network选择这个答案,主要是基于该Swarm mode networking documentation

+1

这听起来像是一个有效的解决方案,感谢这篇文章,我会尽快尝试,让你知道它是如何发展的。 –

+0

现在运行一个名为'elastic'的服务和3个副本,每个机器上使用'--endpoint-mode vip'来测试,我在其中一个弹性容器中运行bash,但无法解决任何问题。如果我'ping弹性'或'ping <容器名>'或'ping node02.elastic'(node02是机器名之一),我会为所有这些命令'无法解析主机'。 –

+0

@OrWeinberger您可能还需要使用'docker network create mynet'创建自己的网络,并使用'docker service create'的'--network'选项将您的服务连接到这个网络。 – MagicMicky

相关问题