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à al broker MQTT con client MQTT in un ambiente non di produzione.
Per impostazione predefinita, il broker MQTT:
Distribuisce un listener abilitato per TLS 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 tipo LoadBalancer o NodePort.
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 scenari di produzione, è consigliabile usare l'autenticazione degli account TLS e del servizio per proteggere la soluzione IoT. Per altre informazioni, vedi:
- Configurare TLS con la gestione automatica dei certificati per proteggere la comunicazione 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 Azure Kubernetes Services Edge Essentials.
Prima di iniziare, installare o configurare Operazioni di IoT. Usare le opzioni seguenti per testare la connettività al broker MQTT con 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 radice predefinito.
Scaricare mqtt-client.yaml
la 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
Quando il pod è in esecuzione, usare kubectl exec
per eseguire 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 dovrebbe essere simile al 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 dovrebbe essere simile al 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 all'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 tipo di servizio ClusterIp , non è possibile connettersi direttamente al broker dall'esterno del cluster. Per evitare interruzioni accidentali della comunicazione tra i componenti interni delle operazioni IoT di Azure, è consigliabile mantenere il listener predefinito non modificato e dedicato per la comunicazione interna AIO. Sebbene sia possibile creare un servizio LoadBalancer Kubernetes separato per esporre il servizio IP del cluster, è preferibile creare un listener separato con impostazioni diverse, ad esempio la porta MQTT 1883 e 8883 più comune, per evitare confusione e potenziali rischi per la sicurezza.
Porta del nodo
Il modo più semplice per testare la connettività consiste nell'usare il tipo di servizio NodePort nel listener. A tale scopo, è possibile usare <nodeExternalIP>:<NodePort>
per connettersi come nella documentazione di Kubernetes.
Ad esempio, per creare un nuovo listener broker con il tipo di servizio di porta del nodo, il nome aio-broker-nodeport
del servizio e l'ascolto sulla porta 1884 (porta del nodo 31884):
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 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 30000-32767.
Ottenere l'indirizzo IP esterno del nodo:
kubectl get nodes -o yaml | grep ExternalIP -C 1
L'output dovrebbe essere simile al 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 dovrebbe essere simile al 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 tipo di servizio LoadBalancer . Questo metodo è più complesso e potrebbe richiedere una configurazione aggiuntiva, ad esempio la configurazione del port forwarding.
Ad esempio, per creare un nuovo listener broker con il tipo di servizio di bilanciamento del carico, il nome aio-broker-loadbalancer
del servizio e l'ascolto sulla porta 1883:
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 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 al 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
Ciò significa che un indirizzo IP esterno è stato assegnato al servizio di bilanciamento del carico ed è 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, potrebbe essere visualizzato come Stato 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 Azure Kubernetes Services 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 al 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 ai client nello stesso host per accedere al broker MQTT.
Ad esempio, per creare un cluster K3d con 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 broker MQTT usa l'autenticazione TLS e degli account di servizio per impostazione predefinita per fornire un'esperienza sicura per impostazione predefinita che riduca al minimo l'esposizione inavvertita della soluzione IoT ad 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 DDOS.
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-32767 se si usa la porta del nodo Selezionare Crea per creare il listener.