Олег Марков
Установка и настройка Kafka в Kubernetes
Введение
Apache Kafka — одна из самых популярных распределённых платформ потоковой обработки данных с высокой производительностью. Но чтобы использовать Kafka на практике в современных облачных инфраструктурах, всё чаще возникает задача установить и настроить её в Kubernetes. Такой подход позволяет легко управлять масштабируемостью, обновлениями и высоким уровнем отказоустойчивости.
В этой статье я подробно покажу, как развернуть Kafka кластер в Kubernetes, объясню необходимые концепции, проведу через настройку Helm-чартов и Persistent Volume, разберу варианты конфигурации и поделюсь с вами примерами кодов манифестов. Так вы сможете быстро и уверенно внедрить Kafka в ваш Kubernetes-кластер.
Что такое Kafka и зачем её устанавливать в Kubernetes
Обзор Kafka
Kafka — это распределённый брокер сообщений, предназначенный для передачи, хранения и обработки больших объёмов потоковых данных в реальном времени. С её помощью приложения обмениваются сообщениями с малой задержкой, сохраняя устойчивость даже при нагрузках.
Почему Kubernetes
Kubernetes — это система управления контейнерами, которая автоматизирует развертывание и масштабирование приложений. Если вы уже используете Kubernetes или переходите на контейнеризацию, разворачивать Kafka в этой среде удобно по нескольким причинам:
- Автоматическое распределение нагрузки между брокерами.
- Легко добавлять или удалять узлы.
- Мониторинг, логи и восстановление работают из коробки.
- Гибкая интеграция с Persistent Volume для стабильного хранения данных.
Подходы к развертыванию Kafka в Kubernetes
Смотрите, вы можете развернуть Kafka в Kubernetes двумя основными способами:
- Ручное создание манифестов Kubernetes для каждого компонента Kafka — требует больше усилий, но даёт полный контроль.
- Использование Helm-чартов — самый быстрый, масштабируемый и надёжный способ, особенно если вы только начинаете работу с Kafka в Kubernetes.
В этой статье я буду использовать второй способ — Helm-чарты, потому что это действительно сильно облегчает процесс. Если вы хотите затем углубиться и разобраться с ручным развертыванием, этот опыт вам тоже пригодится.
Предварительные требования
Перед началом убедитесь, что у вас есть следующее:
- Доступ к рабочему Kubernetes-кластеру (например, minikube, kind, GKE, EKS или другой).
- Установлен kubectl для управления кластером.
- Helm версии 3 и выше.
- Доступ к интернету для скачивания чартов и образов.
Проверьте подключение к кластеру:
kubectl get nodes
# Этот вывод покажет активные узлы Kubernetes
Если команда отработала, можете двигаться дальше.
Установка Helm
Если у вас ещё не установлен Helm, вот быстрая инструкция:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# Эта команда скачает и установит Helm 3
Проверьте установку:
helm version
# Вы увидите версию Helm, если всё прошло успешно
Добавляем Helm репозиторий с Kafka
Самый популярный и поддерживаемый Helm-чарт для Kafka — это bitnami/kafka. Давайте добавим этот репозиторий.
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# Теперь вы можете использовать Helm-чарты Bitnami для установки Kafka
Развёртывание Kafka через Helm
Теперь приступим к самой установке. Для начала стоит определиться с namespace.
kubectl create namespace kafka
# Создаём отдельное пространство имён для удобства
Далее устанавливаем Kafka:
helm install my-kafka bitnami/kafka --namespace kafka
# Эта команда поднимет Kafka с настройками по умолчанию в вашем кластере
Вывод покажет статус установки и значения по умолчанию.
Если хотите предварительно посмотреть параметры чарта:
helm show values bitnami/kafka > kafka-values.yaml
# Сохраняем значения чарта для дальнейшей настройки
Кастомизация Helm-чарта Kafka
Применение настроек по умолчанию подходит для быстрого старта, но для надёжной работы нужны дополнительные параметры — например, настройка хранения данных, количества брокеров, ресурсов и параметров безопасности.
Редактируйте файл kafka-values.yaml
. Вот пример такого файла с самыми важными параметрами:
replicaCount: 3 # Количество брокеров Kafka
auth:
enabled: true # Включить аутентификацию
sasl:
mechanism: scram-sha-256
jaas:
clientUser: user # Имя пользователя
clientPassword: password # Пароль (используется для теста, для PROD лучше через secret)
persistence:
enabled: true
size: 10Gi # Размер хранилища под брокера
storageClass: "standard" # StorageClass для Persistent Volume
resources:
requests:
memory: 1Gi
cpu: 500m
limits:
memory: 2Gi
cpu: 1
Здесь вы задаёте три брокера, защищённое подключение и включаете постоянное хранилище (данные не теряются при рестарте подов).
Устанавливаем Kafka с этим файлом:
helm install my-kafka -f kafka-values.yaml bitnami/kafka --namespace kafka
Проверка установки
Как только Helm-чарт развернётся, проверьте статус подов:
kubectl get pods -n kafka
# Должны быть запущены поды my-kafka-0, my-kafka-1 и my-kafka-2 и Zookeeper
Теперь проверьте сервисы:
kubectl get svc -n kafka
# Вы увидите kafka, zookeeper, headless сервисы
Настройка хранилища (Persistent Volume)
Kafka хранит состояние — все сообщения, поэтому очень важно настроить персистентное хранилище.
В примере выше мы задали размер и StorageClass через Helm. Kubernetes сам создаст нужные PersistentVolumeClaim для каждого брокера. Вот как вы можете проверить их:
kubectl get pvc -n kafka
# Вы увидите PVC с именем my-kafka-0, my-kafka-1 и т. д.
Если кластер локальный (например, minikube), иногда вручную приходится создавать StorageClass или тестировать на стандартном. В облачных кластерах (GKE, EKS) StorageClass для SSD или HDD обычно уже есть.
Доступ к Kafka внутри и вне кластера
Доступ из подов Kubernetes
Обычно приложения, работающие в том же кластере Kubernetes, используют DNS-имена сервисов Kafka для подключения. Пример подключения:
- Адрес брокера будет выглядеть как:
my-kafka.kafka.svc.cluster.local:9092
Доступ извне — порт-форвардинг
Иногда вам нужно протестировать Kafka локально с вашего компьютера. Проще всего воспользоваться port-forward:
kubectl port-forward svc/my-kafka 9092:9092 -n kafka
# Теперь на вашей машине порт 9092 проброшен в Kafka внутри кластера
Доступ извне — LoadBalancer или NodePort
Если в кластере настроен Ingress, LoadBalancer или NodePort, сможете пробросить порт наружу для production-сценариев, настроив эти параметры в чарте Helm (например, через параметры service.type=LoadBalancer).
Настройка Zookeeper
Kafka требует Zookeeper для своей работы. В популярных Helm-чартах он разворачивается вместе с Kafka автоматически, но иногда вы захотите вынести его отдельно — например, если у вас несколько Kafka-кластеров. Для основной работы достаточно дефолтных настроек.
Управление и масштабирование кластера Kafka
Для увеличения или уменьшения количества брокеров Kafka отредактируйте параметр replicaCount
в файле конфигурации:
replicaCount: 5
И примените изменения командой:
helm upgrade my-kafka -f kafka-values.yaml bitnami/kafka --namespace kafka
# Helm добавит или уберёт нужное количество брокеров
Kubernetes автоматически создаст дополнительные поды и Persistent Volume Claims.
Обновление чарта и конфигурации
Helm позволяет обновлять чарт или параметры без ручной пересборки всего кластера:
# Например, меняем аутентификацию или ресурсы:
helm upgrade my-kafka -f kafka-values.yaml bitnami/kafka --namespace kafka
Если в чарте появились новые версии, их можно подтянуть:
helm repo update
helm upgrade my-kafka bitnami/kafka --namespace kafka
Мониторинг Kafka в Kubernetes
Не забывайте о мониторинге! В Bitnami-чарте для Kafka предусмотрена поддержка Prometheus и Grafana. Например, чтобы включить метрики:
metrics:
kafka:
enabled: true
zookeeper:
enabled: true
Теперь метрики можно собирать через Prometheus и визуализировать в Grafana.
Резервное копирование данных Kafka
Для резервного копирования в Kubernetes обычно используют снапшоты Persistent Volume или сторонние решения на уровне StorageClass. Проверьте документацию вашего облачного провайдера или используйте такие инструменты, как Velero.
Пример манифеста Helm-чарта Kafka с комментариями
Смотрите, я привожу почти полный пример values.yaml с комментариями — его можно взять за основу:
replicaCount: 3 # Задаёт количество брокеров Kafka
image:
tag: 3.5.1 # Версия Kafka (важно для совместимости)
auth:
enabled: true
sasl:
mechanism: scram-sha-512
jaas:
clientUser: testuser # Пользователь для SASL
clientPassword: testpass # Пароль (в реальной работе переместите в Secret)
persistence:
enabled: true
size: 10Gi # Размер хранилища для каждого брокера
storageClass: "fast-ssd"
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
service:
type: ClusterIP # Для внутреннего доступа. Для внешнего используйте LoadBalancer или NodePort
zookeeper:
enabled: true
replicaCount: 3 # Можно уменьшить на тесте до 1 для экономии ресурсов
metrics:
kafka:
enabled: true
zookeeper:
enabled: true
Заключение
Установка и настройка Kafka в Kubernetes с помощью Helm — это не только быстро, но и удобно, особенно если вам нужна масштабируемость, надежность и легкость процессов поддержки. С помощью правильных параметров в values-файле вы уже можете развернуть надёжный кластер Kafka с устойчивым хранением, защитой и средствами мониторинга.
Kubernetes забирает на себя инфраструктурные задачи, а Kafka продолжает выполнять свою ключевую функцию — обеспечивать высокоскоростную и надежную передачу сообщений между сервисами.
Частозадаваемые технические вопросы по теме статьи и ответы на них
1. Как настроить Kafka на работу без Zookeeper в Kubernetes (KRaft mode)?
Сначала убедитесь, что вы используете версию Kafka 2.8 и выше. Для этого задайте в чарте Helm параметры:
yaml
kraft:
enabled: true # Включаем KRaft mode
zookeeper:
enabled: false # Отключаем автоматический запуск Zookeeper
Примечание: в Bitnami-чарте поддержка KRaft может быть экспериментальной. Проверьте документацию чарта и Kafka версии перед продакшн использованием.
2. Как изменить конфигурацию логирования Kafka в Helm-чарте?
Вызовите:
yaml
log4j:
existingConfigmap: kafka-log4j-config
Затем создайте в кластере свой configmap с нужным файлом log4j.properties. Примените его к вашей установке — теперь Kafka будет читать параметры логирования из вашего configmap.
3. Как настроить TLS для защищённого соединения с Kafka?
В чарте Bitnami это можно сделать через параметр:
yaml
auth:
tls:
enabled: true
existingSecret: kafka-tls-secret # Секрет с вашими сертификатами TLS
Создайте Kubernetes Secret с приватными ключами и сертификатами — подробно это описано в документации Helm-чарта.
4. Как выставить лимит на размер логов топиков или ротацию логов?
Вам нужно добавить в values.yaml опции:
yaml
logRetentionBytes: 10737418240 # 10GB
logRetentionHours: 168 # 7 дней
Kafka автоматически удалит старые сообщения, если выполняется одно из этих условий.
5. Как восстановить Kafka кластер после падения одного или нескольких брокеров?
Kubernetes и Helm-чарт настроят новые поды автоматически, а Persistent Volume сохранит данные, если storage не разрушен. После восстановления все сообщения будут доступны — кластеры Kafka проектированы так, чтобы переживать такие сбои практически без потери данных. Если что-то пошло не так — проверьте PVC и состояние репликации топиков.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев