Testare la connettività al broker MQTT con client MQTT
Importante
Questa pagina include istruzioni per la gestione dei componenti di Operazioni IoT di Azure usando i manifesti di distribuzione kubernetes, disponibile in anteprima. Questa funzionalità viene fornita con diverse limitazioni e non deve essere usata per i carichi di lavoro di produzione.
Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.
Questo articolo illustra diversi modi per testare la connettività a un broker MQTT con client MQTT in un ambiente non di produzione.
Per impostazione predefinita, un broker MQTT:
- Distribuisce un listener abilitato per il protocollo TLS (Transport Layer Security) sulla porta 18883 con
ClusterIp
come tipo di servizio.ClusterIp
significa che il broker è accessibile solo dall'interno del cluster Kubernetes. Per accedere al broker dall'esterno del cluster, è necessario configurare un servizio di tipoLoadBalancer
oNodePort
. - Accetta account del servizio Kubernetes per l'autenticazione per connessioni dall'interno del cluster. Per connettersi dall'esterno del cluster, è necessario configurare un metodo di autenticazione diverso.
Attenzione
Per gli scenari di produzione, usare l'autenticazione degli account TLS e del servizio per proteggere la soluzione IoT. Per altre informazioni, vedi:
- Configurare TLS con gestione automatica dei certificati per proteggere le comunicazioni MQTT nel broker MQTT.
- Configurare l'autenticazione nel broker MQTT.
- Esporre i servizi Kubernetes a dispositivi esterni usando il port forwarding o un commutatore virtuale con servizio Azure Kubernetes Edge Essentials (AKS).
Prima di iniziare, installare o configurare le operazioni di Azure IoT. Usare le opzioni seguenti per testare la connettività al broker MQTT con i client MQTT in un ambiente non di produzione.
Connettersi al listener predefinito all'interno del cluster
La prima opzione consiste nel connettersi dall'interno del cluster. Questa opzione usa la configurazione predefinita e non richiede aggiornamenti aggiuntivi. Gli esempi seguenti illustrano come connettersi dall'interno del cluster usando alpine linux normale e un client MQTT comunemente usato usando l'account del servizio e il certificato ca (Root Certificate Authority) predefinito.
Scaricare la mqtt-client.yaml
distribuzione dal repository di esempio GitHub.
Importante
Non usare il client MQTT nell'ambiente di produzione. Il client è solo a scopo di test.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml
Applicare il file di distribuzione con kubectl:
kubectl apply -f mqtt-client.yaml
pod/mqtt-client created
Dopo l'esecuzione del pod, usare kubectl exec
per eseguire i comandi all'interno del pod.
Ad esempio, per pubblicare un messaggio nel broker, aprire una shell all'interno del pod:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
All'interno della shell del pod, eseguire il comando seguente per pubblicare un messaggio nel 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)
L'output deve essere simile all'esempio seguente:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Il client Mosquitto usa il token dell'account del servizio montato in /var/run/secrets/tokens/broker-sat
per eseguire l'autenticazione con il broker. Il token è valido per 24 ore. Il client usa anche il certificato CA radice predefinito montato in /var/run/certs/ca.crt
per verificare la catena di certificati TLS del broker.
Suggerimento
È possibile usare kubectl per scaricare il certificato CA radice predefinito da usare con altri client. Ad esempio, per scaricare il certificato CA radice predefinito in un file denominato ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Per sottoscrivere l'argomento, eseguire il comando seguente:
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)
L'output deve essere simile all'esempio seguente:
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
Il client Mosquitto usa lo stesso token dell'account del servizio e il certificato CA radice per eseguire l'autenticazione con il broker e sottoscrivere l'argomento.
Per rimuovere il pod, eseguire kubectl delete pod mqtt-client -n azure-iot-operations
.
Connettere i client dall'esterno del cluster
Poiché il listener broker predefinito è impostato sul ClusterIp
tipo di servizio, non è possibile connettersi direttamente al broker dall'esterno del cluster. Per evitare interruzioni involontarie della comunicazione tra i componenti di operazioni IoT interne, è consigliabile mantenere il listener predefinito non modificato e dedicato per la comunicazione interna delle operazioni IoT. Sebbene sia possibile creare un servizio Kubernetes LoadBalancer
separato per esporre il servizio IP del cluster, è preferibile creare un listener separato con impostazioni diverse, ad esempio porte MQTT più comuni 1883 e 8883, per evitare confusione e potenziali rischi per la sicurezza.
Porta del nodo
Il modo più semplice per testare la connettività consiste nell'usare il NodePort
tipo di servizio nel listener. Con questo metodo è possibile usare <nodeExternalIP>:<NodePort>
per connettersi come illustrato nella documentazione di Kubernetes.
Ad esempio, per creare un nuovo listener broker con il NodePort
tipo di servizio, il nome aio-broker-nodeport
del servizio e l'ascolto sulla porta 1884 (porta del nodo 31884), seguire questa procedura.
Nella portale di Azure passare all'istanza di Operazioni IoT.
In Componenti selezionare MqTT Broker.
Selezionare il listener broker MQTT per NodePort Create (Crea nodo).> È possibile creare un solo listener per tipo di servizio. Se si dispone già di un listener dello stesso tipo di servizio, è possibile aggiungere altre porte al listener esistente.
Attenzione
L'impostazione dell'autenticazione su Nessuno e la mancata configurazione di TLS disattiva l'autenticazione e TLS solo a scopo di test.
Immetti le impostazioni seguenti:
Impostazione valore Name aio-broker-nodeport
Nome servizio Lasciare vuoto o usare aio-broker-nodeport
.Porta 1884 Autenticazione Scegliere tra esistente o Nessuno. Autorizzazione Scegliere tra esistente o Nessuno. Protocollo Scegliere MQTT. Porta del nodo 31884 Aggiungere le impostazioni TLS al listener selezionando Tls Add on the port (Aggiungi TLS>sulla porta). Questo passaggio non è obbligatorio se non è necessario TLS per i test. Per altre informazioni, vedere BrokerListener.
Selezionare Crea per creare il listener.
Nota
Per impostazione predefinita di Kubernetes, il numero di porta del nodo deve essere compreso nell'intervallo compreso tra 30000 e 32767.
Ottenere l'indirizzo IP esterno del nodo:
kubectl get nodes -o yaml | grep ExternalIP -C 1
L'output deve essere simile all'esempio seguente:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Usare l'indirizzo IP esterno e la porta del nodo per connettersi al broker. Ad esempio, per pubblicare un messaggio nel broker:
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Se non è presente alcun indirizzo IP esterno nell'output, è possibile usare un'installazione di Kubernetes che non espone l'indirizzo IP esterno del nodo per impostazione predefinita, ad esempio molte configurazioni di k3s, k3d o minikube. In tal caso, è possibile accedere al broker con l'INDIRIZZO IP interno insieme alla porta del nodo dai computer nella stessa rete. Ad esempio, per ottenere l'indirizzo IP interno del nodo:
kubectl get nodes -o yaml | grep InternalIP -C 1
L'output deve essere simile all'esempio seguente:
- address: 172.19.0.2
type: InternalIP
allocatable:
Usare quindi l'indirizzo IP interno e la porta del nodo per connettersi al broker da un computer all'interno dello stesso cluster. Se Kubernetes è in esecuzione in un computer locale, ad esempio con k3 a nodo singolo, è spesso possibile usare localhost
anziché l'indirizzo IP interno. Se Kubernetes è in esecuzione in un contenitore Docker, ad esempio con k3d, l'indirizzo IP interno corrisponde all'indirizzo IP del contenitore e deve essere raggiungibile dal computer host.
Bilanciamento del carico
Un altro modo per esporre il broker a Internet consiste nell'usare il LoadBalancer
tipo di servizio. Questo metodo è più complesso e potrebbe richiedere più configurazione, ad esempio la configurazione del port forwarding.
Ad esempio, per creare un nuovo listener broker con il LoadBalancer
tipo di servizio, il nome aio-broker-loadbalancer
del servizio e l'ascolto sulla porta 1883, seguire questa procedura.
Nella portale di Azure passare all'istanza di Operazioni IoT.
In Componenti selezionare MqTT Broker.
Selezionare il listener broker MQTT per NodePort Create (Crea nodo).> È possibile creare un solo listener per tipo di servizio. Se si dispone già di un listener dello stesso tipo di servizio, è possibile aggiungere altre porte al listener esistente.
Attenzione
L'impostazione dell'autenticazione su Nessuno e la mancata configurazione di TLS disattiva l'autenticazione e TLS solo a scopo di test.
Immetti le impostazioni seguenti:
Impostazione valore Name aio-broker-loadbalancer
Nome servizio Lasciare vuoto o usare aio-broker-loadbalancer
.Porta 1883 Autenticazione Scegliere tra esistente o Nessuno. Autorizzazione Scegliere tra esistente o Nessuno. Protocollo Scegliere MQTT. Aggiungere le impostazioni TLS al listener selezionando Tls Add on the port (Aggiungi TLS>sulla porta). Questo passaggio non è obbligatorio se non è necessario TLS per i test. Per altre informazioni, vedere BrokerListener.
Selezionare Crea per creare il listener.
Selezionare Crea per creare il listener.
Ottenere l'indirizzo IP esterno per il servizio del broker:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Se l'output è simile all'esempio seguente:
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
È stato quindi assegnato un indirizzo IP esterno al servizio di bilanciamento del carico. È possibile usare l'indirizzo IP esterno e la porta per connettersi al broker. Ad esempio, per pubblicare un messaggio nel broker:
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Se l'indirizzo IP esterno non è assegnato, potrebbe essere necessario usare il port forwarding o un commutatore virtuale per accedere al broker.
Usare il port forwarding
Con minikube, kind e altri sistemi di emulazione del cluster, un indirizzo IP esterno potrebbe non essere assegnato automaticamente. Ad esempio, lo stato potrebbe essere visualizzato come In sospeso.
Per accedere al broker, inoltrare la porta del listener broker all'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
Lasciare il comando port forwarding in esecuzione nel terminale.
Connettersi al broker sulla porta host con la stessa configurazione di autenticazione e TLS dell'esempio senza port forwarding.
Per altre informazioni su minikube, vedere Usare il port forwarding per accedere alle applicazioni in un cluster.
Port forwarding in AKS Edge Essentials
Per Il servizio Azure Kubernetes Edge Essentials, è necessario eseguire alcuni passaggi aggiuntivi. Con Azure Kubernetes Edge Essentials, ottenere l'indirizzo IP esterno potrebbe non essere sufficiente per connettersi al broker. Potrebbe essere necessario configurare il port forwarding e aprire la porta sul firewall per consentire il traffico verso il servizio del broker.
Innanzitutto, ottenere l'indirizzo IP esterno del listener del servizio di bilanciamento del carico del broker:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
L'output dovrebbe essere simile all'esempio seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Configurare il port forwarding al servizio
broker-loadbalancer
nell'indirizzo IP esterno192.168.0.4
e nella porta1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Aprire la porta nel firewall per consentire il traffico verso il servizio del broker:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Usare l'indirizzo IP pubblico dell'host per connettersi al broker MQTT.
Per altre informazioni sul port forwarding, vedere Esporre servizi Kubernetes a dispositivi esterni.
Accesso tramite localhost
Alcune distribuzioni kubernetes possono esporre il broker MQTT a una porta nel sistema host (localhost
) come parte della configurazione del cluster. Usare questo approccio per semplificare l'accesso al broker MQTT per i client nello stesso host.
Ad esempio, per creare un cluster k3d che esegue il mapping della porta MQTT predefinita del broker MQTT 1883 a localhost:1883
:
k3d cluster create --port '1883:1883@loadbalancer'
Oppure per aggiornare un cluster esistente:
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
localhost
Usare quindi e la porta per connettersi al broker. Ad esempio, per pubblicare un messaggio nel broker:
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Disattivare solo TLS e l'autenticazione per i test
Il motivo per cui il broker MQTT usa l'autenticazione TLS e degli account di servizio per impostazione predefinita consiste nel fornire un'esperienza sicura per impostazione predefinita che riduce al minimo l'esposizione accidentale della soluzione IoT agli utenti malintenzionati. Non è consigliabile disattivare TLS e l'autenticazione nell'ambiente di produzione. L'esposizione del broker MQTT a Internet senza autenticazione e TLS può causare accessi non autorizzati e persino attacchi Denial of Service distribuiti.
Avviso
Se si comprendono i rischi e si deve usare una porta non sicura in un ambiente ben controllato, è possibile disattivare TLS e l'autenticazione a scopo di test rimuovendo le tls
impostazioni e authenticationRef
dalla configurazione del listener.
Nella portale di Azure passare all'istanza di Operazioni IoT.
In Componenti selezionare MqTT Broker.
Selezionare il listener broker MQTT per NodePort o il listener broker MQTT per LoadBalancer>Create. È possibile creare un solo listener per tipo di servizio. Se si dispone già di un listener dello stesso tipo di servizio, è possibile aggiungere altre porte al listener esistente.
Attenzione
L'impostazione dell'autenticazione su Nessuno e la mancata configurazione di TLS disattiva l'autenticazione e TLS solo a scopo di test.
Immetti le impostazioni seguenti:
Impostazione valore Name Immettere un nome per il listener. Nome servizio Immettere un nome di servizio. Porta Immettere un numero di porta. Autenticazione Scegliere Nessuna Autorizzazione Scegliere Nessuna Protocollo Scegliere MQTT. Porta del nodo Immettere un numero compreso tra 30000 e 32767 se si usa la porta del nodo. Selezionare Crea per creare il listener.