在Kubernetes中,Kafka Connect部署无法连接到Kafka代理服务(图中)

在Kubernetes中,Kafka Connect部署无法连接到Kafka代理服务(图中),kubernetes,apache-kafka,Kubernetes,Apache Kafka,我对库伯内特斯不熟悉,对卡夫卡也不熟悉 我的目标是让我的Kafka Connect实例正确连接到我的代理,以便它能够接收消息 到目前为止,我已经创建了Zookeeper部署,并将其打包到一个服务中。(据我所知,卡夫卡经纪人有必要将zookeeper简称为“zookeeper:2181”。) 我曾希望设置Kafka Connect实例也会一样简单。我将我的代理包装在一个服务中,并按名称将我的Connect实例指向它 工人财产 但是,Connect崩溃时出现此异常: java.io.IOExcep

我对库伯内特斯不熟悉,对卡夫卡也不熟悉

我的目标是让我的Kafka Connect实例正确连接到我的代理,以便它能够接收消息

到目前为止,我已经创建了Zookeeper部署,并将其打包到一个服务中。(据我所知,卡夫卡经纪人有必要将zookeeper简称为“zookeeper:2181”。)

我曾希望设置Kafka Connect实例也会一样简单。我将我的代理包装在一个服务中,并按名称将我的Connect实例指向它

工人财产

但是,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
我已经创建了一个基于阿尔卑斯山的pod,我可以成功地
curl-v kafka broker:9092
。但这不是Connect试图解析的地址。它正在尝试解析
kafka-broker-57b74c6766-d9w5j:9092
,就像Connect一样,我无法解析。我不确定Connect为什么要联系特定的pod,因为这正是Kubernetes服务应该防止的问题(无论如何,在我有限的理解中)

如何让Connect与代理正确通信


以下是kubectl Descripte 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>
名称:卡夫卡经纪人
名称空间:默认值
标签:
注释:
选择器:app=kafka经纪人
类型:集群
IP:10.108.61.90
端口:9092/TCP
目标端口:9092/TCP
终点:172.17.0.7:9092
会话关联:无
活动:

当您连接到代理时,它将自己作为其主机名进行广告。摘自:

tl;dr:您需要将adverted.listeners(或KAFKA_adverted_listeners,如果您使用Docker映像)设置为外部地址(主机/IP),以便客户端可以正确连接到它。否则,他们将尝试连接到内部主机地址——如果无法访问,则会出现问题


在Kafka Broker上,将
Kafka_advised_侦听器
env变量设置为服务的名称(
Kafka Broker
),它将向客户端播发该名称,以便客户端连接到正确的服务名称。

连接到代理时,它将自己作为其主机名播发。摘自:

tl;dr:您需要将adverted.listeners(或KAFKA_adverted_listeners,如果您使用Docker映像)设置为外部地址(主机/IP),以便客户端可以正确连接到它。否则,他们将尝试连接到内部主机地址——如果无法访问,则会出现问题


在Kafka Broker上,将
Kafka\u advised\u侦听器
env变量设置为服务的名称(
Kafka Broker
),它将向客户发布该变量,以便他们连接到正确的服务名称。

要解决我的问题,我必须:

  • kafka代理部署更改为StatefulSet
  • 通过将
    spec.clusterIP
    设置为
    “无”
    ,使
    kafka代理
    服务无头

感谢@Eduardo Baitello的指导

要解决我的问题,我必须:

  • kafka代理部署更改为StatefulSet
  • 通过将
    spec.clusterIP
    设置为
    “无”
    ,使
    kafka代理
    服务无头

感谢@Eduardo Baitello的指导

您能否添加一些有关您的
kafka经纪人
服务的详细信息?(
kubectl描述svc卡夫卡经纪人
)@Eduardo Baitello Added.Fine。因为它有一个
IP
,所以它是一个“正常”服务(非-)。因此,我假设
kafka-broker-57b74c6766-d9w5j:9092
是从
播发的.listeners
代理配置返回的。请尝试一下,将您的
bootstrap.servers
更改为使用一种方法来查看它是否有效(类似于
kafka broker.your namespace.svc.cluster.local:9092
)。我还建议您阅读Confluent:,特别是
流量:客户端如何与各个代理通信?
部分。请让我知道您使用上述FQDN进行的测试。@Eduardo Baitello感谢您的参考。在my
worker.properties
文件中使用FQDN仍然会导致Connect尝试使用pod名称。然而,根据您的参考,我认为解决方案可能是使用无头服务。我下一步会试试。你能添加一些关于你的
kafka经纪人
服务的详细信息吗?(
kubectl描述svc卡夫卡经纪人
)@Eduardo Baitello Added.Fine。因为它有一个
IP
,所以它是一个“正常”服务(非-)。因此,我假设
kafka-broker-57b74c6766-d9w5j:9092
是从
播发的.listeners
代理配置返回的。请尝试一下,将您的
bootstrap.servers
更改为使用一种方法来查看它是否有效(类似于
kafka broker.your namespace.svc.cluster.local:9092
)。我还建议您阅读Confluent:,特别是
流量:客户端如何与各个代理通信?
部分。请让我知道您使用上述FQDN进行的测试。@Eduardo Baitello感谢您的参考。在my
worker.properties
文件中使用FQDN仍然会导致Connect尝试使用pod名称。然而,根据您的参考,我认为解决方案可能是使用无头服务。如果卡夫卡不是在kubernetes上运行,而是在它自己的服务器上运行,那么在这种情况下会出现什么问题呢?错误消息仍然与上面的消息相同。如果kafka不是在kubernetes上运行,而是在它自己的服务器上运行,那么在这种情况下会出现什么问题?错误消息仍然与上面的消息相同如果kafka没有运行该怎么办
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>