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

标签 docker kubernetes apache-kafka docker-for-mac

  • 我在 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
    

  • 我在我的机器上设置了 docker for Mac,并带有 Kubernetes 扩展。

  • 我的场景
  • 我有一个 dockerized 的 Akka-stream 微服务,它从外部数据库读取数据并将其写入 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
    

    我采取预防措施设置主机网络:真

    直接使用 Docker 守护程序,我最初也尝试将网络设置为主机,但发现这不适用于 docker for mac。因此,我放弃了那条路线。我知道这与虚拟化有关。

    1)docker出现的虚拟化问题和我本地的kubernetes一样吗?基本上,主机网络是虚拟机而不是我的mac?

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

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

    最佳答案

    基于@cricket_007 指导 Kafka Listeners - Explained以及我在这个问题上到处阅读的许多内容,包括官方 docker 文档 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 机器,用于我的本地开发目的。我不希望连接到我的笔记本电脑的人使用我本地的 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 Engine . Docker for MAC Kubernetes 扩展基本上是关于在 docker 守护进程中将 kubernetes 集群服务/基础设施作为容器运行。 Docker for Mac vs. Docker Toolbox .换句话说,宿主是 hyperkit 而不是 osx。但正如上面的文档所解释的,Docker for Mac 的实现就是让用户觉得 OSX 和 Docker 之间没有虚拟化。
  • 使用环回地址连接到主机是一个尚未解决的问题。 即使主机是 Linux,我什至不确定它是否能完美运行。不确定,可能已经解决了。尽管如此,它需要通过声明容器或 pod 在 kube 的情况下在主机网络上来运行图像。但是在 docker for mac 中,根据我的在线阅读,该功能将永远无法工作。因此使用 的解决方案docker.for.mac.localhost host.docker.internal ,Mac 的 Docker 确实设置为引用 mac 主机而不是 hyperkit 主机。
  • host.docker.internal docker.for.mac.localhost 是其中之一,此时最新的建议是 host.docker.internal。话虽这么说,这个地址最初对我不起作用,因为我的 Kafka 设置不好。值得准备@criket_007 链接以了解这一点http://rmoff.net/2018/08/02/kafka-listeners-explained .
  • 关于docker - 从本地 Docker For Mac 中部署的服务访问本地 Kafka(包括 Kubernetes 扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52996028/

    相关文章:

    python - 使用 Tesseract 4 - 来自 uwsgi-nginx-flask-docker 的 Docker 容器

    ubuntu - 在 docker 容器中添加 GPG key 会导致 "no valid OpenPGP data found"

    领导追随者系统的 Kubernetes 入口

    kubernetes - kubectl autoscale 与 kubectl scale 之间有什么区别

    scala - 停止 Spark Streaming : exception in the cleaner thread but it will continue to run

    networking - 无法使用docker consul ping其他主机中的容器

    docker - 使用 gcsfuse 安装的存储桶中的数据在 Google Cloud 实例上运行 Docker

    linux - Spark-2.4.0 docker 构建失败

    python - 我怎样才能找到kafka配置文件?

    apache-kafka - WAN 上的 Kafka 生产者/消费者?