Зміст
· Вступ
· Що таке 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 _):
Список подів, створених Strimzi
І, звісно, ви побачите сервіси, прикріплені до подів.
Якщо ви відкрили сервіси через loadbalancer (у моєму випадку metallb), ви побачите 4 ExternalIPs, 1 для сервісу bootstrap і 3 для кожного поду.
Список сервісів, створених 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
Або ви побачите в вашому адміністративному інтерфейсі щось подібне:
Надсилання повідомлень до Kafka кластера
Для цього кроку нам потрібен пароль та IP нашого bootstrap сервера (у моєму випадку 192.168.1.31, отриманий через metallb).
Я не буду пояснювати весь код, але його суть — це надсилання повідомлень нескінченно до створеного Kafka сервера з конфігурацією, яку ми налаштували. Клієнт не використовує SSL і підключається через bootstrap сервер.
Ви побачите щось подібне:
Логи з 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