ULC Lab · implementação reproduzível
Laboratório: Orquestração de Aplicação IoT Urbana com Kubernetes e MQTT
Você implementará um cluster Kubernetes local, implantará um broker MQTT de código aberto e um simulador de sensores IoT. Em cerca de 2 horas, verá dados fluindo de sensores simulados para o broker, tudo orquestrado pelo Kubernetes.

- Duração estimada
- 120 min
- Passos
- 12
- Validações
- 5
- Versões da documentação consultada
- Kubernetes a versão estável atual · kubectl a versão estável atual · Eclipse Mosquitto a versão estável atual · mosquitto-clients a versão estável atual · Docker a versão estável atual
Este laboratório mostra, na prática, como orquestrar aplicações IoT em Kubernetes. Você verá como um broker MQTT pode ser implantado e exposto em um cluster, e como sensores simulados podem ser escalados e gerenciados como pods. O objetivo é entender o fluxo de dados, a resiliência e a escalabilidade do Kubernetes em cenários urbanos típicos de cidades inteligentes.
Topologia
Três máquinas virtuais ou hosts: uma como master do Kubernetes, duas como workers. O cluster executa um broker MQTT (Eclipse Mosquitto) e múltiplos pods simulando sensores IoT, todos na mesma rede privada (exemplo: 192.168.56.0/24). Os sensores enviam dados ao broker, que pode ser acessado externamente.
[sensor1 pod] [sensor2 pod] [sensorN pod]
| | |
+--------------+---------------+
|
[Mosquitto broker pod]
|
[Kubernetes Cluster]
/ \
[worker1 VM] [worker2 VM]
|
[master VM]Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM ou host master | 1 vCPU, 2GB RAM, Ubuntu 22.04 ou similar |
| VM ou host worker 1 | 1 vCPU, 1GB RAM, Ubuntu 22.04 ou similar |
| VM ou host worker 2 | 1 vCPU, 1GB RAM, Ubuntu 22.04 ou similar |
| Kubernetes | Apache 2.0 · a versão estável atual |
| kubectl | Apache 2.0 · a versão estável atual |
| Eclipse Mosquitto | EPL/EDL · a versão estável atual |
| mosquitto-clients | EPL/EDL · a versão estável atual |
| Docker | Apache 2.0 · a versão estável atual |
Roteiro
- Preparar as máquinas virtuais
Instale Ubuntu 22.04 ou similar nas três VMs. Configure rede NAT ou bridge para comunicação entre elas.
O que você deve ver: As três VMs se comunicam entre si via ping.
- Instalar Docker em todas as VMs
Kubernetes depende do container runtime. Docker é o mais usado em laboratórios.
sudo apt update && sudo apt install -y docker.io sudo systemctl enable docker && sudo systemctl start dockerO que você deve ver: docker --version retorna a versão instalada.
- Instalar Kubernetes (kubeadm, kubelet, kubectl)
Kubeadm simplifica a criação do cluster. Instale em todas as VMs.
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update && sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectlO que você deve ver: kubeadm version retorna a versão instalada.
- Inicializar o cluster Kubernetes no master
O master gerencia o cluster. Inicialize o cluster e anote o token de join.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16O que você deve ver: Mensagem com kubeadm join e token.
- Configurar kubectl no master
kubectl precisa de acesso ao kubeconfig para operar o cluster.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configO que você deve ver: kubectl get nodes mostra apenas o master (NotReady).
- Instalar rede de pods (CNI Flannel)
Kubernetes exige um plugin de rede para comunicação entre pods.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlO que você deve ver: kubectl get pods -n kube-system mostra pods flannel Running.
- Ingressar os workers no cluster
Execute o comando kubeadm join nas VMs worker, usando o token gerado.
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>O que você deve ver: kubectl get nodes mostra master e dois workers Ready.
- Implantar o broker MQTT (Mosquitto) via Deployment
Mosquitto será o ponto central de mensagens IoT. Use um Deployment para garantir resiliência.
kubectl create deployment mosquitto --image= eclipse-mosquitto:2.0 kubectl expose deployment mosquitto --port=1883 --type=NodePortO que você deve ver: kubectl get pods mostra o pod mosquitto Running.
- Criar simuladores de sensores IoT
Simule sensores como pods que publicam mensagens MQTT periodicamente.
kubectl run sensor-sim-1 --image= eclipse-mosquitto:2.0 --restart=Never -- /bin/sh -c 'while true; do mosquitto_pub -h mosquitto -t cidade/temperatura -m "temp:$(date +%s)"; sleep 5; done' kubectl run sensor-sim-2 --image= eclipse-mosquitto:2.0 --restart=Never -- /bin/sh -c 'while true; do mosquitto_pub -h mosquitto -t cidade/umidade -m "umid:$(date +%s)"; sleep 5; done'O que você deve ver: kubectl get pods mostra os pods sensor-sim-1 e sensor-sim-2 Running.
- Expor o broker MQTT para acesso externo
O tipo NodePort permite acessar o Mosquitto de fora do cluster.
kubectl get service mosquittoO que você deve ver: Porta NodePort (ex: 30000-32767) listada para o serviço mosquitto.
- Testar recebimento de dados MQTT externamente
Use o mosquitto_sub em qualquer VM para verificar se as mensagens chegam ao broker.
mosquitto_sub -h <worker-ip> -p <nodeport> -t cidade/#O que você deve ver: Mensagens de temperatura e umidade aparecem a cada 5 segundos.
- Escalar simuladores de sensores
Mostre a facilidade de escalar pods no Kubernetes.
kubectl scale --replicas=5 deployment/sensor-sim-1O que você deve ver: kubectl get pods mostra 5 pods sensor-sim-1.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Verificar se todos os nodes estão Ready | kubectl get nodes | master e dois workers com STATUS Ready |
| Verificar se o Mosquitto está rodando | kubectl get pods -l app=mosquitto | STATUS Running |
| Verificar publicação dos sensores | kubectl logs sensor-sim-1 | Logs mostram publicações MQTT periódicas |
| Verificar recebimento externo via mosquitto_sub | mosquitto_sub -h <worker-ip> -p <nodeport> -t cidade/# | Mensagens recebidas em tempo real |
| Verificar escalabilidade dos simuladores | kubectl get pods | grep sensor-sim-1 | Quantidade de pods igual ao valor de replicas |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Pods em CrashLoopBackOff | Imagem incorreta ou comando inválido | Verifique logs com kubectl logs <pod> e ajuste o comando ou imagem |
| Não recebe mensagens MQTT externamente | Porta NodePort não liberada ou IP incorreto | Confirme IP do worker e porta NodePort com kubectl get service |
| kubectl get nodes mostra NotReady | Rede de pods (CNI) não instalada corretamente | Reaplique o manifesto do Flannel e aguarde inicialização |
| Simuladores não conseguem publicar no broker | Nome do serviço Mosquitto incorreto ou não resolvido | Confirme nome do serviço e conectividade DNS entre pods |
Segurança e hardening
- Nunca exponha o NodePort do Mosquitto em ambientes reais sem autenticação e TLS
- Restrinja acesso à API do Kubernetes apenas a administradores
- Remova pods de teste e simuladores após o laboratório
- Use namespaces separados para aplicações reais
Checklist final
Referências
- Kubernetes - Getting started · Kubernetes (CNCF) (kubernetes.io)
- Kubernetes - Networking · Kubernetes (CNCF) (kubernetes.io)
- kubectl - Official Docs · Kubernetes (CNCF) (kubernetes.io)
- Publicado
- 09/09/2026
- Última revisão
- 09/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 3 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
