当elasticsearch位于容器中时,覆盖`tcp.publish_port`会中断群集

我试图运行一个elasticsearch集群,每个es-node运行在自己的容器中。 这些容器在多台机器上使用ECS进行部署,这些机器可能正在运行其他不相关的容器。 为了避免端口冲突,一个容器暴露的每个端口被分配一个随机值。 这些随机端口在所有相同types的正在运行的容器中是一致的。 换句话说,所有正在运行的es-node容器都将端口9300映射到相同的随机数。

这里是我使用的configuration:

network: host: 0.0.0.0 plugin: mandatory: cloud-aws cluster: name: ${ES_CLUSTER_NAME} discovery: type: ec2 ec2: groups: ${ES_SECURITY_GROUP} any_group: false zen.ping.multicast.enabled: false transport: tcp.port: 9300 publish_port: ${_INSTANCE_PORT_TRANSPORT} cloud.aws: access_key: ${AWS_ACCESS_KEY} secret_key: ${AWS_SECRET_KEY} region: ${AWS_REGION} 

在这种情况下, _INSTANCE_PORT_TRANSPORT是9300绑定在主机上的端口。 我已经确认上面使用的所有环境variables都是正确设置的。 我还通过命令行arg将network.publish_host设置为主机的本地IP。

当我强制_INSTANCE_PORT_TRANSPORT (反过来transport.publish_port )为9300时,一切运行良好,但只要给定一个随机值,节点就不能再相互连接了。 我看到这样的错误使用logger.discovery=TRACE

 ConnectTransportException[[][10.0.xxx.xxx:9300] connect_timeout[30s]]; nested: ConnectException[Connection refused: /10.0.xxx.xxx:9300]; at org.elasticsearch.transport.netty.NettyTransport.connectToChannelsLight(NettyTransport.java:952) at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:916) at org.elasticsearch.transport.netty.NettyTransport.connectToNodeLight(NettyTransport.java:888) at org.elasticsearch.transport.TransportService.connectToNodeLight(TransportService.java:267) at org.elasticsearch.discovery.zen.ping.unicast.UnicastZenPing$3.run(UnicastZenPing.java:395) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) 

看起来像一个节点绑定到的端口与它尝试连接到其他节点时ping的端口是一样的。 有什么办法让他们不同? 如果没有, transport.publish_port什么意思?

discovery-ec2插件的工作方式是使用AWS EC2 API收集IP地址列表,并将此列表用作单播节点列表。

但它不会从正在运行的集群收集任何信息。 显然这个节点还没有连接! 所以它不知道其他节点的publish_port

它只是添加一个IP地址。 就这样。 Elasticsearch然后使用 9300 的默认端口 。

所以没有什么可以做IMO在短时间内解决这个问题。

但是我们可以想象添加一个与Google Compute Engine已经实现的function相近的新function。 我们正在使用特定的元数据从GCE API获取此端口。

我们可以为Azure和EC2做同样的事情。 你想打开一个问题,所以我们可以跟踪的努力?