【发布时间】:2019-11-14 11:58:06
【问题描述】:
我是 Kubernetes 新手,对 Kafka 也很陌生。
我的目标是让我的 Kafka Connect 实例正确连接到我的代理,以便它可以接收消息。
到目前为止,我已经创建了一个 Zookeeper 部署并将其包装在一个服务中。 (据我了解,Kafka 代理必须能够将 zookeeper 简称为“zookeeper:2181”。)
我曾希望设置 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>
【问题讨论】:
-
您能否添加一些有关您的
kafka-broker服务的详细信息? (kubectl describe svc kafka-broker) -
@Eduardo Baitello 已添加。
-
我还建议您阅读 Confluent 的这篇论文:Recommendations for Deploying Apache Kafka® on Kubernetes,尤其是
Traffic: How Do Clients Communicate with Individual Brokers?部分。请让我知道您使用上面建议的 FQDN 进行的测试。 -
@Eduardo Baitello 感谢您的参考。在我的
worker.properties文件中使用 FQDN 仍会导致 Connect 尝试使用 pod 名称。但是,根据您的参考,我认为解决方案可能是使用无头服务。我下次试试。