Легкий запуск Kafka в Kubernetes з Strimzi

pic

Зміст

· Вступ
· Що таке Strimzi?
· Чому Strimzi?
· Ключові функції Strimzi
· Початок роботи з простим сценарієм
Встановлення Strimzi з Helm
Створення Kafka за допомогою Yaml
Створення Топіка за допомогою Yaml
Створення користувача за допомогою Yaml
Відправка повідомлень до кластеру Kafka
· Висновки
· Посилання

Вступ

Apache Kafka є важливим інструментом для сучасних архітектур, орієнтованих на події, оскільки він забезпечує масштабовану та надійну обробку потоку даних. Але, давайте будемо відверті, налаштування та управління кластерами Kafka може бути головним болем, особливо в динамічних середовищах, таких як Kubernetes. Ось тут і приходить на допомогу Strimzi — проект з відкритим кодом, який значно полегшує роботу з Kafka на Kubernetes.

Що таке Strimzi?

Strimzi надає простий спосіб використовувати Kubernetes для налаштування та управління необмеженою кількістю кластерів Apache Kafka. Це забезпечує інструменти, оператори та CRD (Custom Resource Definitions), які допомагають інтегрувати Kafka в вашу екосистему Kubernetes. Втім, ви також можете використовувати ці Kafka поза Kubernetes, оскільки це працює так само, як звичайний Kafka.

Незалежно від того, чи є ви досвідченим користувачем Kafka, чи тільки починаєте, Strimzi абстрагує більшу частину операційної роботи, дозволяючи вам зосередитись на розробці та запуску ваших додатків.

Чому Strimzi?

Можливо, ви вже зрозуміли, чому Strimzi такий корисний у середовищах Kubernetes, але ось перелік його переваг:

  • Легкість в розгортанні: Strimzi автоматизує розгортання кластерів Kafka через Kubernetes манифести, що спрощує створення та обслуговування кластерів через зміну манифестів.
  • Масштабованість: Горизонтальне масштабування є простим, з можливістю динамічного налаштування кількості брокерів Kafka.
  • Моніторинг та спостережуваність: Strimzi інтегрується з Prometheus та Grafana для надання метрик та панелей моніторингу «з коробки».
  • Безпека: Підтримка TLS-шифрування, механізмів автентифікації та детальних механізмів авторизації.
  • Користувацькі ресурси: З допомогою CRD ви можете легко визначити кластери Kafka, топіки, користувачів та інші ресурси через прості YAML файли.

Ключові функції Strimzi

Хоча Strimzi має багато ключових функцій, ось найбільш відомі:

  • Kafka Operators: Автоматизує управління кластерами Kafka, включаючи налаштування, оновлення конфігурацій та постійне оновлення.
  • Управління топіками: Керування топіками Kafka безпосередньо через ресурси Kubernetes.
  • Управління користувачами: Керування користувачами Kafka та налаштування їх ACL без необхідності вручну.
  • Kafka Connect: Розгортання та масштабування кластерів Kafka Connect для інтеграції з зовнішніми системами, такими як Mongodb.
  • Мульти-орендність: Підтримка управління кількома кластерами Kafka в одному середовищі Kubernetes.

Початок роботи з простим сценарієм

Цей сценарій буде включати кластер Kafka з kraft (де кожен вузол є як брокером, так і контролером).

Для цього сценарію у нас є:

  • кластер на k3s
  • longhorn для надання PVC
  • Metallb для надання ExternalIPs (це буде як у EKS, що надає публічний IP)
  • Helm та Kubectl встановлені локально

Встановлення Strimzi з Helm

Для цього встановлення буде використовуватися Helm.
Для цього ми встановлюємо репозиторій на нашому комп’ютері та встановлюємо chart на наш кластер.

kubectl create ns strimzi  

helm repo add strimzi https://strimzi.io/charts/   

helm upgrade --install strimzi-kafka-operator strimzi/strimzi-kafka-operator \  
 --namespace strimzi \  
 --set watchAnyNamespace=true

В цій установці спостерігаються всі простори імен, щоб працювати в усьому кластері.

Створення Kafka за допомогою Yaml

