kubernetes - 在Kubernetes中,Kafka Connect部署无法连接到Kafka Broker服务(内部图)

标签 kubernetes apache-kafka

我是Kubernetes的新手,也是Kafka的新手。

我的目标是让我的Kafka Connect实例正确连接到我的Broker,以便它可以接收消息。

到目前为止,我已经创建了Zookeeper部署并将其包装在服务中。 (据我了解,Kafka经纪人必须能够将zookeeper简称为“zookeeper:2181”。)

Minikube diagram

我曾希望设置Kafka Connect实例将同样简单。我将经纪人包装在服务中,并按名称指向我的Connect实例。

worker.properties

bootstrap.servers=kafka-broker:9092

但是,Connect崩溃并带有以下异常:
java.io.IOException: Can't resolve address: kafka-broker-57b74c6766-d9w5j:9092
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235)
    at org.apache.kafka.common.network.Selector.connect(Selector.java:214)
    at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864)
    at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265)
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.sendEligibleCalls(KafkaAdminClient.java:889)
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.run(KafkaAdminClient.java:1104)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.nio.channels.UnresolvedAddressException
    at java.base/sun.nio.ch.Net.checkAddress(Net.java:130)
    at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:675)
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233)
    ... 6 more

我已经创建了一个基于 Alpine 的pod as described here,并且可以成功curl -v kafka-broker:9092。但这不是Connect试图解决的地址。它正在尝试解析kafka-broker-57b74c6766-d9w5j:9092,就像Connect一样,我无法解析。我不确定为什么Connect会尝试联系特定的Pod,因为这正是Kubernetes服务应该避免的确切问题(无论如何,我还是以有限的理解)。

如何使Connect正确地与代理通信?

这是kubectl describe svc kafka-broker的输出:
Name:              kafka-broker
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=kafka-broker
Type:              ClusterIP
IP:                10.108.61.90
Port:              <unset>  9092/TCP
TargetPort:        9092/TCP
Endpoints:         172.17.0.7:9092
Session Affinity:  None
Events:            <none>

最佳答案

当您连接到代理时,它会在宣传自己的主机名。取自https://rmoff.net/2018/08/02/kafka-listeners-explained/:

tl;dr : You need to set advertised.listeners (or KAFKA_ADVERTISED_LISTENERS if you’re using Docker images) to the external address (host/IP) so that clients can correctly connect to it. Otherwise they’ll try to connect to the internal host address–and if that’s not reachable then problems ensue.



在Kafka Broker上,将KAFKA_ADVERTISED_LISTENERS env变量设置为服务的名称(kafka-broker),它将把它通告给客户端,以便它们连接到正确的服务名称。

关于kubernetes - 在Kubernetes中,Kafka Connect部署无法连接到Kafka Broker服务(内部图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876133/

相关文章:

java - Flink 将 csv 文件映射到元组中

docker - 一个简单的单体应用是否需要 Kubernetes 来管理

docker - 通过 NodePort 导出服务

scala - Spark Structured Streaming with Kafka - 如何重新分区数据并在工作节点之间分配处理

spring - 我可以使用 Spring WebFlux 实现通过 Kafka 请求/响应主题获取数据的 REST 服务吗?

mysql - Kafka 到数据库数据流水线

go - 使用 Kubernetes go-client 向 Pod 添加标签的最短方法是什么

docker - Kubernetes 在现有目录上挂载卷,其中包含容器内的文件

go - 如何从远程机器连接到kubernetes pod?

java - Kafka Avro 序列化程序 : org. apache.avro.AvroRuntimeException:未打开