Разверните свое приложение с помощью Kafka и Docker за 20 минут

Разверните свое приложение с помощью Kafka и Docker за 20 минут

31 мая 2022 г.

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


Kafka работает на выбранной вами платформе, например Kubernetes или ECS, в виде кластера из одного или нескольких узлов Kafka. Кластер Kafka будет инициализирован с нулем или более тем, которые можно рассматривать как каналы сообщений или очереди. Клиенты могут подключаться к Kafka, чтобы публиковать сообщения в темах или получать сообщения из тем, на которые подписан клиент.


Docker — это приложение, использующее виртуализацию для запуска контейнерных приложений на хост-компьютере. Контейнеризация позволяет пользователям создавать, запускать и тестировать приложения совершенно отдельно, при этом позволяя им взаимодействовать по сети.


Важно отметить, что контейнеризация обеспечивает переносимость приложений, поэтому одно и то же приложение можно запускать на вашем локальном компьютере, в кластере Kubernetes, AWS и т. д.


И Kafka, и Docker — довольно сложные технологии, и бывает сложно определить, с чего начать, если вы уверены, что они подходят для решаемой вами проблемы. Для простоты мы создадим одного производителя, одного потребителя и один экземпляр Kafka.


Зависимости проекта для Kafka и Docker


В этом руководстве мы начнем с использования Docker Compose для сборки, запуска и тестирования локально. Мы также рассмотрим, как использовать kubectl для развертывания нашего приложения в облаке. Наконец, мы рассмотрим, как мы можем использовать Architect для беспрепятственного развертывания нашего приложения локально и в облаке с использованием одной и той же конфигурации.


