当 elasticsearch 在容器中时,覆盖 `tcp.publish_port` 会破坏集群

Overriding `tcp.publish_port` breaks clustering when elasticsearch is in a container

我正在尝试 运行 一个 elasticsearch 集群,每个 es 节点 运行 都在自己的容器中。这些容器使用 ECS 部署在多台可能 运行 其他不相关容器的机器上。为了避免端口冲突,容器公开的每个端口都被分配了一个随机值。这些随机端口在所有 运行ning 相同类型的容器中是一致的。也就是说,所有运行ning es-node容器将9300端口映射到同一个随机数。

这是我正在使用的配置:

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 绑定的端口。我已经确认上面使用的所有环境变量都已正确设置。我还通过命令行参数将 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.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 然后 is using the default port 即 9300.

因此,IMO 无法在短时间内解决此问题。

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

我们可以为 Azure 和 EC2 做同样的事情。你想 open an issue 以便我们跟踪工作吗?