top of page
Foto do escritorRafael Natali

Executando o Kafka no Kubernetes com o modo KRaft e SSL

Atualizado: 7 de nov. de 2023

Aprenda como lançar um Apache Kafka com o protocolo de consenso Apache Kafka Raft (KRaft) e criptografia SSL. Este artigo é uma continuação do meu artigo anterior, Executando o Kafka no Kubernetes com o modo KRaft.


Pré-requisitos


É necessário ter um entendimento de Apache Kafka, Kubernetes e Minikube.


Os seguintes passos foram inicialmente realizados em um MacBook Pro com 32 GB dememória, executando o MacOS Ventura v13.4.


Certifique-se de ter as seguintes aplicações instaladas:

  • Docker v23.0.5

  • Minikube v1.29.0 (executando o K8s v1.26.1 internamente)

É possível que os passos abaixo funcionem com diferentes versões das ferramentasmencionadas acima, mas, se você encontrar problemas inesperados, é recomendávelgarantir que tenha as versões idênticas. O Minikube foi escolhido para este exercício devidoao seu foco no desenvolvimento local.


Componentes da Implantação

O primeiro passo para habilitar a criptografia SSL é criar um par de chaves público/privado para cada servidor. Você pode encontrar instruções detalhadas para criar as chaves aqui.


O segundo passo é criar dois ConfigMaps que serão montados como volumes para o Broker e o cliente, contendo o truststore, keystore e senha. Você pode encontrar instruções detalhadas para criar os ConfigMaps aqui.


A implantação que criaremos terá os seguintes componentes:

  • Namespace: kafka. Este é o namespace no qual todos os componentes serão abrangidos.

  • Service Account: kafka. Contas de serviço (Service Accounts) são usadas para controlar permissões e acesso a recursos dentro do cluster.

  • Headless Service: kafka-headless. Ele expõe as portas 9092 (para clientes do Kafka) e 29093 (para o Controlador do Kafka).

  • StatefulSet: kafka. Ele gerencia os pods do Kafka e garante que eles tenham nomes de host e armazenamento estáveis.

O código-fonte para esta implantação pode ser encontrado neste repositório GitHub.


Especificamente para as configurações SSL, os seguintes parâmetros foram configurados no StatefulSet:


  • Configurar o truststore, keystore, e senha:

KAFKA_SSL_KEY_CREDENTIALS
KAFKA_SSL_KEYSTORE_CREDENTIALS
KAFKA_SSL_TRUSTSTORE_CREDENTIALS
  • Configurar as portas SSL para o Kafka Broker

KAFKA_ADVERTISED_LISTENERS
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
KAFKA_LISTENERS

Criando a Implantaçāo


Clone o repositório:

git clone https://github.com/rafaelmnatali/kafka-k8s.git

implemente o Kafka usando os seguintes comandos:

kubectl apply -f 00-namespace.yaml
kubectl apply -f 01-kafka-local.yaml

Verifique a comunicação entre os brokers

Agora deve haver três nós (brokers) Kafka, cada um em execução em pods separados dentro do seu cluster. A resolução de nomes para o headless Service e os três pods dentro do StatefulSet é configurada automaticamente pelo Kubernetes conforme são criados, permitindo a comunicação entre os brokers. Consulte a documentação relacionada para obter mais detalhes sobre esse recurso.


Você pode verificar os logs do primeiro pod com o seguinte comando:

kubectl logs kafka-0

A resoluçāo de nomes para os três pods pode demorar mais tempo do que o pod a iniciar, entāo, você pode ver erros UnknownHostException nos logs durante a inicializaçāo:


WARN [RaftManager nodeId=2] Error connecting to node kafka-1.kafka-headless.kafka.svc.cluster.local:29093 (id: 1 rack: null) (org.apache.kafka.clients.NetworkClient) java.net.UnknownHostException: kafka-1.kafka-headless.kafka.svc.cluster.local         ... 

Eventualmente, cada pod irá resolver os nomes e iniciar com uma mensagem afirmando que o broker foi unfenced:


INFO [Controller 0] Unfenced broker: UnfenceBrokerRecord(id=1, epoch=176) (org.apache.kafka.controller.ClusterControlManager)

Crie um tópico usando SSL


Implemente o cliente Kafka com o seguinte comando:

kubectl apply -f 02-kafka-client.yaml

Verifique se o pod está em Running:

kubectl get pods kafka-cli

Saída:

NAME        READY   STATUS    RESTARTS   AGE 
kafka-cli   1/1     Running   0          12m

Conecte-se ao Pod kafka-cli:

kubectl exec -it kafka-cli -- bash

Crie um tópico chamado test-ssl com três partições e fator de replicaçāo três.

kafka-topics --create --topic test-ssl --partitions 3 --replication-factor 3 --bootstrap-server ${BOOTSTRAP_SERVER} --command-config /etc/kafka/secrets/client_security.properties  Created topic test-ssl.

A variável de ambiente BOOTSTRAP_SERVER contém a lista dos brokers, economizando tempo ao digitar.


Liste todos os tópicos do Kafka:

kafka-topics --bootstrap-server kafka-0.kafka-headless.kafka.svc.cluster.local:9093 --list --command-config /etc/kafka/secrets/client_security.properties  
test 
test-ssl 
test-test

Resumo e próximos passos


Este tutorial mostrou como executar o Kafka no modo KRaft em um cluster Kubernetes com criptografia SSL. Isso é um passo importante para garantir a comunicação segura entre clientes e brokers. Convido você a continuar estudando e pesquisando como melhorar a segurança em seu ambiente.


No próximo artigo, vou mostrar como configurar a autenticação entre clientes e Kafka!


Referências



6 visualizações0 comentário

Comments


bottom of page