Skip to content

Instantly share code, notes, and snippets.

@ermogenes
Last active February 3, 2022 12:15
Show Gist options
  • Save ermogenes/255e9faa0103b72b60e898feaeef5226 to your computer and use it in GitHub Desktop.
Save ermogenes/255e9faa0103b72b60e898feaeef5226 to your computer and use it in GitHub Desktop.
Kafka com podman no Windows

Kafka com podman no Windows

Pré-requisitos:

  • Windows com WSL versão 2 (com a versão 1 não funcionará).
  • Uma instância de Linux no WSL (eu usei Ubuntu-20.04 da Microsoft Store).

Instalando o podman

Rode todos os comandos abaixo, um a um.

. /etc/os-release
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update -qq
sudo apt-get -qq -y install podman
sudo mkdir -p /etc/containers
echo -e "[registries.search]\nregistries = ['docker.io', 'quay.io']" | sudo tee /etc/containers/registries.conf

Para verificar se foi instalado com sucesso, use podman info.

Configurando o podman

Edite /etc/containers/containers.conf, descomentando/alterando as seguintes configurações:

  • de cgroup_manager = "systemd" para cgroup_manager = "cgroupfs";
  • de events_logger = "journald" para events_logger = "file".

Criando containers com a stack do Apache Kafka

Usaremos os containers da Confluent no Docker Hub, bem como tentaremos usar as configurações semelhantes à sua documentação.

Começaremos definindo uma variável de ambiente com o IP interno da instância do WSL:

WSL_eth0_IP=$(ifconfig eth0 | perl -ne 'print $1 if /inet\s.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/')

Crie o primeiro container para o zookeeper, habilitando as portas para todos os serviços:

podman run -dt --name zookeeper -p 2181:2181,9092:9092,8081:8081,8082:8082 confluent/zookeeper

Crie os demais containers reaproveitando a rede do container do Zookeeper. O broker do Kafka deverá ser configurado para devolver o IP interno do WSL em vez de localhost.

podman run -dt --name broker --network=container:zookeeper --env KAFKA_ADVERTISED_HOST_NAME="$WSL_eth0_IP" --env KAFKA_ADVERTISED_PORT=9092 confluent/kafka
podman run -dt --name schema-registry --network=container:zookeeper confluent/schema-registry
podman run -dt --name rest-proxy --network=container:zookeeper confluent/rest-proxy

Verificando os logs

Podemos verificar os logs de cada container:

podman logs zookeeper
podman logs broker
podman logs schema-registry
podman logs rest-proxy

Executando um terminal no container

Podemos logar no container onde se encontra o Kafka:

podman exec -it broker /bin/bash

No terminal interno, podemos listar os tópicos:

/usr/bin/kafka-topics --list --zookeeper localhost:2181

E criar outros tópicos:

/usr/bin/kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --part
itions 1 --topic meu-topico-de-teste

Testando

Podemos agora chamar os serviços usando REST.

Listar os tópicos:

curl -X GET http://localhost:8082/topics

Listar o conteúdo de um tópico:

curl -X GET http://localhost:8082/topics/meu-topico-de-teste

Referências:

@ermogenes
Copy link
Author

ermogenes commented Jan 27, 2022

Comandos úteis:

  • conferir versão do WSL: wsl -l -v
  • upgrade do WSL para WSL2: wsl --set-version <distro name> 2
  • instalar buildah: sudo apt-get -qq -y install buildah (corrige WARN[0000] "/" is not a shared mount em podman info)
  • instalar podman-compose: pip3 install podman-compose (adicionar no path: echo "export PATH=\"/home/ubuntu/.local/bin:\$PATH\"" >> ~/.bashrc && source ~/.bashrc)
  • port proxy: netsh interface portproxy add v4tov4 listenport=PORTA_DESEJADA listenaddress=0.0.0.0 connectport=PORTA_WSL connectaddress=IP_WSL (use ip address no WSL para descobrir o IP interno eth0 inet).

@ermogenes
Copy link
Author

Há um bug ao rodar o podman no WSL que ocorre quando a imagem é reiniciada.

Faça rm -rf /tmp/run-$(id -u)/libpod/tmp e echo "none /tmp tmpfs defaults 0 0" | sudo tee -a /etc/fstab. Reinicie o WSL. Se necessário, faça podman system prune.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment