从本地docker for mac中部署的服务(包括kubernetes扩展)中访问本地kafka

unhi4e5o  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(493)

我在本地做osx。
我在本地模式下使用Kafka和zookeeper。意思是Kafka装置里的Zookeeper。单节点群集。
两者都在环回本地主机上工作 zookeeper.connect=localhost:2181 我的 /etc/host 如下所示:

127.0.0.1         localhost MaatPro.local  
255.255.255.255   broadcasthost  
::1               localhost MaatPro.local  
fe80::1%lo0       localhost MaatPro.local

我的机器上设置了mac的docker,带有kubernetes扩展。
我的设想
我有一个停靠的akka流微服务,它从外部数据库读取数据,并将其写入kafka主题。它用作引导服务器: "localhost:9092" 问题
当我在我的机器上直接运行我的服务时(例如命令行或从intellij内部),一切都正常。在本地docker或kubernetes上运行时,出现以下错误: (o.a.k.clients.NetworkClient) [Producer clientId=producer-1] Connection to node 0 could not be established. The broker may not be available. 使用kubernetes,我构建了以下yaml文件来部署我的pod:

apiVersion: v1
kind: Pod
metadata:
  name: fetcher
spec:
  hostNetwork: true
  containers:
   - image: entellectextractorsfetchers:0.1.0-SNAPSHOT
     name: fetcher

我采取了预防措施设置了hostnetwork:true
直接使用docker守护程序,我最初也尝试将网络设置为主机,但发现这不适用于docker for mac。因此,我放弃了这条路线。我明白这与虚拟化有关。
1) docker出现的虚拟化问题是否与我的本地kubernetes相同?基本上,主机网络是虚拟机而不是我的mac?
2) 我尝试更改我的代码,并将以下地址添加为引导服务器:host.docker.internal,如文档所示。但问题依然存在。根本的问题是我正在处理一个环回地址吗?我真的要用我的网络地址吗?host.docker.internal指向哪个地址?如何使它与环回地址一起工作?如果我完全离开了,你知道我需要实施什么才能让它工作吗?
非常感谢你的帮助。

qvtsj1bj

qvtsj1bj1#

遵循@maatdeamon的方法,我只做了下面的事情,它对我有效。

advertised.listeners=PLAINTEXT://:9092

在应用程序配置属性中

localhost:9092,host.docker.internal:9092
cczfrluj

cczfrluj2#

基于@cricket\u007指南kafka listeners-解释和我在这里和那里读到的许多关于这个问题的文章,包括我想从容器连接到主机上的服务程序的docker官方文档
我想出了以下解决办法。
我在默认的本地kafka配置(即server.properties)中添加了以下内容

listeners=EXTERNAL://0.0.0.0:19092,INTERNAL://0.0.0.0:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=INTERNAL://127.0.0.1:9092,EXTERNAL://docker.for.mac.localhost:19092
inter.broker.listener.name=INTERNAL

其实外界在这里,预计将是docker网络。此配置仅用于本地开发的osx机器。我不希望人们连接到我的笔记本电脑使用我当地的Kafka,因此我可以使用 EXTERNAL://docker.for.mac.localhost:19092. 这是我在docker/kube集装箱上的广告。在该网络中,可以访问docker.for.mac.localhost。
注意,这可能不适用于minikube。这是特定于docker for mac的。我在我的机器上运行的kubernetes是docker for mac,而不是minikube。
最后,在我的代码中,我在一个列表中使用了这两种方法

"localhost:9092, docker.for.mac.localhost:19092"

我使用typesafe配置,因此在prod中,env变量会删除它。如果未指定env变量,则使用此变量。当我从intellij运行我的微服务时 localhost:9092 已使用。那是因为在这种情况下,我和我的Kafka/Zookeeper在同一个网络里。但是当我从docker/kube运行相同的微服务时 docker.for.mac.localhost:19092 已使用。
回答我的附带问题
对。docker for mac将hyperkit用作一个轻量级虚拟机,在其上运行linux,并在其上运行docker引擎。docker for mac kubernetes扩展基本上是关于在docker守护进程中将kubernetes集群服务/基础设施作为容器运行的。docker for mac与docker工具箱。换句话说,主机是hyperkit而不是osx。但正如上面的文档所解释的,dockerformac的实现就是要让用户觉得osx和docker之间没有虚拟化。
使用环回地址连接到主机是一个尚未解决的问题。即使主机是linux,我也不确定它是否完美。不确定,现在可能已经解决了。尽管如此,它仍需要运行一个映像,声明kube的容器或pod在主机网络上。但在docker for mac中,基于我的在线阅读,这种功能永远不会起作用。因此,使用docker.for.mac.localhost或host.docker.internal的解决方案是,docker for mac设置为引用mac主机而不是hyperkit主机。
host.docker.internal和docker.for.mac.localhost是相同的,此时最新的建议是host.docker.internal。话说回来,这个地址本来不适合我,因为我的Kafka设置不好。值得准备@criket\u 007链接来理解这一点http://rmoff.net/2018/08/02/kafka-listeners-explained.

相关问题