Найти в Дзене

Настройка портов Docker-контейнеров компонентов Kafka для запуска на офисном ноутбуке и Windows

Оглавление

Как настроить YAML-файл Docker Compose для доступа к Kafka на WSL в Windows:  открытие портов в конфигурации развертывания с примерами (продолжение).

Настройка конфигурационного YAML-файла для запуска Docker-контейнеров с компонентами Kafka на Windows в WSL

Как я рассказывала вчера, для работы с компонентами платформы Kafka от Confluent, развернутой как набор связанных Docker-контейнеров в WSL на Windows с GUI-интерфейсом AKHQ исходная конфигурация не подошла. После запуска контейнеров с помощью команды

-2

в консоли WSL из директории, где лежит файл docker-compose.yml, веб-сервис AKHQ становится доступным на локальном хосте, порт 8080.

Запуск Docker-контейнеров
Запуск Docker-контейнеров

Поскольку для работы Kafka необходим Zookeeper, который хранит метаданные о топиках, разделах и брокерах, а также отслеживает лидера раздела, управляет ACL-списками и другими конфигурационными данными, он тоже должен быть запущен. Чтобы контейнер Kafka мог обратиться к Zookeeper, а также другим компонентам платформы, которые в будущем я планирую использовать (ksqlDB, Kafka Connect, REST Proxy, Schema Registry), надо открыть порты, внеся изменения в конфигурационный YAML-файл docker-compose.yml. В документации Docker-образа cp-all-in-one-community, доступной на Github [1], говорится, что сервисы запускаются на следующих портах:

  • ZooKeeper – порт 2181;
  • Kafka broker — порт 9092;
  • Kafka broker JMX — порт 9101;
  • Confluent Schema Registry — порт 8081;
  • Kafka Connect — порт 8083;
  • ksqlDB — порт 8088;
  • Confluent REST Proxy — порт 8082.

Я решила сразу открыть все порты, изменив конфигурационный файл следующим образом:

-4
-5
-6
-7

После изменения этого конфигурационного файла пришлось пересоздать контейнеры, сперва остановив и удалив их с помощью команды

-8

После повторного создания Docker-контейнеров из измененного YAML-файла с помощью команды docker-compose up –d, посмотрим открытые порты, запустив в консоли WSL команду

-9
Просмотр запущенных Docker-контейнеров
Просмотр запущенных Docker-контейнеров

Веб-интерфейс AKHQ успешно работает на localhost:8080, позволяя создавать и просматривать содержимое топиков в визуальном режиме. Также можно отправить сообщение в топик через GUI.

Просмотр списка топиков Kafka в веб-интерфейсе AKHQ
Просмотр списка топиков Kafka в веб-интерфейсе AKHQ

Однако, попытка подключиться к Kafka на localhost:9092 из Python-скрипта, выдала ошибку. Для проверки подключения использовался следующий скрипт:

-12

Это скрипт выдает ошибку.

Ошибка подключения к брокеру Kafka клиентом вне контейнера
Ошибка подключения к брокеру Kafka клиентом вне контейнера

Ошибка связана с невозможностью необходимостью настроить слушатели Kafka. Что это такое, рассмотрим далее.

Подключение к Kafka на Docker: настройка слушателей

Слушатель — это комбинация хоста/IP, порта, и протокола. Будучи распределенной системой, Kafka позволяет публиковать данные в лидер раздела, который может быть на любом из брокеров в кластере. Когда запускается клиент, т.е. продюсер или потребитель, он запрашивает метаданные о том, какой брокер является лидером для раздела, и он может сделать это у любого брокера. Возвращаемые метаданные будут включать конечные точки, доступные для брокера-лидера для этого раздела, и клиент будет использовать их для подключения к брокеру. Именно эти конечные точки стали источником проблемы. Если запустить все на голом железе, без виртуальных машин и Docker-контейнеров, можно работать просто с локальным хостом localhost. Но при более сложных сетевых настройках и нескольких узлах, нужно использовать KafkaListenerConfigurer, интерфейс для настройки конфигурации конечных точек слушателя. Для работы с ним используются следующие конфигурации:

  • KAFKA_LISTENERS— разделенный запятыми список слушателей, а также хост/IP и порт, к которому Kafka привязывается для прослушивания. Для более сложной сети это может быть IP-адрес, связанный с заданным сетевым интерфейсом на машине. Значение по умолчанию — 0.0.0.0, что означает прослушивание на всех интерфейсах. Возможно, это уже устаревшая конфигурация, поскольку ее не было в исходном YAML-файле для создания контейнеров от Confluent.
  • KAFKA_ADVERTISED_LISTENERS— это список слушателей, разделенных запятыми, с их хостом/IP и портом. Это метаданные, которые передаются обратно клиентам.
  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP – сопоставление, которое определяет пары ключ/значение для протокола безопасности, используемого каждым слушателем.

Брокеры взаимодействуют между собой обычно во внутренней сети. Для определения конкретного слушателя используется конфигурация KAFKA_INTER_BROKER_LISTENER_NAME (inter.broker.listener.name). Используемый хост/IP должен быть доступен с машины брокера другим компонентам. Если клиенты Kafka находятся вне сети брокера, что и было в моем случае, надо настраивать дополнительные слушатели.

Каждый слушатель, при подключении, сообщит адрес, по которому он может быть доступен. Этот адрес зависит от используемой сети. Подключение к брокеру из внутренней сети отличается от хоста/IP и порта при внешнем подключении.

Для запуска в Docker нужно настроить два слушателя Kafka:

  • для коммуникации между брокерами и другими компонентами Kafka в сети Docker. Для этих коммуникаций надо использовать имя хоста Docker-контейнеров. Каждый контейнер Docker в той же сети Docker будет использовать имя хоста контейнера брокера Kafka для доступа к нему.
  • трафик вне Docker:  клиенты, работающие локально на хост-машине, но вне контейнера. Они будут подключаться к Kafka по localhost к порту, открытому из контейнера Docker.

На UML-диаграмме развертывания это выглядит так.

UML-диаграмма развертывания контейнеров Kafka в Docker
UML-диаграмма развертывания контейнеров Kafka в Docker

Скрипт PlantUML для этой диаграммы:

-15

Продолжительные исследования показали, что в конфигурационном файле docker-compose.yml необходимо изменить открытый порт для Kafka, а также следующие конфигурации:

  • KAFKA_ADVERTISED_LISTENERS: ‘PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092’
  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: ‘PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT’
  • ports: — 29092:29092

В результате этих манипуляций конфигурационный YAML-файл docker-compose.yml выглядит так:

-16
-17
-18
-19

Теперь открытые порты выглядят так:

Просмотр запущенных Docker-контейнеров
Просмотр запущенных Docker-контейнеров

Успех внесенных изменений подтверждает ответ тестового скрипта, в котором идет обращение к bootstrap_servers = [‘localhost:29092’].

Успешное подключение к брокеру Kafka клиентом вне контейнера
Успешное подключение к брокеру Kafka клиентом вне контейнера

Таким образом, работа с Docker-контейнерами оказалась не так проста, как это казалось сначала. Завтра я продолжу работать с этим развертыванием и покажу пример публикации сообщений в топики и потребления их оттуда.

Освойте администрирование и эксплуатацию Apache Kafka на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Статья

Курсы: DEVKI KAFKA ADS-KAFKA

Наш сайт

Копирование, размножение, распространение, перепечатка (целиком или частично), или иное использование материала допускается только с письменного разрешения правообладателя ООО "УЦ Коммерсант"