从本地 Docker For Mac 中部署的服务中访问本地 Kafka(包括 Kubernetes 扩展)

Accessing Local Kafka from within Services deployed in Local Docker For Mac (incl. Kubernetes extension)

zookeeper.connect=localhost:2181

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

我的场景

"localhost:9092"

问题

(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 相同吗?基本上,主机网络是虚拟 machine 而不是我的 mac?

2) 我尝试更改我的代码并根据文档将以下地址添加为 bootstrap 服务器:host.docker.internal。但问题仍然存在。根本问题是我正在处理环回地址吗?我真的应该在我的网络地址上工作吗? host.docker.internal 指向哪个地址?我怎样才能让它与环回地址一起工作?如果我完全离开了,知道我需要实施什么才能使它正常工作吗?

非常感谢您对此提供的任何帮助。

基于@cricket_007指导Kafka Listeners - Explained and the many read I have had here and there over this issue, including the official docker documentation I Want to connect from a container to a servicer on the host

我想出了以下解决方案。

我将以下内容添加到我的默认本地 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 machine 用于我的本地开发目的。我不希望连接到我的笔记本电脑的人使用我的本地 kafka,因此我可以使用 EXTERNAL://docker.for.mac.localhost:19092. 这是在 docker/kube 中向我的容器宣传的内容。从该网络内,docker.for.mac.localhost 是可达的。

请注意,这可能不适用于 Minikube。这特定于 Docker For Mac。我 运行 在我的 machine 上安装的 kubernetes 是 docker 用于 mac 而不是 minikube。

最后在我的代码中,我在列表中同时使用了两者

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

我使用 typeSafe 配置,因此在产品中,这会被 env 变量擦除。当未指定 env 变量时,这就是所使用的。当我 运行 使用来自 Intellij localhost:9092 的微服务时。那是因为在那种情况下,我和 machine 中的 kafka/zookeeper 在同一个网络中。但是,当我 运行 使用来自 docker/kube docker.for.mac.localhost:19092 的相同微服务时。

我的附带问题的答案

  1. 是的。 Docker for Mac 使用HyperKit作为轻量级虚拟machine,运行在其上安装linux,Docker引擎为运行 就可以了。 MAC Kubernetes 扩展的 Docker 基本上是关于 运行ning kubernetes 集群 Services/infrastructure 作为 docker 守护进程中的容器。 Docker for Mac vs. Docker Toolbox。换句话说,宿主是 hyperkit 而不是 osx。但是正如上面的文档所解释的那样,Docker 对于 Mac 实现的全部目的是让用户看起来好像 OSX 和 Docker 之间没有涉及虚拟化。

    • 使用环回地址连接到主机是一个尚未解决的问题。我什至不确定它是否完美,即使主机是 Linux。不确定,此时可能已解决。尽管如此,它需要 运行 一个镜像,声明容器或 pod 在 kube 的情况下位于主机网络上。但是在 docker for mac 中,根据我的在线阅读,该功能将永远无法使用。因此,使用 docker.for.mac.localhosthost.docker.internal 的解决方案,即 Docker for Mac设置为引用 mac 主机而不是 hyperkit 主机。

    • host.docker.internaldocker.for.mac.localhost是同一个,后期推荐此时是host.docker.internal。这就是说,这个地址最初对我不起作用,因为我的 Kafka 设置不好。值得准备@criket_007 link 好好理解http://rmoff.net/2018/08/02/kafka-listeners-explained.

按照@MaatDeamon 的方法,我只做了以下并且对我有用。

advertised.listeners=PLAINTEXT://:9092

并且在您的应用程序配置属性中

localhost:9092,host.docker.internal:9092