我是Kubernetes的新手,也是Kafka的新手。
我的目标是让我的Kafka Connect实例正确连接到我的Broker,以便它可以接收消息。
到目前为止,我已经创建了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
我已经创建了一个基于高山的吊舱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>
答案 0 :(得分:0)
当您连接到代理时,它会将自己作为主机名进行广告。取自https://rmoff.net/2018/08/02/kafka-listeners-explained/:
tl; dr:您需要将advertised.listeners(如果使用Docker映像,则设置为KAFKA_ADVERTISED_LISTENERS)到外部地址(主机/ IP),以便客户端可以正确连接。否则,他们将尝试连接到内部主机地址-如果无法访问该主机地址,则会出现问题。
在Kafka Broker上,将KAFKA_ADVERTISED_LISTENERS
env变量设置为服务的名称(kafka-broker
),它将把它通告给客户端,以便它们连接到正确的服务名称。
答案 1 :(得分:0)
要解决我的问题,我必须:
kafka-broker
部署更改为StatefulSet。kafka-broker
设置为spec.clusterIP
,使"None"
服务变得毫无头绪。 感谢@Eduardo Baitello的指导!