Разверните свое приложение с помощью 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
На вашем локальном компьютере теперь есть образ Docker с тегом
Теперь нажмите на изображение с тегом с помощью команды:
docker push
Ваше пользовательское изображение теперь общедоступно в Интернете! Перейдите к https://hub.docker.com/repository/docker/<your_docker_hub_username>/publisher
и войдите в систему, если хотите его просмотреть.
Теперь перейдите в папку subscriber
и сделайте то же самое для службы подписки с помощью двух похожих команд:
сборка докера. -t
docker push
Все образы, необходимые для запуска стека в кластере 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
селектор:
метки соответствия:
приложение: пример-издатель
шаблон:
метаданные:
этикетки:
приложение: пример-издатель
спецификация:
контейнеры:
- имя: пример-издатель
изображение: '
imagePullPolicy: всегда
среда:
- название: ОКРУЖАЮЩАЯ СРЕДА
значение: продукт
- имя: EXTERNAL_KAFKA_ADDR
значение: пример-kafka.kafka-example.svc.cluster.local:9093
- название: ТЕМА
значение: пример-тема
политика перезапуска: всегда
dnsPolicy: Кластерфирст
schedulerName: планировщик по умолчанию
enableServiceLinks: правда
стратегия:
тип: RollingUpdate
Запустите kubectl create -f publisher-deployment.yml --kubeconfig=
Последнее развертывание, которое нужно создать, — это подписчик, который будет создан так же, как и другие службы. Создайте файл subscriber-deployment.yml
и добавьте следующую конфигурацию, обязательно заменив <your_docker_hub_username>
:
``ямл
вид: развертывание
apiVersion: приложения/v1
метаданные:
имя: пример-подписчик
пространство имен: kafka-пример
этикетки:
приложение: пример-подписчик
спецификация:
реплики: 1
селектор:
метки соответствия:
приложение: пример-подписчик
шаблон:
метаданные:
этикетки:
приложение: пример-подписчик
спецификация:
контейнеры:
- имя: пример-подписчик
изображение: '
imagePullPolicy: всегда
среда:
- название: ОКРУЖАЮЩАЯ СРЕДА
значение: продукт
- имя: EXTERNAL_KAFKA_ADDR
значение: пример-kafka.kafka-example.svc.cluster.local:9093
- название: ТЕМА
значение: пример-тема
политика перезапуска: всегда
dnsPolicy: Кластерфирст
schedulerName: планировщик по умолчанию
enableServiceLinks: правда
стратегия:
тип: RollingUpdate
Для последнего развертывания создайте подписчика, запустив kubectl create -f subscriber-deployment.yml --kubeconfig=
Подождите, пока сообщение об успешном выполнении будет напечатано на консоли. Теперь, когда все необходимые сервисы и развертывания созданы, не стесняйтесь переходить на панель инструментов 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/).
Оригинал