Configuração do Kafka
O chart tdp-kafka implanta um cluster Apache Kafka gerenciado pelo operador Strimzi, além de uma interface web (Kafka UI) e suporte a conectores Debezium via Kafka Connect.
Visão geral
| Propriedade | Valor |
|---|---|
| Chart | tdp-kafka |
| Kafka | 4.1.0 |
| Versão do Chart | 3.0.0 |
O que é o Strimzi?
O Strimzi é um operador Kubernetes especializado no ciclo de vida de clusters Kafka. Em vez de gerenciar processos Kafka manualmente, o Strimzi traduz recursos Kubernetes nativos (como KafkaNodePool e Kafka) em brokers configurados, monitorados e atualizados de forma declarativa.
A versão 4.1.0 do chart tdp-kafka opera no modo KRaft (Kafka sem ZooKeeper), disponível desde o Kafka 3.3 e padrão a partir do Kafka 3.7. O KRaft elimina a dependência do ZooKeeper, simplificando a topologia e reduzindo a latência de operações de metadados.
Consulte Apache Kafka — Conceitos para uma visão completa da ferramenta, sua arquitetura e funcionamento.
Componentes implantados
| Componente | Descrição |
|---|---|
| Cluster Kafka | Brokers e controllers gerenciados pelo Strimzi via KafkaNodePool |
| Entity Operator | Gerencia KafkaTopic e KafkaUser como recursos Kubernetes |
| Kafka UI | Interface web para monitoramento, navegação de tópicos e mensagens |
| Kafka Connect | Infraestrutura para conectores Debezium (CDC) — opcional |
Pré-requisitos
- Kubernetes 1.27+
- Helm 3.2.0+
- StorageClass disponível com capacidade suficiente para os volumes dos brokers
Instalação (OCI)
helm install <release> \
oci://registry.tecnisys.com.br/tdp/charts/tdp-kafka \
-n <namespace> --create-namespace
Configuração do cluster Kafka
Node Pool
No Strimzi com KRaft, os nós do cluster são declarados em Node Pools (KafkaNodePool). Cada pool define a quantidade de réplicas, os papéis exercidos pelos nós e o armazenamento.
nodePool:
name: brokers
replicas: 4
roles: ["controller", "broker"]
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: true
kraftMetadata: shared
| Campo | Descrição |
|---|---|
roles | Um nó pode ser controller, broker ou ambos. Em clusters pequenos, combine os dois papéis. Em clusters grandes, separe-os em pools distintos |
storage.type: jbod | JBOD (Just a Bunch of Disks) permite múltiplos volumes por nó, maximizando throughput de I/O |
deleteClaim: true | Os PVCs serão excluídos ao remover o NodePool. Defina false em produção se quiser preservar os dados |
kraftMetadata: shared | Indica que este volume também armazena metadados KRaft |
Com 4 réplicas combinando controller e broker, o quórum KRaft e a replicação de dados coexistem nos mesmos nós. Para cargas intensas, considere pools separados: um pool de controllers (3 réplicas) e um pool de brokers (quantos forem necessários).
Versão e metadados
name: tdp-kafka
kafkaVersion: 4.1.0
metadataVersion: 4.1-IV1
clusterLabel: "tdp"
O campo metadataVersion corresponde ao inter-broker protocol version do KRaft. Mantenha-o alinhado à kafkaVersion durante instalações novas. Em atualizações, aumente apenas após todos os brokers estarem na nova versão.
Listeners
Os listeners definem os pontos de entrada do cluster para produtores e consumidores.
listeners:
plain:
enabled: true
port: 9092
tls:
enabled: true
port: 9093
| Listener | Porta | Quando usar |
|---|---|---|
plain | 9092 | Comunicação interna ao cluster, ambientes de desenvolvimento ou redes privadas confiáveis |
tls | 9093 | Comunicação sobre redes não confiáveis ou quando clientes exigem criptografia em trânsito |
O nome do serviço de bootstrap segue a convenção Strimzi: <name>-kafka-bootstrap. Exemplo com o nome padrão tdp-kafka:
- Plain:
tdp-kafka-kafka-bootstrap:9092 - TLS:
tdp-kafka-kafka-bootstrap:9093
Replicação e durabilidade
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
Estes parâmetros determinam o equilíbrio entre durabilidade e disponibilidade:
| Parâmetro | Significado |
|---|---|
default.replication.factor: 3 | Cada tópico terá 3 cópias distribuídas em brokers distintos |
min.insync.replicas: 2 | Um produtor com acks=all só recebe confirmação quando ao menos 2 réplicas estiverem sincronizadas. Tolera a perda de 1 broker sem perda de dados |
offsets.topic.replication.factor: 3 | Controla a durabilidade dos offsets dos consumidores (tópico interno __consumer_offsets) |
transaction.state.log.* | Durabilidade do log de transações (produção transacional / exactly-once) |
Em ambientes com menos de 3 brokers, reduza *.replication.factor e min.insync.replicas ao número real de nós. Manter fatores maiores que o número de brokers impede a criação de tópicos.
Entity Operator
entityOperator:
enabled: true
O Entity Operator é um componente do Strimzi que observa recursos KafkaTopic e KafkaUser no namespace e os reconcilia com o cluster. Com ele habilitado, tópicos e usuários podem ser gerenciados de forma declarativa como manifests Kubernetes, sem acesso direto à API administrativa do Kafka.
Kafka UI
O Kafka UI oferece uma interface gráfica para inspecionar tópicos, visualizar mensagens, monitorar grupos de consumidores e acompanhar métricas básicas do cluster.
kafka-ui:
enabled: true
yamlApplicationConfig:
kafka:
clusters:
- name: TDP
bootstrapServers: <kafka-cluster-name>-kafka-bootstrap:9092
properties:
security.protocol: PLAINTEXT
auth:
type: LOGIN_FORM
spring:
security:
user:
name: admin
password: <ui-password>
service:
type: ClusterIP
port: 80
nodePort: 30081
Substitua <kafka-cluster-name> pelo valor de name definido no cluster (ex.: tdp-kafka) e <ui-password> por uma senha segura.
A senha admin (padrão do chart) não deve ser mantida em ambientes acessíveis fora da rede interna. Troque antes de expor a interface.
Acesso
Port-forward (Kafka UI)
kubectl port-forward -n <namespace> svc/kafka-ui 8080:80
Acesse em http://localhost:8080.
NodePort (Kafka UI)
kubectl get nodes -o wide
Acesse em http://<node-ip>:30081 (ou a porta configurada em service.nodePort).
Bootstrap para produtores e consumidores
# Plain
<kafka-cluster-name>-kafka-bootstrap:9092
# TLS
<kafka-cluster-name>-kafka-bootstrap:9093
Kafka Connect / Debezium
O chart suporta conectores Debezium para captura de dados em tempo real (CDC) a partir de bancos relacionais. A configuração é feita sob kafkaConnects.*.
Consulte Integrações — Kafka para exemplos completos de cada tipo de conector (PostgreSQL, MySQL, SQL Server, Oracle) e gestão de credenciais.
Autenticação da UI
Consulte Segurança — Kafka para configurar autenticação LOGIN_FORM ou LDAP na interface web.
Solução de problemas
# Status dos pods do cluster
kubectl -n <namespace> get pods -l cluster=tdp
# Estado do cluster Kafka (recurso CRD)
kubectl -n <namespace> get kafkas
# Logs da Kafka UI
kubectl -n <namespace> logs -l app.kubernetes.io/name=kafka-ui
# Estado dos conectores Debezium
kubectl -n <namespace> get kafkaconnectors
# Detalhes do cluster
kubectl -n <namespace> describe kafka <kafka-cluster-name>
Desinstalação
helm uninstall <release> -n <namespace>
Parâmetros principais
| Parâmetro | Descrição | Valor padrão |
|---|---|---|
name | Nome do cluster Kafka | tdp-kafka |
kafkaVersion | Versão do Kafka | 4.1.0 |
metadataVersion | Versão de metadados KRaft | 4.1-IV1 |
clusterLabel | Label do cluster | tdp |
listeners.plain.enabled | Listener plain habilitado | true |
listeners.plain.port | Porta do listener plain | 9092 |
listeners.tls.enabled | Listener TLS habilitado | true |
listeners.tls.port | Porta do listener TLS | 9093 |
config.default.replication.factor | Fator de replicação padrão dos tópicos | 3 |
config.min.insync.replicas | Mínimo de réplicas síncronas | 2 |
entityOperator.enabled | Entity Operator habilitado | true |
nodePool.replicas | Número de brokers/controllers | 4 |
nodePool.storage.volumes[0].size | Tamanho do volume por nó | 100Gi |
kafka-ui.enabled | Kafka UI habilitada | true |
kafka-ui.service.type | Tipo do serviço da UI | ClusterIP |