Partilhar via


Testar a conectividade com o broker MQTT com clientes MQTT

Importante

Esta página inclui instruções para gerenciar componentes do Azure IoT Operations usando manifestos de implantação do Kubernetes, que está em visualização. Esse recurso é fornecido com várias limitações e não deve ser usado para cargas de trabalho de produção.

Veja Termos de Utilização Complementares da Pré-visualizações do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão na versão beta, na pré-visualização ou que ainda não foram lançadas para disponibilidade geral.

Este artigo mostra diferentes maneiras de testar a conectividade com um broker MQTT com clientes MQTT em um ambiente que não seja de produção.

Por padrão, um broker MQTT:

  • Implanta um ouvinte habilitado para protocolo TLS (Transport Layer Security) na porta 18883 com ClusterIp como o tipo de serviço. ClusterIp significa que o broker é acessível somente de dentro do cluster Kubernetes. Para acessar o broker de fora do cluster, você deve configurar um serviço do tipo LoadBalancer ou NodePort.
  • Aceita contas de serviço do Kubernetes para autenticação de conexões de dentro do cluster. Para se conectar de fora do cluster, você deve configurar um método de autenticação diferente.

Atenção

Para cenários de produção, use TLS e autenticação de contas de serviço para proteger sua solução IoT. Para obter mais informações, consulte:

Antes de começar, instale ou configure as Operações do Azure IoT. Use as opções a seguir para testar a conectividade com o broker MQTT com clientes MQTT em um ambiente que não seja de produção.

Conectar-se ao ouvinte padrão dentro do cluster

A primeira opção é conectar-se de dentro do cluster. Esta opção usa a configuração padrão e não requer atualizações extras. Os exemplos a seguir mostram como se conectar de dentro do cluster usando o Alpine Linux simples e um cliente MQTT comumente usado usando a conta de serviço e o certificado de Autoridade de Certificação (CA) raiz padrão.

Baixe a mqtt-client.yaml implantação do repositório de exemplo do GitHub.

Importante

Não use o cliente MQTT na produção. O cliente é apenas para fins de teste.

wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml

Aplique o arquivo de implantação com kubectl:

kubectl apply -f mqtt-client.yaml
pod/mqtt-client created

Depois que o pod estiver em execução, use kubectl exec para executar comandos dentro do pod.

Por exemplo, para publicar uma mensagem no broker, abra um shell dentro do pod:

kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh

Dentro do shell do pod, execute o seguinte comando para publicar uma mensagem para o broker:

mosquitto_pub --host aio-broker --port 18883 --message "hello" --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT

O cliente Mosquitto usa o token de conta de serviço montado para /var/run/secrets/tokens/broker-sat autenticar com o corretor. O token é válido por 24 horas. O cliente também usa o certificado de CA raiz padrão montado em /var/run/certs/ca.crt para verificar a cadeia de certificados TLS do broker.

Gorjeta

Você pode usar kubectl para baixar o certificado de CA raiz padrão para usar com outros clientes. Por exemplo, para baixar o certificado de autoridade de certificação raiz padrão para um arquivo chamado ca.crt:

kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt

Para assinar o tópico, execute o seguinte comando:

mosquitto_sub --host aio-broker --port 18883 --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: world, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0

O cliente Mosquitto usa o mesmo token de conta de serviço e certificado de autoridade de certificação raiz para autenticar com o broker e assinar o tópico.

Para remover o pod, execute kubectl delete pod mqtt-client -n azure-iot-operations.

Conectar clientes de fora do cluster

Como o ouvinte do broker padrão está definido para o ClusterIp tipo de serviço, você não pode se conectar diretamente ao broker de fora do cluster. Para evitar interrupções não intencionais na comunicação entre componentes internos de Operações de IoT, recomendamos que você mantenha o ouvinte padrão inalterado e dedicado para a comunicação interna de Operações de IoT. Embora seja possível criar um serviço Kubernetes LoadBalancer separado para expor o serviço IP do cluster, é melhor criar um ouvinte separado com configurações diferentes, como as portas MQTT 1883 e 8883 mais comuns, para evitar confusão e possíveis riscos de segurança.

Porta do nó

A maneira mais fácil de testar a conectividade é usar o NodePort tipo de serviço no ouvinte. Com esse método, você pode usar <nodeExternalIP>:<NodePort> para se conectar conforme mostrado na documentação do Kubernetes.

Por exemplo, para criar um novo ouvinte de broker com o tipo de serviço, nome aio-broker-nodeportdo NodePort serviço e escuta na porta 1884 (porta de nó 31884), siga estas etapas.

  1. No portal do Azure, vá para sua instância de Operações IoT.

  2. Em Componentes, selecione MQTT Broker.

  3. Selecione MQTT broker listener para NodePort>Create. Você pode criar apenas um ouvinte por tipo de serviço. Se você já tiver um ouvinte do mesmo tipo de serviço, poderá adicionar mais portas ao ouvinte existente.

    Atenção

    Definir a autenticação como Nenhum e não configurar o TLS desativa a autenticação e o TLS apenas para fins de teste.

    Introduza as seguintes definições:

    Definição Valor
    Nome aio-broker-nodeport
    Nome do serviço Deixar vazio ou utilizar aio-broker-nodeport.
    Porta 1884
    Autenticação Escolha entre existente ou Nenhum.
    Autorização Escolha entre existente ou Nenhum.
    Protocolo Escolha MQTT.
    Porta do nó 31884
  4. Adicione configurações de TLS ao ouvinte selecionando Adicionar TLS>na porta. Esta etapa não é necessária se você não precisar de TLS para testes. Para obter mais informações, consulte BrokerListener.

  5. Selecione Criar para criar o ouvinte.

Nota

Por padrão do Kubernetes, o número da porta do nó deve estar no intervalo de 30000 a 32767.

Obtenha o endereço IP externo do nó:

kubectl get nodes -o yaml | grep ExternalIP -C 1

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

    - address: 104.197.41.11
      type: ExternalIP
    allocatable:
--
    - address: 23.251.152.56
      type: ExternalIP
    allocatable:
...

Use o endereço IP externo e a porta do nó para se conectar ao broker. Por exemplo, para publicar uma mensagem para o corretor:

mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Se não houver nenhum IP externo na saída, você pode estar usando uma configuração do Kubernetes que não exponha o endereço IP externo do nó por padrão, como muitas configurações de k3s, k3d ou minikube. Nesse caso, você pode acessar o broker com o IP interno junto com a porta do nó de máquinas na mesma rede. Por exemplo, para obter o endereço IP interno do nó:

kubectl get nodes -o yaml | grep InternalIP -C 1

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Em seguida, use o endereço IP interno e a porta do nó para se conectar ao broker a partir de uma máquina dentro do mesmo cluster. Se o Kubernetes estiver sendo executado em uma máquina local, como com k3s de nó único, você poderá usar localhost frequentemente em vez do endereço IP interno. Se o Kubernetes estiver sendo executado em um contêiner do Docker, como no k3d, o endereço IP interno corresponderá ao endereço IP do contêiner e deverá ser acessível a partir da máquina host.

Balanceador de carga

Outra maneira de expor o corretor à internet é usar o LoadBalancer tipo de serviço. Esse método é mais complexo e pode exigir mais configuração, como configurar o encaminhamento de portas.

Por exemplo, para criar um novo ouvinte de broker com o tipo de serviço, nome aio-broker-loadbalancerdo LoadBalancer serviço e escuta na porta 1883, siga estas etapas.

  1. No portal do Azure, vá para sua instância de Operações IoT.

  2. Em Componentes, selecione MQTT Broker.

  3. Selecione MQTT broker listener para NodePort>Create. Você pode criar apenas um ouvinte por tipo de serviço. Se você já tiver um ouvinte do mesmo tipo de serviço, poderá adicionar mais portas ao ouvinte existente.

    Atenção

    Definir a autenticação como Nenhum e não configurar o TLS desativa a autenticação e o TLS apenas para fins de teste.

    Introduza as seguintes definições:

    Definição Valor
    Nome aio-broker-loadbalancer
    Nome do serviço Deixar vazio ou utilizar aio-broker-loadbalancer.
    Porta 1883
    Autenticação Escolha entre existente ou Nenhum.
    Autorização Escolha entre existente ou Nenhum.
    Protocolo Escolha MQTT.
  4. Adicione configurações de TLS ao ouvinte selecionando Adicionar TLS>na porta. Esta etapa não é necessária se você não precisar de TLS para testes. Para obter mais informações, consulte BrokerListener.

  5. Selecione Criar para criar o ouvinte.

  6. Selecione Criar para criar o ouvinte.

Obtenha o endereço IP externo para o serviço do corretor:

kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations

Se a saída for semelhante ao exemplo a seguir:

NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
aio-broker-loadbalancer   LoadBalancer   10.x.x.x        x.x.x.x       1883:30382/TCP   83s

