Развертывание Apache Kafka с помощью Kubernetes

Развертывание Apache Kafka с помощью Kubernetes

5 мая 2022 г.

Kafka — это де-факто хранилище событий и решение распределенного брокера сообщений для больших систем с микросервисной архитектурой. Kubernetes — это отраслевой стандарт для организации контейнерных сервисов. Для многих организаций развертывание Kafka в Kubernetes — это простой подход, который соответствует их архитектурной стратегии.


В этом посте мы рассмотрим привлекательность размещения Kafka в Kubernetes, предоставив краткий обзор обоих приложений. Наконец, мы рассмотрим независимый от облака метод настройки Kubernetes для развертывания Kafka и родственных сервисов.


Учебник по технологии


Начнем с краткого обзора Kubernetes и Kafka.


Кубернетес


Google начал разработку того, что в конечном итоге стало Kubernetes (k8s) в 2003 году. В то время проект был известен как [Borg] (https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/). В 2014 году Google выпустила k8s как [проект с открытым исходным кодом на Github] (https://github.com/kubernetes/kubernetes), и k8s быстро нашла партнеров через Microsoft, Red Hat и Docker. С годами все больше и больше проектов использовали Kubernetes, включая сам GitHub и популярную игру Pokémon GO. В 2022 году мы наблюдаем рост использования k8s в области искусственного интеллекта и машинного обучения с усилением акцента на безопасности.


Внедрение k8s в жизненный цикл облачной разработки дало несколько ключевых преимуществ:


  • Развертывание с нулевым временем простоя

  • Масштабируемость

  • Неизменяемая инфраструктура

  • Самовосстанавливающиеся системы

Многие из этих преимуществ связаны с использованием декларативной конфигурации в k8s. Чтобы изменить конфигурацию инфраструктуры, ресурсы должны быть уничтожены и перестроены, тем самым обеспечивая неизменяемость. Кроме того, если k8s обнаруживает ресурсы, вышедшие за пределы объявленной спецификации, она пытается перестроить состояние системы, чтобы снова соответствовать этой спецификации.


Для разработчиков использование k8s означает, наконец, положить конец разочаровывающим развертываниям в полночь, когда вам приходится бросать все, чтобы масштабировать сервисы или исправлять производственные среды непосредственно вручную.


Апач Кафка


Kafka — это инструмент для обработки распределенных потоков с открытым исходным кодом. Kafka позволяет нескольким «производителям» добавлять сообщения (пары «ключ-значение») в «темы». Эти сообщения упорядочены в каждой теме в виде очереди. «Потребители» подписываются на тему и могут получать сообщения в порядке их поступления в очередь.


Kafka размещается на сервере, который обычно называют «брокером». В разных регионах может быть много разных брокеров Kafka. Помимо брокеров Kafka, еще один сервис под названием Zookeeper поддерживает синхронизацию различных брокеров и помогает координировать темы и сообщения.


Великолепие Kafka заключается в том, что он может обрабатывать сотни тысяч сообщений в секунду при распределении и при относительно низкой стоимости за МБ.


Kafka часто занимает место, похожее на «центральную нервную систему» ​​микросервисной архитектуры. Сообщения передаются между производителями и потребителями, которые на самом деле являются службами внутри вашего облака. Одна и та же служба может быть как потребителем, так и производителем сообщений из одной и той же или разных тем внутри Kafka.


Пример использования — создание нового пользователя в вашем приложении. Служба пользователей публикует сообщение в теме «Предоставление пользователя». Служба электронной почты использует это сообщение о новом пользователе, а затем отправляет ему приветственное письмо. Службы User и Email не должны были напрямую обмениваться сообщениями друг с другом, но их соответствующие задания выполнялись асинхронно.


Развертывание Kafka с помощью Kubernetes


Для нашего пошагового мини-проекта мы настроим Kubernetes и Kafka нейтральным к облаку способом с помощью Minikube, что позволит нам запустить весь кластер k8s на одной машине. Мы установили следующие приложения:



  • Kubectl версия клиента 1.23.3

Настройка миникуба


Установив Minikube, мы можем запустить его с помощью команды запуска minikube. Затем мы можем увидеть статус:


``` ударить


$ статус миникуба


minikube


тип: Плоскость управления


хост: работает


кубелет: работает


аписервер: работает


кубеконфиг: настроено


Инструкции по настройке Kubernetes для работы в выбранном вами облачном провайдере можно найти в документации для каждого провайдера (например, AWS, GCP или Azure), но перечисленные ниже файлы конфигурации YAML должны работать во всех провайдеров, с небольшими корректировками IP-адресов и связанных полей.


Определение пространства имен Kafka


Во-первых, мы определяем пространство имен для развертывания всех ресурсов Kafka, используя файл с именем 00-namespace.yaml:


``ямл


апиВерсия: v1


вид: пространство имен


метаданные:


Название: "Кафка"


этикетки:


Название: "Кафка"


Мы применяем этот файл, используя kubectl apply -f 00-namespace.yaml.


Мы можем проверить правильность создания пространства имен, запустив kubectl get namespaces, убедившись, что Kafka является пространством имен, присутствующим в Minikube.


Развертывание Zookeeper


Затем мы развертываем Zookeeper в нашем пространстве имен k8s. Мы создаем имя файла 01-zookeeper.yaml со следующим содержимым:


``ямл


апиВерсия: v1


вид: сервис


метаданные:


этикетки:


приложение: zookeeper-сервис


название: zookeeper-service


пространство имен: кафка


спецификация:


тип: NodePort


порты:


  • название: зоопарк-порт

порт: 2181


порт узла: 30181


целевой порт: 2181


селектор:


приложение: смотритель зоопарка


apiVersion: приложения/v1


вид: развертывание


метаданные:


этикетки:


приложение: смотритель зоопарка


имя: смотритель зоопарка


пространство имен: кафка


спецификация:


реплики: 1


селектор:


метки соответствия:


приложение: смотритель зоопарка


шаблон:


метаданные:


этикетки:


приложение: смотритель зоопарка


спецификация:


контейнеры:


  • изображение: вурстмейстер/смотритель зоопарка

imagePullPolicy: Ифноптресент


имя: смотритель зоопарка


порты:


  • контейнерПорт: 2181

В этом файле YAML создано два ресурса. Первая — это служба под названием «zookeeper-service», которая будет использовать развертывание, созданное во втором ресурсе с именем «zookeeper». В развертывании используется образ Docker wurstmeister/zookeeper для фактического двоичного файла Zookeeper. Служба предоставляет это развертывание на порту внутренней сети k8s. В этом случае мы используем стандартный порт Zookeeper 2181, который также предоставляет контейнер Docker.


Мы применяем этот файл с помощью следующей команды: kubectl apply -f 01-zookeeper.yaml.


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


``` ударить


$ kubectl получить услуги -n kafka


НАЗВАНИЕ ТИП КЛАСТЕР-IP ПОРТ(Ы) ВОЗРАСТ


служба зоопарка NodePort 10.100.69.243 2181:30181/TCP 3m4s


Мы видим внутренний IP-адрес Zookeeper (10.100.69.243), который нам понадобится, чтобы сообщить брокеру, где его прослушивать.


Развертывание брокера Kafka


Последний шаг — развернуть брокера Kafka. Мы создаем файл 02-kafka.yaml со следующим содержимым, заменив <ZOOKEEPER-INTERNAL-IP> на CLUSTER-IP из предыдущего шага для Zookeeper. Брокер не сможет развернуться, если этот шаг не будет выполнен.


``ямл


апиВерсия: v1


вид: сервис


метаданные:


этикетки:


приложение: кафка-брокер


имя: кафка-сервис


пространство имен: кафка


спецификация:


порты:


  • порт: 9092

селектор:


приложение: кафка-брокер


apiVersion: приложения/v1


вид: развертывание


метаданные:


этикетки:


приложение: кафка-брокер


имя: кафка-брокер


пространство имен: кафка


спецификация:


реплики: 1


селектор:


метки соответствия:


приложение: кафка-брокер


шаблон:


метаданные:


этикетки:


приложение: кафка-брокер


спецификация:


имя хоста: кафка-брокер


контейнеры:


  • среда:

  • имя: KAFKA_BROKER_ID

значение: "1"


  • имя: KAFKA_ZOOKEEPER_CONNECT

значение: :2181


  • имя: KAFKA_LISTENERS

значение: ОБЫЧНЫЙТЕКСТ://:9092


  • имя: KAFKA_ADVERTISED_LISTENERS

значение: PLAINTEXT://kafka-broker:9092


изображение: вурстмайстер/кафка


imagePullPolicy: Ифноптресент


имя: кафка-брокер


порты:


  • контейнерПорт: 9092

Опять же, мы создаем два ресурса — «сервис и развертывание» — для одного брокера Kafka. Запускаем kubectl apply -f 02-kafka.yaml. Мы проверяем это, видя модули в нашем пространстве имен:


``` ударить


$ kubectl получить pods -n kafka


ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ


kafka-broker-5c55f544d4-hrgnv 1/1 Работает 0 48 с


zookeeper-55b668879d-xc8vd 1/1 Бег 0 35м


Модулю Kafka Broker может потребоваться минута, чтобы перейти из состояния «ContainerCreating» в состояние «Выполняется».


Обратите внимание на строку в 02-kafka.yaml, где мы указываем значение для KAFKA_ADVERTISED_LISTENERS. Чтобы Zookeeper и Kafka могли взаимодействовать, используя это имя хоста (kafka-broker), нам нужно добавить следующую запись в файл /etc/hosts на нашем локальном компьютере:


```javascript


127.0.0.1 кафка-брокер


Тестирование тем Kafka


Чтобы проверить, можем ли мы отправлять и получать сообщения из темы в Kafka, нам нужно открыть порт для Kafka, чтобы сделать его доступным с локального хоста. Мы запускаем следующую команду, чтобы открыть порт:


``` ударить


$ kubectl переадресация порта kafka-broker-5c55f544d4-hrgnv 9092 -n kafka


Пересылка с 127.0.0.1:9092 -> 9092


Пересылка с [::1]:9092 -> 9092


Приведенная выше команда kafka-broker-5c55f544d4-hrgnv ссылается на модуль k8s, который мы видели выше, когда перечисляли модули в нашем пространстве имен kafka. Эта команда делает порт 9092 этого модуля доступным за пределами кластера Minikube k8s по адресу localhost:9092.


Чтобы легко отправлять и получать сообщения из Kafka, мы будем использовать инструмент командной строки под названием [KCat] (https://github.com/edenhill/kcat) (ранее Kafkacat). Чтобы создать сообщение и тему с именем test, мы запускаем следующую команду:


``` ударить


$ эхо "привет, мир!" | kafkacat -P -b локальный хост: 9092 -t тест


Команда должна выполняться без ошибок, что указывает на то, что производители нормально взаимодействуют с Kafka в k8s. Как мы можем увидеть, какие сообщения в настоящее время находятся в очереди с именем test? Мы запускаем следующую команду:


``` ударить


$ kafkacat -C -b локальный хост:9092 -t тест


Привет, мир!


% Достигнут конец темы теста [0] при смещении 1


Мы сделали это! Мы успешно развернули Kafka с Kubernetes!


Следующие шаги


Kafka — ключевой игрок для организаций, заинтересованных во внедрении событийно-ориентированных архитектур и систем в реальном времени. Развертывание Kafka с Kubernetes — отличное начало, но организациям также необходимо выяснить, как заставить Kafka беспрепятственно и безопасно работать с их существующими экосистемами API. Им потребуются инструменты для управления и обеспечения безопасности на протяжении всего жизненного цикла их API.


Среди поставщиков я наткнулся на Gravitee, одно из ведущих решений, которое особенно ориентировано на то, чтобы помочь организациям управлять, обеспечивать безопасность, управлять и производить свои API-экосистемы   — независимо от того, какие протоколы, службы или стили они строят поверх . Gravitee даже имеет [коннектор Kafka] (https://docs.gravitee.io/apim/3.x/apim_publisherguide_introduction_kafka.html), который принимает данные, предоставляя конечные точки, которые преобразуют запросы в сообщения, которые затем могут быть опубликованы в вашей теме Kafka. Он также может передавать события Kafka потребителям с помощью удобных для Интернета протоколов, таких как Websocket.


Вывод


В этой статье мы говорили о том, как Kafka помогает хореографировать архитектуры микросервисов, будучи центральной нервной системой, передающей сообщения во множество различных сервисов и из них. Для развертывания Kafka мы рассмотрели Kubernetes, мощную платформу оркестрации контейнеров, которую вы можете запускать локально (с Minikube) или в производственных средах с облачными провайдерами. Наконец, мы продемонстрировали, как использовать Minikube для настройки локального кластера Kubernetes, развертывания Kafka, а затем проверки успешного развертывания и настройки с помощью KCat.


Удачного развертывания!


Также опубликовано [Здесь] (https://dzone.com/articles/how-to-deploy-apache-kafka-with-kubernetes)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE