我有一个 ECS 集群,其中包含 3 个 EC2 实例,全部位于私有(private)子网中。我创建了一个任务定义来运行 Confluence 提供的 kafka-connect 镜像,并使用以下环境变量:
CONNECT_CONFIG_STORAGE_TOPIC=quickstart-config
CONNECT_GROUP_ID=quickstart
CONNECT_INTERNAL_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
CONNECT_INTERNAL_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter
CONNECT_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
CONNECT_OFFSET_STORAGE_TOPIC=quickstart-offsets
CONNECT_PLUGIN_PATH=/usr/share/java
CONNECT_REST_ADVERTISED_HOST_NAME=localhost
CONNECT_REST_ADVERTISED_PORT=8083
CONNECT_SECURITY_PROTOCOL=SSL
CONNECT_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM=
CONNECT_STATUS_STORAGE_TOPIC=quickstart-status
CONNECT_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter
我在此集群前面有一个应用程序负载均衡器,并在端口 8083 上有一个监听器。我已正确设置目标组以包含运行 kafka-connect 的 EC2 实例。因此负载均衡器应该将请求转发到集群。确实如此,但我总是收到 502 Bad Gateway
响应。我可以 ssh 进入 EC2 实例并 curl localhost:8083
并从 kafka-connect 获取响应,但从 EC2 外部,我没有得到响应。
为了排除负载均衡器和集群之间的网络问题,我创建了一个在端口 80 上运行 Nginx 的单独任务定义,并且我能够通过负载均衡器从 EC2 实异常(exception)部成功访问它。
我感觉我没有将 CONNECT_REST_ADVERTISED_HOST_NAME
设置为正确的值。据我了解,这是客户端应该连接的主机。但是,因为我的 EC2 实例位于私有(private)子网中,所以我不知道将其设置为什么,这就是我将其设置为 localhost 的原因。我尝试将其设置为负载均衡器的 DNS 名称,但这不起作用。
最佳答案
您需要将 CONNECT_REST_ADVERTISED_HOST_NAME
设置为其他 Kafka Connect 工作线程可以解析和连接的主机或 IP。
它用于工作人员之间的内部通信,如果它是localhost
,那么如果您的 REST 请求(通过负载均衡器)命中了一个不是集群当前领导者的工作人员,该工作人员将尝试使用 CONNECT_REST_ADVERTISED_HOST_NAME 将请求转发给领导者。但是,如果CONNECT_REST_ADVERTISED_HOST_NAME
是localhost
,那么工作线程只会将请求转发给自己,因此事情将无法正常工作。
有关更多详细信息,请参阅 https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/
关于apache-kafka - 无法从 EC2 外部连接到 AWS 上运行的 kafka 连接集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965000/