Прежде чем приступить к работе, убедитесь, что следующие зависимости установлены локально:


  • [Докер] (https://docs.docker.com/get-docker/)

  • [Составить Docker] (https://docs.docker.com/compose/install/)

  • [Учетная запись Docker Hub] (https://hub.docker.com/signup)

  • [нпм] (https://www.npmjs.com/get-npm)

  • [Командная строка архитектора] (https://www.npmjs.com/package/@architect-io/cli)


  • [Кластер Kubernetes в DigitalOcean или в другом месте] (https://cloud.digitalocean.com/registrations/new)

Как упоминалось ранее, эта часть руководства будет содержать несколько служб, работающих на вашем локальном компьютере. Вы можете использовать docker-compose, чтобы запустить их все сразу и остановить, когда будете готовы. Давайте идти!


Создайте службу издателя в Node для Kafka с помощью Docker


Начните с создания каталога проекта с двумя папками внутри него с именами «подписчик» и «издатель». Эти папки будут содержать код приложения, вспомогательные файлы Node и файлы Docker, необходимые для создания приложений, которые будут взаимодействовать с Kafka.


Служба публикации будет генерировать сообщения, которые будут опубликованы в теме Kafka. Для простоты сервис будет генерировать простое сообщение с интервалом в пять секунд. В папку «publisher» добавьте новый файл с именем index.js со следующим содержимым:


```javascript


const kafka = require('kafka-node');


постоянный клиент = новый kafka.KafkaClient({


кафкаХост:


process.env.ENVIRONMENT === 'локальный'


? процесс.env.INTERNAL_KAFKA_ADDR


: процесс.env.EXTERNAL_KAFKA_ADDR,


const Producer = kafka.Producer;


постоянный производитель = новый производитель (клиент);


производитель.он('готово', () => {


setInterval(() => {


постоянные полезные нагрузки = [


тема: process.env.TOPIC,


сообщения: [${process.env.TOPIC}_message_${Date.now()}],


производитель.send(полезные нагрузки, (ошибка, данные) => {


если (ошибка) {


console.log(ошибка);


console.log(данные);


}, 5000);


производитель.он('ошибка', ошибка => {


console.log(ошибка);


Сохраните и закройте индекс. Нам также понадобятся некоторые вспомогательные модули, установленные в нашем контейнере Docker, когда он будет построен. Кроме того, в папке «publisher» создайте package.json с JSON здесь:


```json


"имя": "издатель",


"версия": "0.1.0",


«основной»: «index.js»,


"скрипты": {


"start": "узел index.js"


"лицензия": "ISC",


"зависимости": {


"парсер тела": "^1.19.0",


"кор": "2.8.5",


"экспресс": "^4.17.1",


"кафка-узел": "^5.0.0",


"винстон": "^3.2.1"


Сохраните и закройте package.json. Наряду с двумя последними файлами нам понадобится package-lock.json, который можно создать с помощью следующей команды:


``` ударить


npm i --package-lock-only


Последний файл, который нужно создать для издателя, соберет все воедино, и это Dockerfile. Создайте файл Dockerfile вместе с тремя другими только что созданными файлами и добавьте следующее:


``` ударить


С узла: 12-альпийский


РАБОЧИЙ КАТАЛОГ /usr/src/app


КОПИРОВАТЬ пакет*.json ./


ЗАПУСТИТЬ установку npm


КОПИРОВАТЬ . .


CMD [ "нпм", "старт" ]


Сохраните и закройте файл. Построчно Dockerfile, который только что был добавлен в папку, даст указание демону Docker создать образ издателя как таковой:


  • Извлеките образ Docker node:12-alpine в качестве базового образа контейнера.

  • Установите рабочий каталог /usr/src/app. Последующие команды будут запускаться в этой папке

  • Скопируйте только что созданные файлы package.json и package-lock.json в каталог /usr/src/app.

  • Запустите npm install, чтобы установить модули узла.

  • Скопируйте остальные файлы из каталога на домашнем компьютере в /usr/src/app. Важно отметить, что сюда входит файл index.js.

  • Запустите команду npm start в контейнере. npm уже установлен на образе node:12-alpine, а скрипт start определен в package.json

Создайте абонентский сервис для Kafka с помощью Docker


Служба подписчика будет построена очень похоже на службу публикации и будет использовать сообщения из топика Kafka. Сообщения будут потребляться так же часто, как и публикуются, опять же, в данном случае каждые пять секунд. Для начала добавьте файл index.js в папку «подписчик» и добавьте следующий код:


```javascript


const kafka = require('kafka-node');


постоянный клиент = новый kafka.KafkaClient({


кафкаХост:


process.env.ENVIRONMENT === 'локальный'


? процесс.env.INTERNAL_KAFKA_ADDR


: процесс.env.EXTERNAL_KAFKA_ADDR,


const Consumer = kafka.Consumer;


константный потребитель = новый потребитель(


клиент,


тема: process.env.TOPIC,


раздел: 0,


автокоммит: ложь,


потребитель.на('сообщение', сообщение => {


console.log(сообщение);


потребитель.on('ошибка', ошибка => {


console.log(ошибка);


Сохраните и закройте индекс. Также, как и в случае с издателем, нам понадобится файл package.json:


```json


"имя": "подписчик",


"версия": "0.1.0",


«основной»: «index.js»,


"скрипты": {


"start": "узел index.js"


"автор": "Architect.io",


"лицензия": "ISC",


"зависимости": {


"парсер тела": "^1.19.0",


"кор": "2.8.5",


"экспресс": "^4.17.1",


"кафка-узел": "^5.0.0",


"винстон": "^3.2.1"


Сохраните и закройте package.json, затем создайте package-lock.json с помощью той же команды, что и раньше:


``` ударить


npm i --package-lock-only


Подписчику нужен один дополнительный файл, которого нет у издателя, и это файл, который мы назовем wait-for-it.js. Создайте файл и добавьте следующее:


```javascript


const kafka = require('kafka-node');


постоянный клиент = новый kafka.KafkaClient({


кафкаХост:


process.env.ENVIRONMENT === 'локальный'


? процесс.env.INTERNAL_KAFKA_ADDR


: процесс.env.EXTERNAL_KAFKA_ADDR,


const Admin = kafka.Admin;


const child_process = require('child_process');


const admin = новый администратор (клиент);


const interval_id = setInterval(() => {


admin.listTopics((ошибка, разрешение) => {


если (res[1].metadata[process.env.TOPIC]) {


console.log('Тема Kafka создана');


clearInterval (interval_id);


child_process.execSync('npm start', { stdio: 'inherit' });


} еще {


console.log('Ожидание создания темы Kafka');


}, 1000);


Этот файл будет использоваться в контейнере Docker, чтобы гарантировать, что потребитель не попытается использовать сообщения из темы до того, как тема будет создана.


Каждую секунду он будет проверять, существует ли тема, и когда Kafka запустится, и тема будет окончательно создана, подписчик запустится. Наконец, создайте Dockerfile в папке «subscriber» со следующим фрагментом:


``` ударить


С узла: 12-альпийский


РАБОЧИЙ КАТАЛОГ /usr/src/app


КОПИРОВАТЬ пакет*.json ./


ЗАПУСТИТЬ установку npm


КОПИРОВАТЬ . .


CMD [ "узел", "wait-for-it.js" ]


Dockerfile подписчика такой же, как и у издателя, с одним отличием, отмеченным выше. Команда, которая запускает контейнер, использует файл wait-for-it.js, а не индекс. Сохраните и закройте Dockerfile.


Файл Docker-compose для стека Kafka


В файле docker-compose службы издателя, подписчика, Kafka и Zookeeper (https://zookeeper.apache.org/) будут связаны вместе. Zookeeper — это служба, которая используется для синхронизации узлов Kafka в кластере.


Zookeeper заслуживает отдельного поста, и, поскольку в этом уроке нам нужен только один узел, я не буду подробно на нем останавливаться. В корне проекта рядом с папками «подписчик» и «издатель» создайте файл с именем «docker-compose.yml» и добавьте следующую конфигурацию:


``ямл


версия: '3'


Сервисы:


работник зоопарка:


порты:


  • '50000:2181'

изображение: jplock/zookeeper


кафка:


порты:


  • '50001:9092'

  • '50002:9093'

зависит от:


  • работник зоопарка

Окружающая среда:


KAFKA_ZOOKEEPER_CONNECT: 'смотритель зоопарка: 2181'


KAFKA_LISTENERS: 'ВНУТРЕННИЙ://:9092'


KAFKA_ADVERTISED_LISTENERS: 'ВНУТРЕННИЙ://:9092'


KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'ВНУТРЕННИЙ: ОБЫЧНЫЙ ТЕКСТ'


KAFKA_INTER_BROKER_LISTENER_NAME: ВНУТРЕННИЙ


KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: '1'


KAFKA_CREATE_TOPICS: 'пример-тема: 1:1'


KAFKA_ADVERTISED_HOST_NAME: host.docker.internal # измените на 172.17.0.1, если работаете в Ubuntu


изображение: 'wurstmeister/кафка: 2.12-2.4.0'


тома:


  • '/var/run/docker.sock:/var/run/docker.sock'

издатель:


зависит от:


  • кафка

Окружающая среда:


ТЕМА: пример-тема


СРЕДА: местная


INTERNAL_KAFKA_ADDR: «кафка: 9092»


строить:


контекст: ./издатель


подписчик:


зависит от:


  • кафка

Окружающая среда:


ТЕМА: пример-тема


СРЕДА: местная


INTERNAL_KAFKA_ADDR: «кафка: 9092»


строить:


контекст: ./подписчик


объемы: {}


Обратите внимание, что блок services в docker-compose содержит четыре ключа, в которых мы определяем определенные свойства для каждой службы. Ниже приведено подробное описание того, для чего используется каждое свойство и его подсвойства.


Работник зоопарка


Свойство ports указывает Zookeeper предоставлять Kafka доступ к порту 2181 внутри сети Docker. Zookeeper также доступен для хост-компьютера через порт 50000.


Свойство image указывает демону Docker загрузить последнюю версию образа [jplock/zookeeper] (https://hub.docker.com/r/jplock/zookeeper).


Кафка


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


  • ports – Kafka предоставляет доступ к двум внутренним портам сети Docker, 9092 и 9093. Он также доступен хост-компьютеру через порты 50001 и 50002.

  • depends_on – запуск Kafka зависит от Zookeeper, поэтому его ключ включен в блок depends_on, чтобы гарантировать, что Docker запустит Zookeeper раньше, чем Kafka.

  • environment – Kafka подберет переменные среды в этом блоке после запуска контейнера. Все параметры конфигурации, кроме KAFKA_CREATE_TOPICS, будут добавлены в конфигурацию брокера Kafka и применены к запуску. Переменная KAFKA_CREATE_TOPICS используется самим образом Docker, а не Kafka, чтобы упростить работу с Kafka. Темы, определяемые этой переменной, будут создаваться при запуске Kafka без каких-либо внешних инструкций.

  • image – это поле указывает демону Docker на получение версии 2.12–2.4.0 образа wurstmeister/kafka .

  • volumes – это требование образа Docker для использования интерфейса командной строки Docker при локальном запуске Kafka.

Издатель


Большая часть конфигурации в блоке `publisher указывает, как издатель должен взаимодействовать с Kafka.


Обратите внимание, что свойство depends_on гарантирует, что издатель запустится после Kafka.


  • depends_on – служба издателя естественным образом зависит от Kafka, поэтому она включена в массив зависимостей.

  • environment – эти переменные используются кодом в index.js издателя.

  • TOPIC – это тема, в которой будут публиковаться сообщения. Обратите внимание, что он соответствует теме, которая будет создана контейнером Kafka.

  • ENVIRONMENT – эта переменная среды определяет внутри индексного файла, через какой порт служба будет взаимодействовать с Kafka. Тернарный оператор, в котором он используется, существует для использования одного и того же кода как для локального, так и для удаленного развертывания.

  • INTERNAL_KAFKA_ADDR – издатель подключится к Kafka на этом хосте и порту.

  • build – внутренний контекст сообщает демону Docker, где найти Dockerfile, описывающий, как будет собираться и запускаться служба, а также вспомогательный код и другие файлы, которые будут использоваться внутри контейнера.

Подписчик


Большая часть конфигурации docker-compose для службы подписчика идентична конфигурации службы издателя. Единственное отличие состоит в том, что контекст сообщает демону Docker о сборке из каталога «подписчика», где были созданы его Dockerfile и вспомогательные файлы.


Запуск примера стека


Наконец, момент, которого мы все ждали, запускает сервисы! Все, что нужно сейчас, это запустить приведенную ниже команду из корневого каталога проекта:


докер-компоновать


Вот и все! После запуска всех сервисов и создания топика Kafka выходные данные сервисов издателя и подписчика будут выглядеть следующим образом:


издатель_1 | { 'пример темы': { '0': 0 } }


абонент_1 | Тема о Кафке создана


абонент_1 |


абонент_1 | > @architect-examples/event-subscriber@0.1.0 start /usr/src/app


абонент_1 | > узел index.js


абонент_1 |


абонент_1 | {


абонент_1 | тема: 'пример-тема',


абонент_1 | значение: 'пример-topic_message_1610477237480',


абонент_1 | смещение: 0,


абонент_1 | раздел: 0,


абонент_1 | хайводофсет: 1,


абонент_1 | ключ: ноль


абонент_1 | }


абонент_1 | {


абонент_1 | тема: 'пример-тема',


абонент_1 | значение: 'пример-topic_message_1610477242483',


абонент_1 | смещение: 1,


абонент_1 | раздел: 0,


абонент_1 | хайводофсет: 2,


абонент_1 | ключ: ноль


абонент_1 | }


издатель_1 | { 'пример темы': { '0': 1 } }


Новые сообщения будут публиковаться и использоваться до тех пор, пока процесс создания docker-compose не будет остановлен нажатием клавиш Ctrl/Cmd+C на том же терминале, в котором он был запущен.


Запустите Kafka в облаке на Kubernetes


Локальный запуск Kafka может быть полезен для тестирования и итерации, но самое полезное — это, конечно же, облако. Этот раздел руководства поможет вам развернуть то же самое приложение, которое было только что развернуто локально в вашем кластере Kubernetes.


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


Чтобы кластер мог получать образы Docker, которые вы будете создавать, будет полезна учетная запись [Docker Hub] (https://hub.docker.com/), где вы можете разместить несколько бесплатных репозиториев. Тот же код и образы Docker будут использоваться из предыдущей части руководства.


Создавайте и отправляйте образы в Docker Hub


Чтобы кластер Kubernetes мог получить образы Docker, их необходимо отправить в облачный репозиторий, откуда к ним можно будет получить доступ. Docker Hub — это наиболее часто используемый облачный репозиторий, и изображения здесь будут опубликованы для простоты использования в этом руководстве. Для начала убедитесь, что у вас есть учетная запись Docker Hub, а затем введите в терминал следующее:


вход в докер


При появлении запроса введите имя пользователя Docker Hub (не адрес электронной почты) и пароль. Вы должны увидеть сообщение «Вход выполнен успешно», указывающее на то, что вы успешно вошли в Docker Hub в терминале. Следующим шагом будет отправка образов, которые необходимо будет использовать в кластере Kubernetes.


В корне проекта перейдите в каталог publisher, создайте и пометьте службу издателя с помощью следующей команды:


сборка докера. -t /publisher:latest


На вашем локальном компьютере теперь есть образ Docker с тегом /publisher:latest`, который можно отправить в облако. Вы могли также заметить, что сборка была быстрее, чем при первой сборке издателя. Это связано с тем, что Docker кэширует слои изображений локально, и если вы ничего не меняли в сервисе издателя, его не нужно полностью перестраивать.


Теперь нажмите на изображение с тегом с помощью команды:


docker push /publisher:latest


Ваше пользовательское изображение теперь общедоступно в Интернете! Перейдите к https://hub.docker.com/repository/docker/<your_docker_hub_username>/publisher и войдите в систему, если хотите его просмотреть.


Теперь перейдите в папку subscriber и сделайте то же самое для службы подписки с помощью двух похожих команд:


сборка докера. -t /подписчик:последний


docker push /subscriber:latest


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


Разверните стек в Kubernetes


Когда у вас есть кластер Kubernetes, созданный в Digital Ocean или где вы предпочитаете, и вы загрузили kubeconfig кластера или установили свой контекст Kubernetes, вы готовы развернуть издателя, потребителя, Kafka и Zookeeper. Убедитесь, что в кластере также установлена ​​панель управления Kubernetes. В Digital Ocean приборная панель будет предустановлена.


Для развертывания в Kubernetes на следующих этапах также потребуется, чтобы на вашем локальном компьютере был установлен интерфейс командной строки Kubernetes, kubectl. После выполнения предварительных условий следующими шагами будут создание и развертывание манифестов Kubernetes.


Эти манифесты будут для пространства именразвертываний и сервисы. В корне проекта создайте каталог с именем kubernetes и перейдите в этот каталог. Для организации здесь будут создаваться все манифесты. Начните с создания файла с именем namespace.yml. В Kubernetes пространство имен будет группировать все ресурсы, созданные в этом руководстве.


``ямл


апиВерсия: v1


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


метаданные:


имя: kafka-пример


этикетки:


имя: kafka-пример


Сохраните и закройте файл. Для создания пространства имен внутри кластера Kubernetes будет использоваться kubectl. Запустите команду ниже:


kubectl create -f namespace.yml --kubeconfig=


Если пространство имен было создано успешно, на консоль будет выведено сообщение namespace/kafka-example created.


Перед созданием развертываний сервисы Kubernetes должны разрешить трафик к модулям, от которых зависят другие. Для этого будут созданы две службы. Один разрешит трафик к модулю Kafka через открытые порты 9092 и 9093, а другой разрешит трафик к модулю Zookeeper через открытый порт 2181.


Это позволит издателю и подписчику отправлять трафик в Kafka, а Kafka — в Zookeeper соответственно. Находясь в каталоге k8s, начните с создания файла kafka-service.yml со следующим yml:


``ямл


вид: сервис


апиВерсия: v1


метаданные:


имя: пример-кафка


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


этикетки:


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


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


порты:


  • название: внешнее

протокол: TCP


порт: 9093


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


  • название: внутреннее

протокол: TCP


порт: 9092


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


селектор:


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


тип: КластерIP


сессионаффинити: нет


Создайте службу в кластере, выполнив следующую команду:


kubectl create -f kafka-service.yml --kubeconfig=


kubectl должен подтвердить, что служба создана. Теперь создайте другую службу, сначала создав файл с именем zookeeper-service.yml. Добавьте в этот файл следующее содержимое:


вид: сервис


апиВерсия: v1


метаданные:


имя: пример-зоозащитник


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


этикетки:


приложение: пример-зоозащитник


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


порты:


  • название: главный

протокол: TCP


порт: 2181


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


селектор:


приложение: пример-зоозащитник


тип: КластерIP


сессионаффинити: нет


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


kubectl create -f zookeeper-service.yml --kubeconfig=


Далее необходимо будет создать четыре развертывания внутри нового пространства имен, по одному для каждой службы. Начните с создания файла с именем zookeeper-deployment.yml и добавьте следующий yml:


``ямл


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


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


метаданные:


имя: пример-зоозащитник


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


этикетки:


приложение: пример-зоозащитник


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


реплики: 1


селектор:


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


приложение: пример-зоозащитник


шаблон:


метаданные:


этикетки:


приложение: пример-зоозащитник


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


контейнеры:


  • имя: пример-зоозащитник

изображение: jplock/zookeeper


порты:


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

протокол: TCP


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


политика перезапуска: всегда


dnsPolicy: Кластерфирст


schedulerName: планировщик по умолчанию


enableServiceLinks: правда


стратегия:


тип: RollingUpdate


Сохраните содержимое и выполните приведенную ниже команду, чтобы создать развертывание в пространстве имен kafka-example:


kubectl create -f zookeeper-deployment.yml --kubeconfig=


После успешного создания развертывания будет напечатан файл deployment.apps/example-zookeeper created. Следующим шагом будет создание и развертывание манифеста для Kafka. Создайте файл `kafka-deployment.yml и добавьте:


``ямл


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


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


метаданные:


имя: пример-кафка


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


этикетки:


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


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


реплики: 1


селектор:


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


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


шаблон:


метаданные:


этикетки:


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


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


контейнеры:


  • имя: пример-кафка

изображение: 'wurstmeister/кафка: 2.12-2.4.0'


порты:


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

протокол: TCP


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

протокол: TCP


среда:


  • имя: KAFKA_ADVERTISED_LISTENERS

значение: ВНУТРЕННЕЕ://:9092, ВНЕШНЕЕ://example-kafka.kafka-example.svc.cluster.local:9093


  • название: KAFKA_CREATE_TOPICS

значение: пример-тема: 1: 1


  • имя: KAFKA_INTER_BROKER_LISTENER_NAME

значение: ВНУТРЕННЕЕ


  • имя: KAFKA_LISTENERS

значение: ВНУТРЕННИЙ://:9092,ВНЕШНИЙ://:9093


  • имя: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP

значение: ВНУТРЕННИЙ:ПРОСТОЙ ТЕКТ,ВНЕШНИЙ:ПРОСТОЙ ТЕКТ


  • имя: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR

значение: «1»


  • имя: KAFKA_ZOOKEEPER_CONNECT

значение: пример-zookeeper.kafka-example.svc.cluster.local:2181


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


политика перезапуска: всегда


dnsPolicy: Кластерфирст


schedulerName: планировщик по умолчанию


enableServiceLinks: правда


стратегия:


тип: RollingUpdate


Сохраните и закройте файл. Подобно развертыванию Zookeeper, выполните в терминале команду ниже:


kubectl create -f kafka-deployment.yml --kubeconfig=


deployment.apps/example-kafka created должен был быть выведен на консоль. Последние два развертывания, которые необходимо создать, будут службами подписчика и издателя. Создайте publisher-deployment.yml с содержимым и обязательно замените <your_docker_hub_username> своим именем пользователя:


``ямл


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


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


метаданные:


имя: пример-издатель


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


этикетки:


приложение: пример-издатель


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


реплики: 1


селектор:


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


приложение: пример-издатель


шаблон:


метаданные:


этикетки:


приложение: пример-издатель


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


контейнеры:


  • имя: пример-издатель

изображение: '/publisher:latest'


imagePullPolicy: всегда


среда:


  • название: ОКРУЖАЮЩАЯ СРЕДА

значение: продукт


  • имя: EXTERNAL_KAFKA_ADDR

значение: пример-kafka.kafka-example.svc.cluster.local:9093


  • название: ТЕМА

значение: пример-тема


политика перезапуска: всегда


dnsPolicy: Кластерфирст


schedulerName: планировщик по умолчанию


enableServiceLinks: правда


стратегия:


тип: RollingUpdate


Запустите kubectl create -f publisher-deployment.yml --kubeconfig=`, чтобы создать развертывание для издателя, и убедитесь, что kubectl напечатает сообщение о том, что оно было создано.


Последнее развертывание, которое нужно создать, — это подписчик, который будет создан так же, как и другие службы. Создайте файл subscriber-deployment.yml и добавьте следующую конфигурацию, обязательно заменив <your_docker_hub_username>:


``ямл


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


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


метаданные:


имя: пример-подписчик


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


этикетки:


приложение: пример-подписчик


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


реплики: 1


селектор:


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


приложение: пример-подписчик


шаблон:


метаданные:


этикетки:


приложение: пример-подписчик


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


контейнеры:


  • имя: пример-подписчик

изображение: '/subscriber:latest'


imagePullPolicy: всегда


среда:


  • название: ОКРУЖАЮЩАЯ СРЕДА

значение: продукт


  • имя: EXTERNAL_KAFKA_ADDR

значение: пример-kafka.kafka-example.svc.cluster.local:9093


  • название: ТЕМА

значение: пример-тема


политика перезапуска: всегда


dnsPolicy: Кластерфирст


schedulerName: планировщик по умолчанию


enableServiceLinks: правда


стратегия:


тип: RollingUpdate


Для последнего развертывания создайте подписчика, запустив kubectl create -f subscriber-deployment.yml --kubeconfig=`. Если вы сейчас перейдете к панели управления Kubernetes для своего кластера, вы должны увидеть, что все четыре развертывания созданы, что, в свою очередь, создало четыре модуля. Каждый модуль запускает контейнер, указанный в поле изображения в соответствующем развертывании.


Подождите, пока сообщение об успешном выполнении будет напечатано на консоли. Теперь, когда все необходимые сервисы и развертывания созданы, не стесняйтесь переходить на панель инструментов Kubernetes, чтобы просмотреть запущенные модули. Перейдите к работающему модулю example-subscriber и просмотрите журналы, чтобы увидеть, что он использует сообщения из темы.


Если вы довольны своей работой и хотите уничтожить все ресурсы Kubernetes, которые вы только что создали, используйте следующую команду для очистки:


kubectl удалить пространство имен kafka-example --kubeconfig=


Вау! Это было немного сложно и требовало довольно много команд и файлов для запуска. Что, если бы все, что было сделано, можно было бы сжать в один короткий файл? Что, если бы весь стек можно было создать в Kubernetes с помощью одной команды? Продолжайте узнавать, насколько простым может быть развертывание ориентированного на Kafka стека как локально, так и в Kubernetes.


Запускайте Kafka локально с помощью Architect


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


``ямл


название: примеры/кафка


домашняя страница: https://github.com/architect-team/architect-cli/tree/master/examples/kafka


Сервисы:


работник зоопарка:


изображение: jplock/zookeeper


интерфейсы:


основной: 2181


кафка:


изображение: wurstmeister/kafka:2.12-2.4.0


интерфейсы:


внутренний: 9092


внешний: 9093


Окружающая среда:


KAFKA_ZOOKEEPER_CONNECT:


${{ services.zookeeper.interfaces.main.host }}:${{ services.zookeeper.interfaces.main.port


КАФКА_СЛУШАТЕЛИ:


ВНУТРЕННИЙ://:${{ services.kafka.interfaces.internal.port }},ВНЕШНИЙ://:${{


services.kafka.interfaces.external.port }}


KAFKA_ADVERTISED_LISTENERS:


ВНУТРЕННИЙ://:9092,ВНЕШНИЙ://${{ services.kafka.interfaces.external.host }}:${{


services.kafka.interfaces.external.port }}


KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: ВНУТРЕННИЙ: PLAINTEXT, ВНЕШНИЙ: PLAINTEXT


KAFKA_INTER_BROKER_LISTENER_NAME: ВНУТРЕННИЙ


KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1


KAFKA_CREATE_TOPICS: архитектор: 1:1


отлаживать:


тома:


докер:


путь_монтирования: /var/run/docker.sock


host_path: /var/run/docker.sock


Окружающая среда:


KAFKA_ADVERTISED_HOST_NAME: host.docker.internal # измените на 172.17.0.1, если работаете в Ubuntu


KAFKA_LISTENERS: ВНУТРЕННЯЯ //: 9092


KAFKA_ADVERTISED_LISTENERS: ВНУТРЕННИЙ://:9092


KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: ВНУТРЕННИЙ: PLAINTEXT


издатель:


строить:


контекст: ./издатель/


интерфейсы:


Окружающая среда:


ВНЕШНИЙ_КАФКА_АДДР:


${{ services.kafka.interfaces.external.host }}:${{ services.kafka.interfaces.external.port


ТЕМА: архитектор


ОКРУЖАЮЩАЯ СРЕДА: продукт


отлаживать:


Окружающая среда:


ВНУТРЕННИЙ_КАФКА_АДДР:


${{ services.kafka.interfaces.internal.host }}:${{ services.kafka.interfaces.internal.port


СРЕДА: местная


подписчик:


строить:


контекст: ./подписчик/


интерфейсы:


Окружающая среда:


ВНЕШНИЙ_КАФКА_АДДР:


${{ services.kafka.interfaces.external.host }}:${{ services.kafka.interfaces.external.port


ТЕМА: архитектор


ОКРУЖАЮЩАЯ СРЕДА: продукт


отлаживать:


Окружающая среда:


ВНУТРЕННИЙ_КАФКА_АДДР:


${{ services.kafka.interfaces.internal.host }}:${{ services.kafka.interfaces.internal.port


СРЕДА: местная


Скопируйте и вставьте указанный выше yml в файл с именем "architect.yml" в корневом каталоге проекта. Чтобы запустить компонент Kafka локально, выполните приведенную ниже команду в корневом каталоге проекта:


Архитектор Dev architect.yml


В консоль должна быть выведена та же информация, что и при непосредственном запуске стека с помощью docker-compose. Когда будете готовы, нажмите Ctrl/Cmd+C, чтобы остановить работающее приложение.


Как упоминалось ранее, компонент Architect можно развернуть как локально, так и в любой облачной среде. Нажмите здесь, чтобы развернуть пример компонента Kafka в размещенной облачной службе Architect.


Несколько кликов и все! Тот же стек, который можно запустить локально, работает в кластере Kubernetes в облаке. Если вы хотите узнать больше, не стесняйтесь зарегистрировать свой собственный кластер в качестве платформы в Architect Cloud!


Узнайте больше о безопасных и быстрых развертываниях с помощью Docker и Architect


Kafka — это мощное, но сложное приложение, которое требует тщательной настройки для правильной работы. К счастью, есть несколько надежных инструментов, таких как docker-compose и Architect, которые обеспечивают плавное развертывание локально и в облаке.


Если вы хотите узнать больше о том, как Architect может помочь вам ускорить как локальное, так и удаленное развертывание, ознакомьтесь с документами и зарегистрируйтесь!


Чтобы узнать больше, ознакомьтесь с некоторыми из наших других руководств!



  • [Разверните приложение Django с помощью Docker] (https://www.architect.io/blog/django-docker-tutorial)

  • [Руководство разработчика по GitOps] (https://www.architect.io/blog/gitops-developers-guide)

Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь обращаться к команде в Твиттере @architect_team!


Также опубликовано [здесь] (https://www.architect.io/blog/2021-01-26/kafka-docker-tutorial/).



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