我有一个ECS集群,有3个EC2实例,都位于私有子网中。我创建了一个任务定义来运行Confluent提供的kafka连接映像,并使用以下环境变量:
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实例之外成功地命中它。
我有一种感觉,我没有将CONNECT_REST_ADVERTISED_HOST_NAME
设置为正确的值。据我所知,这是客户端应该连接到的主机。然而,由于我的EC2实例在一个私有子网中,我不知道该将其设置为什么,这就是为什么我将它设置为localhost。我尝试将其设置为负载平衡器的DNS名称,但这不起作用。
您需要将CONNECT_REST_ADVERTISED_HOST_NAME
设置为主机或IP,其他Kafka Connect工作程序可以解析并连接到。
它用于工作程序之间的内部通信,如果是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/