【问题标题】:Cannot connect to kafka connect cluster running on AWS from outside EC2无法从 EC2 外部连接到在 AWS 上运行的 kafka connect 集群
【发布时间】:2019-11-22 20:13:53
【问题描述】:

我有一个包含 3 个 EC2 实例的 ECS 集群,它们都位于私有子网中。我创建了一个任务定义来运行 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 的回复。我可以通过 ssh 进入 EC2 实例和 curl localhost:8083 并从 kafka-connect 获取响应,但是从 EC2 外部,我没有得到响应。

为了排除负载均衡器和集群之间的网络问题,我创建了一个在端口 80 上运行 Nginx 的单独任务定义,我能够通过负载均衡器从 EC2 实例外部成功地访问它。

我感觉我没有将CONNECT_REST_ADVERTISED_HOST_NAME 设置为正确的值。据我了解,这是客户端应该连接的主机。但是,因为我的 EC2 实例位于私有子网中,所以我不知道将其设置为什么,这就是我将其设置为 localhost 的原因。我尝试将其设置为负载均衡器的 DNS 名称,但这不起作用。

【问题讨论】:

    标签: apache-kafka amazon-ecs apache-kafka-connect


    【解决方案1】:

    您需要将CONNECT_REST_ADVERTISED_HOST_NAME 设置为其他 Kafka Connect 工作人员可以解析和连接到的主机或 IP

    它用于worker之间的内部通信,如果它是localhost,那么如果你的REST请求(通过你的负载均衡器)命中了一个不是集群当前leader的worker,那个worker将尝试转发请求给领导者——使用CONNECT_REST_ADVERTISED_HOST_NAME。但是如果CONNECT_REST_ADVERTISED_HOST_NAMElocalhost,那么worker 将简单地将请求转发到它自己,因此事情将无法正常工作。

    更多详情见https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/

    【讨论】:

    • 感谢您的洞察力。我唯一的问题是我的集群中是否只有 1 个 EC2 实例(自从发布此问题以来,出于调试原因,我已将 3 个 EC2 实例缩减为 1 个),并且我将 CONNECT_REST_ADVERTISED_HOST_NAME 设置为 localhost,不应该这个工作?尝试从 EC2 实例外部连接时,我仍然收到 502 Bad Gateway 错误。
    • 是的,但是如果你只有一个工作人员,你需要负载均衡器吗?
    • 有什么更新吗?你找到解决办法了吗?
    • @RobinMoffatt 如果我想要一个 3 节点集群 - 每个实例是否应该有不同的 CONNECT_REST_ADVERTISED_HOST_NAME?例如 - 连接节点 1、连接节点 2、连接节点 3?
    • 我在 ECS 上运行,将以下内容添加到在容器启动时运行的脚本中似乎可以修复它:TASK=$(hostname -i) CONNECT_REST_ADVERTISED_HOST_NAME=$TASK /etc/confluent/docker/run 它基于github.com/aws-samples/amazon-ecs-fargate-workshop-dev-ops-data/… 我使用了hostname -i,因为我无法在服务器上安装 jq
    猜你喜欢
    • 2020-08-14
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2016-12-09
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多