Testar a conectividade com o broker MQTT com clientes MQTT
Importante
Azure IoT Operations Preview – habilitado pelo Azure Arc está atualmente em visualização. Não deve utilizar este software de pré-visualização em ambientes de produção.
Você precisará implantar uma nova instalação do Azure IoT Operations quando uma versão disponível ao público estiver disponível. Você não poderá atualizar uma instalação de visualização.
Para obter os termos legais que se aplicam aos recursos do Azure que estão em versão beta, em visualização ou ainda não lançados em disponibilidade geral, consulte os Termos de Uso Suplementares para Visualizações do Microsoft Azure.
Este artigo mostra diferentes maneiras de testar a conectividade com o broker MQTT com clientes MQTT em um ambiente que não seja de produção.
Por padrão, o broker MQTT:
Implanta um ouvinte habilitado para TLS 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, você deve usar TLS e autenticação de contas de serviço para proteger sua solução IoT. Para obter mais informações, consulte:
- Configure o TLS com o gerenciamento automático de certificados para proteger a comunicação MQTT no broker MQTT
- Configurar autenticação no broker MQTT
- Exponha os serviços do Kubernetes a dispositivos externos usando o encaminhamento de porta ou um comutador virtual com o Azure Kubernetes Services Edge Essentials.
Antes de começar, instale ou configure as Operações 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 CA raiz padrão.
Primeiro, crie um arquivo nomeado client.yaml
com a seguinte configuração:
apiVersion: v1
kind: ServiceAccount
metadata:
name: mqtt-client
namespace: azure-iot-operations
---
apiVersion: v1
kind: Pod
metadata:
name: mqtt-client
# Namespace must match MQTT broker BrokerListener's namespace
# Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
namespace: azure-iot-operations
spec:
# Use the "mqtt-client" service account created from above
# Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
serviceAccountName: mqtt-client
containers:
# Mosquitto and mqttui on Alpine
- image: alpine
name: mqtt-client
command: ["sh", "-c"]
args: ["apk add mosquitto-clients mqttui && sleep infinity"]
volumeMounts:
- name: broker-sat
mountPath: /var/run/secrets/tokens
- name: trust-bundle
mountPath: /var/run/certs
volumes:
- name: broker-sat
projected:
sources:
- serviceAccountToken:
path: broker-sat
audience: aio-internal # Must match audience in BrokerAuthentication
expirationSeconds: 86400
- name: trust-bundle
configMap:
name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
Em seguida, use kubectl
para implantar a configuração. Deve levar apenas alguns segundos para começar.
kubectl apply -f client.yaml
Quando 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 deve ser algo semelhante ao seguinte:
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 em /var/run/secrets/tokens/broker-sat
para autenticar com o broker. 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 autoridade de certificação 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 deve ser algo semelhante ao seguinte:
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 CA 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 como o tipo de serviço ClusterIp, 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 do Azure IoT Operations, recomendamos manter o ouvinte padrão inalterado e dedicado para comunicação interna do AIO. 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 tipo de serviço NodePort no ouvinte. Com isso, você pode usar <nodeExternalIP>:<NodePort>
para se conectar como na documentação do Kubernetes.
Por exemplo, crie um novo ouvinte de broker com o tipo de serviço de porta de nó escutando na porta 1883:
No portal do Azure, vá para sua instância de Operações IoT.
Em Recursos de Operações do Azure IoT, selecione MQTT Broker.
Selecione MQTT broker listener para NodePort>Create. Você só pode criar 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 NodePort Nome do serviço aio-broker-nodeport Porta 1883 Autenticação Escolha padrão ou Nenhum Autorização Escolha o padrão Protocolo Escolha MQTT Porta do nó 31883 Adicione configurações de TLS ao ouvinte selecionando TLS na porta.
Definição Descrição TLS Selecione o botão Adicionar. Modo TLS Escolha Manual ou Automático. Nome do emissor Nome do emissor do gestor de certificados. Obrigatório. Tipo de emitente Tipo de emissor do gestor de certificados. Obrigatório. Grupo de emitentes Grupo do emitente do gestor de certificados. Obrigatório. Algoritmo de chave privada Algoritmo para a chave privada. Política de rotação de chave privada Política de rotação da chave privada. Nomes DNS Nomes alternativos de entidade DNS para o certificado. Endereços IP Endereços IP da entidade nomes alternativos para o certificado. Nome do segredo Segredo do Kubernetes contendo um certificado de cliente X.509. Duração Tempo de vida total do certificado do servidor TLS O padrão é de 90 dias. Renovar antes Quando começar a renovar o certificado. Selecione Aplicar para salvar as configurações de TLS.
Selecione Criar para criar o ouvinte.
Obtenha o endereço IP externo do nó:
kubectl get nodes -o yaml | grep ExternalIP -C 1
O resultado deve ser algo semelhante ao seguinte:
- 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 31883 --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 deve ser algo semelhante ao seguinte:
- 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 broker à internet é usar o tipo de serviço LoadBalancer . Esse método é mais complexo e pode exigir configuração adicional, como configurar o encaminhamento de portas.
Por exemplo, para criar um novo ouvinte de broker com serviço de balanceador de carga, tipo escuta na porta 1883:
No portal do Azure, vá para sua instância de Operações IoT.
Em Recursos de Operações do Azure IoT, selecione MQTT Broker.
Selecione MQTT broker listener para NodePort>Create. Você só pode criar 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 balanceador de carga Nome do serviço AIO-Broker-Loadbalancer Porta 1883 Autenticação Escolha o padrão Autorização Escolha padrão ou Nenhum Protocolo Escolha MQTT Você pode adicionar configurações de TLS ao ouvinte selecionando TLS na porta.
Definição Descrição TLS Selecione o botão Adicionar. Modo TLS Escolha Manual ou Automático. Nome do emissor Nome do emissor do gestor de certificados. Obrigatório. Tipo de emitente Tipo de emissor do gestor de certificados. Obrigatório. Grupo de emitentes Grupo do emitente do gestor de certificados. Obrigatório. Algoritmo de chave privada Algoritmo para a chave privada. Política de rotação de chave privada Política de rotação da chave privada. Nomes DNS Nomes alternativos de entidade DNS para o certificado. Endereços IP Endereços IP da entidade nomes alternativos para o certificado. Nome do segredo Segredo do Kubernetes contendo um certificado de cliente X.509. Duração Tempo de vida total do certificado do servidor TLS O padrão é de 90 dias. Renovar antes Quando começar a renovar o certificado. Selecione Aplicar para salvar as configurações de TLS.
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 à seguinte:
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
Isso significa que um IP externo foi atribuído ao serviço de balanceador de carga e 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, ele pode ser exibido como estado Pendente .
Para acessar o broker, encaminhe a porta de escuta do broker 18883 para o host.
kubectl port-forward --namespace azure-iot-operations service/aio-broker 18883:mqtts-18883
Use 127.0.0.1 para se conectar ao broker na porta 18883 com a mesma autenticação e configuração TLS do exemplo sem encaminhamento de porta.
Para obter mais informações sobre minikube, consulte Usar o encaminhamento de porta para acessar aplicativos em um cluster
Reencaminhamento de portas no AKS Edge Essentials
Para o Azure Kubernetes Services Edge Essentials, você precisa executar algumas etapas adicionais. 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.
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 à seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Configure o encaminhamento de porta para o
broker-loadbalancer
serviço no endereço192.168.0.4
IP externo e na porta1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
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
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 agente 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 com mapeamento da 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 corretor MQTT à internet sem autenticação e TLS pode levar a acesso não autorizado e até mesmo ataques DDOS.
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.
No portal do Azure, vá para sua instância de Operações IoT.
Em Recursos de Operações do Azure IoT, selecione MQTT Broker.
Selecione MQTT broker listener para NodePort>Create. Você só pode criar 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 1883 Autenticação Selecione Nenhum Autorização Selecione Nenhum Protocolo Escolha MQTT Porta do nó 31883 se estiver usando a porta do nó Selecione Criar para criar o ouvinte.