Em seguida, um IP externo foi atribuído ao serviço de balanceador de carga. Você pode usar o endereço IP externo e a porta para se conectar ao broker. Por exemplo, para publicar uma mensagem para o corretor:

mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Se o IP externo não estiver atribuído, talvez seja necessário usar o encaminhamento de porta ou um comutador virtual para acessar o broker.

Usar o encaminhamento de porta

Com minikube, tipo e outros sistemas de emulação de cluster, um IP externo pode não ser atribuído automaticamente. Por exemplo, o estado pode aparecer como Pendente.

  1. Para acessar o broker, encaminhe a porta do broker listener para o host.

    # Using aio-broker-loadbalancer service name and listener port 1883 as example
    kubectl port-forward --namespace azure-iot-operations service/aio-broker-loadbalancer <HOST_PORT>:1883
    
  2. Deixe o comando port forwarding em execução no terminal.

  3. Conecte-se ao broker na porta do host com a mesma autenticação e configuração TLS do exemplo sem encaminhamento de porta.

Para obter mais informações sobre minikube, consulte Usar encaminhamento de porta para acessar aplicativos em um cluster.

Reencaminhamento de portas no AKS Edge Essentials

Para o AKS Edge Essentials, você precisa executar mais algumas etapas. Com o AKS Edge Essentials, obter o endereço IP externo pode não ser suficiente para se conectar ao corretor. Talvez seja necessário configurar o encaminhamento de porta e abrir a porta no firewall para permitir o tráfego para o serviço do broker.

  1. Primeiro, obtenha o endereço IP externo do ouvinte do balanceador de carga do broker:

    kubectl get service broker-loadbalancer --namespace azure-iot-operations
    

    A saída deve ser semelhante ao exemplo a seguir:

    NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    broker-loadbalancer     LoadBalancer   10.x.x.x       192.168.0.4   1883:30366/TCP   14h
    
  2. Configure o encaminhamento de porta para o broker-loadbalancer serviço no endereço 192.168.0.4 IP externo e na porta 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Abra a porta no firewall para permitir o tráfego para o serviço do corretor:

    New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. Use o endereço IP público do host para se conectar ao broker MQTT.

Para obter mais informações sobre encaminhamento de portas, consulte Expor serviços do Kubernetes a dispositivos externos.

Acesso através de localhost

Algumas distribuições Kubernetes podem expor o broker MQTT a uma porta no sistema host (localhost) como parte da configuração do cluster. Use essa abordagem para facilitar o acesso de clientes no mesmo host ao broker MQTT.

Por exemplo, para criar um cluster k3d que mapeie a porta MQTT padrão 1883 do broker MQTT para localhost:1883:

k3d cluster create --port '1883:1883@loadbalancer'

Ou para atualizar um cluster existente:

k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'

Em seguida, use localhost e a porta para se conectar ao broker. Por exemplo, para publicar uma mensagem para o corretor:

mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Desative apenas o TLS e a autenticação para testes

A razão pela qual o broker MQTT usa TLS e autenticação de contas de serviço por padrão é fornecer uma experiência segura por padrão que minimize a exposição inadvertida de sua solução IoT a invasores. Você não deve desativar o TLS e a autenticação na produção. Expor o broker MQTT à internet sem autenticação e TLS pode levar a acesso não autorizado e até mesmo ataques distribuídos de negação de serviço.

Aviso

Se você entender os riscos e precisar usar uma porta insegura em um ambiente bem controlado, poderá desativar o TLS e a autenticação para fins de teste, removendo as tls configurações e authenticationRef da configuração do ouvinte.

  1. No portal do Azure, vá para sua instância de Operações IoT.

  2. Em Componentes, selecione MQTT Broker.

  3. Selecione Ouvinte do broker MQTT para NodePort ou ouvinte do broker MQTT para LoadBalancer>Create. Você pode criar apenas um ouvinte por tipo de serviço. Se você já tiver um ouvinte do mesmo tipo de serviço, poderá adicionar mais portas ao ouvinte existente.

    Atenção

    Definir a autenticação como Nenhum e não configurar o TLS desativa a autenticação e o TLS apenas para fins de teste.

    Introduza as seguintes definições:

    Definição Valor
    Nome Insira um nome para o ouvinte.
    Nome do serviço Insira um nome de serviço.
    Porta Insira um número de porta.
    Autenticação Escolha Nenhum.
    Autorização Escolha Nenhum.
    Protocolo Escolha MQTT.
    Porta do nó Insira um número entre 30000 e 32767 se estiver usando a porta do nó.
  4. Selecione Criar para criar o ouvinte.