воскресенье, 30 октября 2022 г.

Подключение к Kafka в изолированном окружении

Есть изолированное от внешнего мира окружение в GCP с кластером Kafka, который живет в GKE. Kafka используется как внутри GKE кластера, так и виртуальными машинами, которым Kafka выставлена через внутренний балансировщик. Часть пользователей не приемлют использование консольных команд чтобы подключиться к Kafka и хотят пользоваться привычными им инструментами вроде Offset Explorer и ему подобными.

Итого у нас есть три брокера Kafka, которые доступны внутри кластера как kafka-0.kafka-headless.default.svc.cluster.local:9092, kafka-1.kafka-headless.default.svc.cluster.local:9092 и kafka-2.kafka-headless.default.svc.cluster.local:9092. Для виртуальных машин создано три балансировщика с адресами 172.16.0.16:19092, 172.16.0.17:19092 и 172.16.0.18:19092.

Если просто пробросить порты на локальную машину, то ничего работать не будет, т.к. после подключения к Kafka брокеру клиент получит метаданные в которых будет фигурировать Kafka advertised listeners и клиент будет пытаться подключиться к ним вместо работы с проброшенными портами.

Чтобы решить эту проблему нужно сделать две вещи:

  1. На балансирощиках открыть дополнительный порт (например 29092)
  2. В Kafka сконфигурировать дополнительный Listener для 0.0.0.0:29092 и что самое важное добавить в Advertised listeners конфигурацию с локальными адресами, которые будет использовать проброс портов.

Например проброс портов с локальной машины будет следующим:

  • 127.0.0.1:29092 -> 172.16.0.16:29092
  • 127.0.1.1:29092 -> 172.16.0.17:29092
  • 127.0.2.1:29092 -> 172.16.0.18:29092

Для Google Cloud проброс портов через gcloud выглядит следующим образом

gcloud compute ssh <jumphost> --project <project_id> --zone <zone> -- \
  -L 127.0.0.1:29092:172.16.0.16:29092 \
  -L 127.0.1.1:29092:172.16.0.17:29092 \
  -L 127.0.2.1:29092:172.16.0.18:29092

В моем случае GKE кластер приватный и подключиться к его API можно только с jumphost, но если имеете дело с публичным кластером, то по аналогии можно пробросить порты через kubectl port-forward.

Осталось только настроить клиент Kafka - в свойствах подключения нужно указывать следующие адреса брокеров: 127.0.0.1:29092,127.0.1.1:29092,127.0.2.1:29092.

Комментариев нет:

Отправить комментарий