Desvendando o Kafka: Construindo um Playground com Rancher, Kafka e Kafka UI para um Consumer em Node.js

Rhian Lopes da Costa
Fretebras Tech
Published in
8 min readJan 7, 2024

Explore os bastidores do Kafka enquanto constrói um ambiente local de aprendizado com Rancher, Kafka e Kafka UI para desenvolver um consumer em Node.js. Este guia prático oferece uma jornada passo a passo para dominar os fundamentos do Kafka enquanto cria um playground interativo e funcional.

Introdução

Nos bastidores da moderna arquitetura de dados, o Apache Kafka surge como uma peça fundamental para o processamento e o fluxo de informações em tempo real. Dominar seus conceitos e sua implementação é essencial para profissionais e entusiastas de tecnologia que buscam compreender e utilizar sistemas distribuídos de maneira eficaz.

Neste guia, mergulharemos na criação de um ambiente de aprendizado prático, onde exploraremos a interconexão entre Rancher, Kafka e Kafka UI para desenvolver um consumer em Node.js. A proposta é fornecer não apenas conhecimentos teóricos, mas também um playground local que permitirá experimentar e compreender os fundamentos do Kafka na prática.

Preparando o Ambiente

Antes de começarmos a construir nosso playground com Rancher, Kafka e Kafka UI, é crucial garantir que tenhamos todas as ferramentas necessárias instaladas e configuradas corretamente em nosso ambiente local.

Pré-requisitos:

Rancher

Rancher é uma plataforma de gerenciamento de contêineres que simplifica a administração e a orquestração de contêineres em um ambiente Kubernetes. Para configurar o ambiente com Rancher iremos utilizar o Docker, para isso basta executar:

docker run --name rancher -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:v2.7.9

Assim, iniciamos um contêiner Rancher local usando o Docker. Para acessá-lo, basta aguardar alguns segundos até que a instalação seja concluída e, em seguida, acessar o endereço http://localhost:80/.

Para obter nossa ‘Bootstrap Password’, podemos utilizar o seguinte comando:

docker logs rancher 2>&1 | grep "Bootstrap Password:"

Com a senha em mãos, podemos inseri-la e avançar para a próxima etapa. Neste ponto, podemos definir nossa nova senha, concordar com os termos e prosseguir.

Por fim, concluímos a configuração do Rancher, o que nos permite acessar o cluster local para uso em nosso ambiente de testes.

Kubectl

Já no nosso cluster local, vamos configurar o kubectl para acessar o cluster via linha de comando (CLI). Para isso, podemos copiar o arquivo .kube/config no canto superior direito.

Por último, substitua o conteúdo desse arquivo local pelo que foi copiado. Para realizar essa substituição, abra o arquivo no VSCode ou no editor de texto de sua preferência.

code ~/.kube/config

Para testar a conexão do kubectl com nosso cluster Rancher, podemos executar o seguinte comando para listar todos os pods do cluster.

$ kubectl get pod -A

NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-fleet-local-system fleet-agent-545c88bf5f-tjqqv 1/1 Running 0 27m
cattle-fleet-system fleet-controller-77dc8fc97c-ddgs4 1/1 Running 0 37m
cattle-fleet-system gitjob-6dcbcd6ff5-fw52k 1/1 Running 0 37m
cattle-provisioning-capi-system capi-controller-manager-7bc5589765-pzvpd 1/1 Running 0 36m
cattle-system helm-operation-578f8 0/2 Completed 0 36m
cattle-system helm-operation-b8zw5 0/2 Completed 0 37m
cattle-system helm-operation-d8bbv 0/2 Completed 0 35m
cattle-system helm-operation-jh5fd 0/2 Completed 0 36m
cattle-system helm-operation-thj89 0/2 Completed 0 36m
cattle-system rancher-webhook-c9bd5c87c-gggcd 1/1 Running 0 36m
kube-system coredns-59b4f5bbd5-d2b4x 1/1 Running 0 38m

Configurando o Kafka

O Apache Kafka, um sistema distribuído de mensagens de código aberto, solidificou-se como um alicerce fundamental na infraestrutura tecnológica para gerenciar volumes significativos de dados em tempo real. Aqui, focaremos na configuração do Kafka em nosso cluster utilizando o Helm.

Previamente, é essencial configurar um StorageClass local no Rancher, já que a imagem do Kafka depende dessa configuração específica.

Rancher Local StorageClass

Configurar um StorageClass local com o Rancher é uma tarefa simples. Podemos utilizar o seguinte repositório no GitHub disponibilizado pela equipe do Rancher para esse propósito.

Ao executar este comando, os manifestos Kubernetes necessários serão provisionados.

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.26/deploy/local-path-storage.yaml

Por fim, ao executar este comando, estabeleceremos o storage class local como padrão.

kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

Para verificar se o recurso foi criado com sucesso, você pode executar o seguinte comando:

$ kubectl get storageclass

NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) rancher.io/local-path Delete WaitForFirstConsumer false 17s

Kafka

Iremos agora instalar o Kafka no nosso cluster usando a imagem da Bitnami. Para isso, basta executar os seguintes comandos:

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update

helm install kafka bitnami/kafka --version 26.6.2 --namespace kafka --create-namespace

Assim, concluímos a instalação do Kafka no nosso cluster. Podemos verificar todos os recursos criados através do Rancher, filtrando pelo namespace "kafka" no canto superior direito.

Integrando com o Kafka UI

O Kafka UI, é uma interface gráfica para monitoramento e administração de clusters Kafka, acrescenta uma dimensão visual e prática à gestão de tópicos, partições e mensagens dentro do ambiente Kafka. Nesta seção, exploraremos a integração do Kafka UI ao nosso ambiente já configurado com o Rancher e o Kafka.