apiVersion: kafka.strimzi.io/v1beta2  
kind: KafkaNodePool  
metadata:  
 name: kafka  
 namespace: kafka-tutorial  
 labels:  
 strimzi.io/cluster: prod-cluster  
spec:  
 replicas: 3  
 roles:  
 - broker  
 - controller  
 storage:  
 type: jbod  
 volumes:  
 - id: 0  
 type: persistent-claim  
 size: 15Gi  
 deleteClaim: true

Цей YAML визначає ресурс KafkaNodePool для кластера Kafka, керованого Strimzi. Ось коротке пояснення:

  • Кластер: Частина Kafka кластера prod-cluster в просторі імен kafka-tutorial.
  • Вузли: 3 репліки, які виконують функції як брокерів, так і контролерів.
  • Зберігання: Налаштування JBOD з постійним зберіганням 15Gi на кожен вузол; зберігання видаляється при видаленні пулу вузлів. Клас зберігання буде тим, що ви маєте за замовчуванням. У моєму випадку буде використовуватися клас зберігання longhorn.

Це налаштовує масштабовану групу вузлів, забезпечених зберіганням для Kafka.

Тепер час створити Kafka, використовуючи попередній KafkaNodePool.

apiVersion: kafka.strimzi.io/v1beta2  
kind: Kafka  
metadata:  
 name: prod-cluster  
 namespace: kafka-tutorial  
 annotations:  
 strimzi.io/node-pools: enabled  
 strimzi.io/kraft: enabled  
spec:   
 kafka:  
 config:  
 offsets.topic.replication.factor: 3  
 transaction.state.log.replication.factor: 3  
 transaction.state.log.min.isr: 2  
 default.replication.factor: 3  
 min.insync.replicas: 2  
 authorization:  
 type: simple  
 listeners:  
 - name: plain  
 port: 9092  
 type: internal  
 tls: false  
 - name: sha  
 port: 9093  
 type: loadbalancer  
 tls: true  
 authentication:  
 type: scram-sha-512  
 version: 3.9.0  
 metadataVersion: 3.9-IV0  
 entityOperator:  
 userOperator: {}  
 topicOperator: {}

Цей YAML визначає ресурс Kafka для кластера Kafka, керованого Strimzi. Ось коротке пояснення:

  • Кластер: Визначає Kafka кластер prod-cluster в просторі імен kafka-tutorial.
  • Node Pools: Увімкнено (strimzi.io/node-pools: enabled).
  • KRaft режим: Увімкнено (strimzi.io/kraft: enabled), використовується вбудований контролер Kafka замість ZooKeeper.
  • Конфігурація: (Тут можна налаштувати всі конфігурації Kafka)
  • Реплікація: Топіки та логи мають фактор реплікації 3; мінімальна кількість реплік в синхронному стані (ISR) - 2.
  • Авторизація: Проста авторизація. Тут можна налаштувати суперкористувача. Я створю користувача і потім створю ACL для цього користувача.
  • Слухачі:
  • Plain (без TLS) на порту 9092, тільки внутрішні.
  • SCRAM-SHA-512 з балансувальником навантаження на порту 9093. Без TLS в цьому випадку, щоб уникнути перевірки DNS, але для середовищ виробництва налаштуйте це як
  • Версія Kafka: 3.9.0 (версія метаданих 3.9-IV0).
  • Оператори сутностей (це досить важливо для створення користувачів всередині кластера):
    userOperator: Керує користувачами Kafka.
    topicOperator: Керує топіками Kafka.

Після того як ви виконаєте манифести в вашому кластері Kubernetes, ви побачите ці контейнери в бажаному просторі імен (ці картинки зроблені за допомогою Lens, але ви можете використовувати команду _kubectl get pods -n _):

pic

Список подів, створених Strimzi

І, звісно, ви побачите сервіси, прикріплені до подів.
Якщо ви відкрили сервіси через loadbalancer (у моєму випадку metallb), ви побачите 4 ExternalIPs, 1 для сервісу bootstrap і 3 для кожного поду.

pic

Список сервісів, створених Strimzi

Створення Топіка з використанням Yaml

Тепер ми створимо топік під назвою topic-tutorial (я дуже креативний, коли створюю такі туторіали)

apiVersion: kafka.strimzi.io/v1beta2  
kind: KafkaTopic  
metadata:  
 name: tutorial-topic  
 namespace: kafka-tutorial  
 labels:  
 strimzi.io/cluster: prod-cluster  
spec:  
 partitions: 1  
 replicas: 2  
 config:  
 retention.ms: 7200000  
 segment.bytes: 1073741824
  • Назва топіка: tutorial-topic, створено в просторі імен kafka-tutorial.
  • Кластер: Асоційовано з Kafka кластером prod-cluster (strimzi.io/cluster: prod-cluster).
  • Конфігурація (звісно, це тільки приклад для цього туторіалу, використовуйте конфігурацію для вашого випадку):
  • Розділи: 1 розділ для топіка.
  • Репліки: 2 репліки для забезпечення відмовостійкості.
  • Зберігання: Повідомлення зберігаються протягом 7200000 мілісекунд (2 години).
  • Розмір сегмента: Логи обмежені розміром 1 GiB (1073741824 байт).

Створення Користувача з використанням Yaml

Це буде користувач, якого ми використовуватимемо для прикладу, який ми створили. Цей користувач отримав дозволи для топіка, який ми створили раніше.

apiVersion: kafka.strimzi.io/v1beta2  
kind: KafkaUser  
metadata:  
 name: tutorial-user  
 namespace: kafka-tutorial # Замініть на ваш реальний простір імен  
 labels:  
 strimzi.io/cluster: prod-cluster  
spec:  
 authentication:  
 type: scram-sha-512  
 # Пароль буде автоматично згенерований і збережений в Kubernetes Secret  
 authorization:  
 type: simple  
 acls:  
 - resource:  
 type: topic  
 name: "tutorial-topic"  
 patternType: literal  
 operation: Write  
 host: "*"  
 - resource:  
 type: topic  
 name: "tutorial-topic"  
 patternType: literal  
 operation: Read  
 host: "*"  
 - resource:  
 type: group  
 name: "*"  
 patternType: literal  
 operation: Read  
 host: "*"
  • Назва користувача: tutorial-user, створено в просторі імен kafka-tutorial.
  • Кластер: Асвійствовано з Kafka кластером prod-cluster (strimzi.io/cluster: prod-cluster).
  • Авторизація: scram-sha-512. Пароль користувача буде автоматично згенерований і збережений у Kubernetes Secret.
  • Авторизація: simple. ACL для користувача. Як згадувалося раніше

Для використання користувача, потрібно скористатися паролем, згенерованим оператором сутностей.

Отримати пароль за допомогою команди:

kubectl get secret tutorial-user -o jsonpath='{.data.password}' | base64 --decode

Або ви побачите в вашому адміністративному інтерфейсі щось подібне:

pic

Надсилання повідомлень до Kafka кластера

Для цього кроку нам потрібен пароль та IP нашого bootstrap сервера (у моєму випадку 192.168.1.31, отриманий через metallb).

Я не буду пояснювати весь код, але його суть — це надсилання повідомлень нескінченно до створеного Kafka сервера з конфігурацією, яку ми налаштували. Клієнт не використовує SSL і підключається через bootstrap сервер.

Ви побачите щось подібне:

pic

Логи з producer скрипта

Висновки

Використання Strimzi може кардинально змінити спосіб керування Apache Kafka в Kubernetes. Це спрощує складні завдання, зміцнює безпеку та плавно інтегрується з Kubernetes-орієнтованими робочими процесами. Це дозволяє командам витрачати менше часу на операційну роботу і більше на максимальне використання можливостей Kafka.

Якщо ви модернізуєте свою інфраструктуру або масштабуєте події, Strimzi є надійним і ефективним вибором.
Чи ви тільки починаєте працювати з Kafka, чи вже маєте досвід, Strimzi завдяки своїй гнучкості та простоті використання є відмінним вибором для запуску Kafka в Kubernetes.

Посилання

[

Strimzi - Apache Kafka в Kubernetes

Strimzi надає спосіб запуску Apache Kafka кластера в Kubernetes в різних конфігураціях розгортання.

strimzi.io

](https://strimzi.io/?source=post_page-----7e939f37ed43--------------------------------)

Перекладено з: Making Kafka on Kubernetes Easy with Strimzi

Leave a Reply

Your email address will not be published. Required fields are marked *