【问题标题】:In Kubernetes, Kafka Connect deployment is unable to connect to Kafka Broker service (diagram inside)在 Kubernetes 中,Kafka Connect 部署无法连接到 Kafka Broker 服务(内图)
【发布时间】: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 已添加。
  • 很好。因为它有一个IP,所以它是一个“普通”服务(非headless)。因此,我假设 kafka-broker-57b74c6766-d9w5j:9092 是从 advertised.listeners 代理配置返回的。请尝试通过更改您的bootstrap.servers 以使用FDQN 方法来尝试它是否有效(类似于kafka-broker.your-namespace.svc.cluster.local:9092)。
  • 我还建议您阅读 Confluent 的这篇论文:Recommendations for Deploying Apache Kafka® on Kubernetes,尤其是 Traffic: How Do Clients Communicate with Individual Brokers? 部分。请让我知道您使用上面建议的 FQDN 进行的测试。
  • @Eduardo Baitello 感谢您的参考。在我的 worker.properties 文件中使用 FQDN 仍会导致 Connect 尝试使用 pod 名称。但是,根据您的参考,我认为解决方案可能是使用无头服务。我下次试试。

标签: kubernetes apache-kafka


【解决方案1】:

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

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

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

【讨论】:

  • 如果 kafka 不是在 kubernetes 上而是在自己的服务器上运行怎么办,在这种情况下会出现什么问题?错误信息还是和上面的一样
【解决方案2】:

为了解决我的问题,我必须:

  • kafka-broker 部署更改为 StatefulSet。
  • 通过将spec.clusterIP 设置为"None",使kafka-broker 服务无头。

感谢@Eduardo Baitello 的指导!

【讨论】:

  • 如果 kafka 不是在 kubernetes 上而是在自己的服务器上运行怎么办,在这种情况下会出现什么问题?错误信息还是和上面的一样
猜你喜欢
  • 2021-08-28
  • 2020-08-14
  • 2018-11-04
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多