Condividi tramite


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 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 gli scenari di produzione, usare l'autenticazione degli account TLS e del servizio per proteggere la soluzione IoT. Per altre informazioni, vedi:

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-nodeportdel servizio e l'ascolto sulla porta 1884 (porta del nodo 31884), seguire questa procedura.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. 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
  4. 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.

  5. 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-loadbalancerdel servizio e l'ascolto sulla porta 1883, seguire questa procedura.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. 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.
  4. 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.

  5. Selezionare Crea per creare il listener.

  6. 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.

  1. 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
    
  2. Lasciare il comando port forwarding in esecuzione nel terminale.

  3. 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.

  1. 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
    
  2. Configurare il port forwarding al servizio broker-loadbalancer nell'indirizzo IP esterno 192.168.0.4 e nella porta 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. 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
    
  4. 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.

  1. Nella portale di Azure passare all'istanza di Operazioni IoT.

  2. In Componenti selezionare MqTT Broker.

  3. 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.
  4. Selezionare Crea per creare il listener.