我有一个ECS集群,其中有3个EC2实例都位于私有子网中。我创建了一个任务定义来运行Confluent提供的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
的回复。我可以进入EC2实例和curl localhost:8083
并从kafka-connect返回响应,但是从EC2外部,我没有响应。
要排除负载平衡器和群集之间的网络问题,我创建了一个单独的任务定义,该定义在端口80上运行Nginx,并且能够通过负载平衡器从EC2实例外部成功命中它。
我感到自己没有将CONNECT_REST_ADVERTISED_HOST_NAME
设置为正确的值。据我了解,这是客户端应连接的主机。但是,由于我的EC2实例位于专用子网中,因此我不知道将其设置为什么,这就是为什么将其设置为localhost的原因。我尝试将其设置为负载平衡器的DNS名称,但这不起作用。
答案 0 :(得分:1)
您需要将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/