Доступ к Local Kafka из Служб, развернутых в Local Docker For Mac (включая расширение Kubernetes) - PullRequest
0 голосов
/ 25 октября 2018
  • Я работаю локально на OSX.
    • Я использую Кафку и зоопарка в локальном режиме.Имеется в виду зоокейпер из моей установки Кафки.Один узел кластера.
    • Оба работают на петлевом локальном хосте

zookeeper.connect=localhost:2181

  • My/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 с расширением Kubernetes.

Мой сценарий

  • У меня есть докернизированный микро-сервис Akka-stream, который считывает данные из внешней базы данных и записывает их в Kafkaтема.Он использует в качестве сервера начальной загрузки:

"localhost:9092"

Issue

  • Когда я запускаюСлужба на моей машине напрямую (например, из командной строки или изнутри Intellij) все работает нормально.Когда я запускаю его на локальном докере или в 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 для развертываниямой модуль:

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

Я принял меры предосторожности, чтобы установить hostNetwork: true

С помощью демона Docker я изначально пытался настроить сеть как хост, но обнаружил, чтоэто не работает с докером для Mac.Следовательно, я отказался от этого маршрута.Я понял, что это связано с виртуализацией.

1) Действительно ли проблема с виртуализацией, возникающая в докере, такая же, как и у моих локальных kubernetes?По сути, хост-сеть - это виртуальная машина, а не мой Mac?

2) Я пытаюсь изменить свой код и добавить в качестве сервера начальной загрузки следующий адрес: host.docker.internal согласно документации.Но проблема сохраняется.Является ли фундаментальной проблемой тот факт, что я работаю с обратным адресом?Должен ли я работать на мой сетевой адрес действительно?На какой адрес указывает host.docker.internal?Как я могу заставить его работать с адресом обратной связи?Если я совсем не в курсе, есть идеи, что мне нужно реализовать, чтобы это работало?

Большое спасибо за любую помощь в этом.

1 Ответ

0 голосов
/ 26 октября 2018

На основе руководства @ cricket_007 Слушатели Кафки - Объясненные и много прочитанного мной и здесь по этой проблеме, включая официальную документацию по докеру Я хочу подключиться из контейнера к серверуна хосте

я придумал следующее решение.

Я добавил следующее в свою локальную конфигурацию 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

Фактически здесь External, ожидается будет докерская сеть .Эта конфигурация только для моей машины OSX для моей локальной цели разработки.Я не ожидаю, что люди, подключающиеся к моему ноутбуку, будут использовать мою локальную кафку, поэтому я могу использовать EXTERNAL://docker.for.mac.localhost:19092. Это то, что объявляется для моего контейнера в докере / кубе.Внутри этой сети доступен docker.for.mac.localhost.

Обратите внимание, что это, вероятно, не будет работать с Minikube.Это относится к Docker для Mac.Kubernetes, которые я запускаю на своей машине, идет с Docker для 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.

Ответы на дополнительные вопросы, которые у меня были

  1. Да.Docker для Mac использует HyperKit в качестве облегченной виртуальной машины, на которой работает linux, и на ней запускается Docker Engine .Расширение Docker для MAC Kubernetes в основном предназначено для запуска служб / инфраструктуры кластера kubernetes в качестве контейнеров в демоне docker. Docker для Mac против Docker Toolbox .Другими словами, хост - это гиперкит, а не ос.Но, как объясняет вышеупомянутый документ, реализация Docker для Mac заключается в том, чтобы сделать его похожим на пользователя, как если бы между OSX и Docker не было никакой виртуализации.

    • Подключение к хосту с использованием петлевого адреса - это проблема, которая не была решена. Я даже не уверен, что она отлично работает, даже если хост - Linux.Не уверен, возможно, был решен в этот момент.Тем не менее, потребуется запустить образ, указав, что контейнер или модуль в случае kube находятся в сети хоста.Но в Docker для Mac эта функция никогда не будет работать, основываясь на моих чтениях в Интернете.Следовательно, решение использовать docker.for.mac.localhost или host.docker.internal , которое Docker для Mac настроил для ссылки на хост Mac, а не на хост HyperKit.

    • host.docker.internal и docker.for.mac.localhost являются одними и теми же, и поздняя рекомендация на данный моментhost.docker.internal.При этом этот адрес изначально не работал для меня, потому что моя установка Kafka не была хорошей.Стоит прочесть ссылку @ criket_007, чтобы хорошо это понять http://rmoff.net/2018/08/02/kafka-listeners-explained.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...