Client Secret

Para integrar o Kafka UI com o Kafka, precisamos da "client secret" do nosso Kafka. Para obtê-la, basta executar o seguinte comando:

kubectl get secret kafka-user-passwords --namespace kafka -o jsonpath='{.data.client-passwords}' | base64 -d | cut -d , -f 1

Com a senha em mãos, iremos utiliza-lá tanto para a conexão com o Kafka UI quanto para a conexão do nosso Consumer Node.js.

Kafka UI

Vamos proceder com a instalação do Kafka no nosso cluster. Na etapa final, utilizaremos nossa ‘client secret’ no último comando, substituindo o campo <client_secret> pela chave adquirida. Para finalizar, basta executar os seguintes comandos:

helm repo add kafka-ui https://provectus.github.io/kafka-ui-charts

helm repo update

helm install kafka-ui kafka-ui/kafka-ui --version 0.7.5 \
--set envs.config.KAFKA_CLUSTERS_0_NAME=local \
--set envs.config.KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS="kafka-controller-0.kafka-controller-headless.kafka.svc.cluster.local:9092\,kafka-controller-1.kafka-controller-headless.kafka.svc.cluster.local:9092\,kafka-controller-2.kafka-controller-headless.kafka.svc.cluster.local:9092" \
--set envs.config.KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=SASL_PLAINTEXT \
--set envs.config.KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM=PLAIN \
--set envs.config.KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG='org.apache.kafka.common.security.plain.PlainLoginModule required username="user1" password="<client_secret>";' \
--namespace kafka-ui --create-namespace

Para testarmos a integração entre o Kafka UI e o Kafka em nosso cluster, podemos acessar nosso Kafka UI.

Para isso, iremos utilizar o comando "Port Forward" do Kubectl a fim de simplificarmos o acesso e por se tratar de um ambiente playground de testes. Por fim, podemos executar o seguinte comando:

kubectl -n kafka-ui port-forward svc/kafka-ui 8080:80

É importante lembrarmos que teremos acesso local ao Kafka UI enquanto o comando se manter em execução no terminal, para seguirmos esse guia devemos abrir um novo terminal.

Podemos acessar nosso Kafka UI no seguinte endereço http://localhost:8080/:

Tópico Kafka

Na próxima seção, vamos configurar um consumer Kafka em Node.js no nosso cluster, para o qual será necessário criar um tópico Kafka.

Criar um tópico no Kafka é simples: acesse o menu de tópicos no painel esquerdo e clique no botão para adicionar um novo tópico no canto superior direito.

No menu de configuração do novo tópico, vamos criar um tópico simples com o nome "example-topic". Basta configurar os campos conforme mostrado na imagem abaixo.

Dessa forma, o primeiro tópico foi criado e agora estamos na tela de gerenciamento do tópico. Podemos mantê-la aberta, já que será útil para nossas atividades futuras.

Criando um Consumer em Node.js

Nesta etapa, vamos desenvolver um consumer Kafka em Node.js com uma lógica simples: estabelecerá conexão com o tópico Kafka criado e exibirá no log todas as informações das mensagens consumidas.

Para simplificar, criei um repositório com todo o código necessário para o consumer Kafka em Node.js. Você pode clonar o repositório e abrir um terminal na raiz do projeto.

Kafka Consumer

Conforme introduzido na seção anterior, o consumer Kafka em Node.js terá uma lógica simples. Abaixo está o código completo do consumer:

No repositório clonado, você encontrará o código completo. Também criei uma imagem Docker a partir dele, que será usada nesta seção. Se preferir criar a sua própria, sinta-se à vontade para utilizar o Dockerfile fornecido no repositório.

https://hub.docker.com/r/rhianlopes/kafka-consumer/tags

Deploy

Vamos fazer o deploy do nosso consumer Kafka usando o Helm. No repositório clonado, preparei um template de Deployment simples e direto para essa finalidade.

Antes disso, precisaremos definir a secret para nosso cliente Kafka. Para isso, podemos editar o arquivo "helm-charts/consumer/values.yaml" no repositório, substituindo novamente o valor da chave "<client_password>".

Feito isso, podemos executar o seguinte comando na raiz do repositório:

helm upgrade --install kafka-consumer helm-charts/consumer -f helm-charts/consumer/values.yaml --namespace dev-kafka-consumer --create-namespace

Com isso, efetuamos o deploy do nosso consumer Kafka, podemos conferir o andamento do deploy no Rancher filtrando pelo namespace "dev-kafka-consumer" no canto superior direito.

Para testarmos seu funcionamento, podemos retornar ao nosso Kafka UI e produzirmos uma mensagem no tópico "example-topic".

Feito isso, podemos conferir nos logs do nosso pod do consumer Kafka a mensagem processada com sucesso! 🚀

Desligando Cluster

Ao final dos testes, caso deseje desligar o cluster Rancher, basta executar o seguinte comando:

docker stop rancher

Caso deseje remove-lo, basta executar:

docker rm rancher

Conclusão

Este guia proporcionou uma jornada prática a fim de elaborarmos um playground para um consumer Kafka, desde a configuração até a implementação funcional. Com este conhecimento adquirido, você está preparado para explorar cenários mais complexos, aprofundar-se nos recursos avançados do Kafka e aplicar esses conceitos em projetos do mundo real.

Convido você a continuar experimentando, explorando e expandindo seu conhecimento para dominar o ecossistema do Apache Kafka. O mundo do processamento de dados em tempo real aguarda suas inovações e aplicações criativas.

Obrigado pela sua atenção! E até breve 😄

Feliz 2024! 🍾

--

--

Rhian Lopes da Costa
Fretebras Tech

Olá! Me chamo Rhian, sou apaixonado por resolver problemas utilizando Tecnologia e Inovações