Desvendando o Kafka: Construindo um Playground com Rancher, Kafka e Kafka UI para um Consumer em Node.js
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! 🍾