以群集模式运行Elasticsearch容器

Or *_*ger 13 docker docker-swarm

Elasticsearch旨在以集群模式运行,我所要做的就是通过环境变量定义集群中的相关节点IP,只要网络连接可用,它就会连接并将其他节点连接到集群.

我有3个节点,1个充当docker swarm管理器,另外两个是worker.我已经初始化了管理器并加入了工作节点,从这个角度看,一切都很好.

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

一些澄清:

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

Mag*_*cky 2

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

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

Docker 网络

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

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

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

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

另一种模式是dnsrr。这种模式简单地摆脱了 VIP,并以循环方式将 dns 别名连接到不同的任务( =服务实例)。这样,您只需执行 anslookup myservice即可检索不同的服务实例 ip。

Elasticsearch集群

好吧,首先我不太熟悉 Elasticsearch 集群的方式。根据我从您的问题中了解到的,您需要在运行elasticsearch二进制文件时,将其作为参数提供,即它需要集群的所有其他节点的地址。

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

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

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

这个答案主要基于Swarm 模式网络文档