访问 k8 minikube 集群外的 kafka broker

Posted

技术标签:

【中文标题】访问 k8 minikube 集群外的 kafka broker【英文标题】:Access kafka broker outside k8 minikube cluster 【发布时间】:2018-07-23 06:19:51 【问题描述】:

我在我的 mac 上的 minikube k8 集群上的 Pod 上运行了一个landoop kafka 映像。我有 2 种不同的服务来公开模式注册表的端口 8081 和代理的 9092 端口。我已经在我的 NodePort 服务中映射了端口 8081 -> 30081 和 9092 -> 30092,以便我可以从集群外部访问它。 但是当我尝试运行控制台消费者或我的消费者应用程序时,Kafka 从不消费消息。 要验证代理 9092 端口在 k8 集群外是否可访问:

nc <exposed-ip> 30092, it says the port is open.

验证 Schema 注册表 8081 是否可访问:

curl -X GET http://192.168.99.100:30081/subjects

它返回可用的模式。

我有几个问题。 1)我们不能在k8集群之外以上述方式访问k8集群之外的Kafka吗?如果是这样,我在某种程度上做错了吗? 2)如果端口是开放的,是不是意味着broker可用?

任何帮助表示赞赏。谢谢

【问题讨论】:

一切看起来都正确。请分享您的消费者代码。 kafka-console-consumer --bootstrap-server 192.168.99.100:30092 --topic reddit_posts 从一开始我正在运行控制台消费者,30092 是我暴露的端口。 Reddit_posts 是已经有很多消息的主题。 您能分享您的服务定义吗? kubectl 描述 svc 您是否将 Kafka 代理中的广告侦听器配置为“192.168.99.100:30092”? 【参考方案1】:

如果不能直接从外部路由到 pod,从容器网络外部访问 Kafka 集群会相当复杂。

当您第一次连接到 Kafka 集群时,您会连接到单个代理,该代理会返回 Kafka 集群内所有代理和分区的列表。然后,Kafka 客户端使用该列表与特定主题所在的代理进行交互。

问题是代理列表默认包含 Kafka 代理的内部 IP。在您的情况下,这将是容器网络 ip。您可以通过在每个代理的配置中设置 advertised.listeners 来覆盖此值。

要使 Kafka 集群在 Kubernetes 外部可用,您需要为每个代理配置一个节点端口服务,并将每个代理的 advertised.listeners 设置设置为相应节点端口服务的外部 ip。但请注意,当您尝试从 Kubernetes 集群内部使用 Kafka 时,这会增加额外的延迟和故障点。

【讨论】:

好答案。在这里提出了类似的问题:***.com/a/44443308/2188893【参考方案2】:

您需要为 Kafka 设置广告侦听器。对于landoop docker 图像,这可以通过环境标志设置

-e ADV_HOST=192.168.99.100

【讨论】:

以上是关于访问 k8 minikube 集群外的 kafka broker的主要内容,如果未能解决你的问题,请参考以下文章

使用minikube快速部署k8s集群

云原生 Kubernetes基于 Minikube 搭建第一个k8s集群

一旦在 Kubernetes/Minikube 中,Kafka 就无法访问

Docker 与 K8S学习笔记(十四)—— Minikube的安装

K8S学习笔记Part1:使用端口转发访问集群内的应用

k8s 使用普通用户部署kafka2.4.0集群思路整理