Delen via


Connectiviteit met MQTT-broker testen met MQTT-clients

Belangrijk

Deze pagina bevat instructies voor het beheren van Azure IoT Operations-onderdelen met behulp van Kubernetes-implementatiemanifesten, die in preview zijn. Deze functie is voorzien van verschillende beperkingen en mag niet worden gebruikt voor productieworkloads.

Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

In dit artikel worden verschillende manieren beschreven om connectiviteit met MQTT Broker te testen met MQTT-clients in een niet-productieomgeving.

Standaard MQTT-broker:

  • Hiermee wordt een TLS-listener geïmplementeerd op poort 18883 met ClusterIp als het servicetype. ClusterIp betekent dat de broker alleen toegankelijk is vanuit het Kubernetes-cluster. Als u toegang wilt krijgen tot de broker van buiten het cluster, moet u een service van het type LoadBalancer of NodePort configureren.

  • Accepteert Kubernetes-serviceaccounts voor verificatie voor verbindingen vanuit het cluster. Als u verbinding wilt maken van buiten het cluster, moet u een andere verificatiemethode configureren.

Let op

Voor productiescenario's moet u verificatie van TLS- en serviceaccounts gebruiken om uw IoT-oplossing te beveiligen. Zie voor meer informatie:

Voordat u begint, installeert of configureert u IoT-bewerkingen. Gebruik de volgende opties om de connectiviteit met MQTT Broker met MQTT-clients in een niet-productieomgeving te testen.

Verbinding maken met de standaardlistener in het cluster

De eerste optie is om vanuit het cluster verbinding te maken. Deze optie maakt gebruik van de standaardconfiguratie en vereist geen extra updates. De volgende voorbeelden laten zien hoe u vanuit het cluster verbinding maakt met behulp van gewone Alpine Linux en een veelgebruikte MQTT-client, met behulp van het serviceaccount en het standaard-CA-basiscertificaat.

Download mqtt-client.yaml de implementatie vanuit de GitHub-voorbeeldopslagplaats.

Belangrijk

Gebruik de MQTT-client niet in productie. De client is alleen bedoeld voor testdoeleinden.

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

Pas het implementatiebestand toe met kubectl.

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

Zodra de pod wordt uitgevoerd, gebruikt kubectl exec u om opdrachten in de pod uit te voeren.

Als u bijvoorbeeld een bericht naar de broker wilt publiceren, opent u een shell in de pod:

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

Voer in de shell van de pod de volgende opdracht uit om een bericht naar de broker te publiceren:

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)

De uitvoer moet er als volgt uitzien:

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

De mosquitto-client gebruikt het serviceaccounttoken dat is /var/run/secrets/tokens/broker-sat gekoppeld om te verifiëren met de broker. Het token is 24 uur geldig. De client gebruikt ook het standaard-CA-basiscertificaat dat is gekoppeld /var/run/certs/ca.crt om de TLS-certificaatketen van de broker te verifiëren.

Tip

U kunt het standaard-CA-basiscertificaat downloaden kubectl voor gebruik met andere clients. Als u bijvoorbeeld het standaard-BASIS-CA-certificaat wilt downloaden naar een bestand met de naam ca.crt:

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

Voer de volgende opdracht uit om u te abonneren op het onderwerp:

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)

De uitvoer moet er als volgt uitzien:

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

De mosquitto-client gebruikt hetzelfde serviceaccounttoken en het basis-CA-certificaat om te verifiëren bij de broker en u te abonneren op het onderwerp.

Als u de pod wilt verwijderen, voert u het volgende uit kubectl delete pod mqtt-client -n azure-iot-operations.

Clients van buiten het cluster verbinden

Omdat de standaard broker-listener is ingesteld op clusterip-servicetype , kunt u geen rechtstreeks verbinding maken met de broker buiten het cluster. Om onbedoelde onderbreking van de communicatie tussen interne Azure IoT Operations-onderdelen te voorkomen, raden we u aan de standaardlistener ongewijzigd en toegewezen te houden voor interne communicatie van AIO. Hoewel het mogelijk is om een afzonderlijke Kubernetes LoadBalancer-service te maken om de IP-service van het cluster beschikbaar te maken, is het beter om een afzonderlijke listener te maken met verschillende instellingen, zoals algemenere MQTT-poort 1883 en 8883, om verwarring en potentiële beveiligingsrisico's te voorkomen.

Knooppuntpoort

De eenvoudigste manier om connectiviteit te testen, is door het type NodePort-service in de listener te gebruiken. Hiermee kunt <nodeExternalIP>:<NodePort> u verbinding maken, zoals in de Kubernetes-documentatie.

Als u bijvoorbeeld een nieuwe brokerlistener wilt maken met het type poortservice van knooppunt, servicenaam aio-broker-nodeporten luisteren op poort 1884 (knooppuntpoort 31884):

  1. Ga in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer MQTT Broker-listener voor NodePort>Create. U kunt slechts één listener per servicetype maken. Als u al een listener van hetzelfde servicetype hebt, kunt u meer poorten toevoegen aan de bestaande listener.

    Let op

    Als u verificatie instelt op Geen en TLS niet configureert, worden verificatie en TLS alleen uitgeschakeld voor testdoeleinden.

    Geef de volgende instellingen op:

    Instelling Weergegeven als
    Naam aio-broker-nodeport
    Servicenaam Leeg laten of aio-broker-nodeport
    Poort 1884
    Verificatie Kies uit bestaande of geen
    Autorisatie Kies uit bestaande of geen
    Protocol MQTT kiezen
    Knooppuntpoort 31884
  4. Voeg TLS-instellingen toe aan de listener door TLS-invoegtoepassing> op de poort te selecteren. Deze stap is niet vereist als u TLS niet nodig hebt voor testen. Zie BrokerListener voor meer informatie.

  5. Selecteer Maken om de listener te maken.

Notitie

Standaard moet het poortnummer van het knooppunt zich in het bereik 30000-32767 bevinden.

Haal het externe IP-adres van het knooppunt op:

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

De uitvoer moet er als volgt uitzien:

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

Gebruik het externe IP-adres en de knooppuntpoort om verbinding te maken met de broker. Als u bijvoorbeeld een bericht naar de broker wilt publiceren:

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

Als de uitvoer geen extern IP-adres bevat, gebruikt u mogelijk een Kubernetes-installatie die het externe IP-adres van het knooppunt niet standaard beschikbaar maakt, zoals veel instellingen van k3's, k3d of minikube. In dat geval hebt u toegang tot de broker met het interne IP-adres, samen met de knooppuntpoort van computers in hetzelfde netwerk. Als u bijvoorbeeld het interne IP-adres van het knooppunt wilt ophalen:

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

De uitvoer moet er als volgt uitzien:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Gebruik vervolgens het interne IP-adres en de knooppuntpoort om vanaf een computer in hetzelfde cluster verbinding te maken met de broker. Als Kubernetes wordt uitgevoerd op een lokale computer, zoals met k3's met één knooppunt, kunt u dit vaak gebruiken localhost in plaats van het interne IP-adres. Als Kubernetes wordt uitgevoerd in een Docker-container, zoals bij k3d, komt het interne IP-adres overeen met het IP-adres van de container en moet het bereikbaar zijn vanaf de hostcomputer.

Load balancer

Een andere manier om de broker beschikbaar te maken op internet is door het servicetype LoadBalancer te gebruiken. Deze methode is complexer en vereist mogelijk extra configuratie, zoals het instellen van port forwarding.

Als u bijvoorbeeld een nieuwe broker-listener wilt maken met een load balancer-servicetype, servicenaam aio-broker-loadbalanceren luisteren op poort 1883:

  1. Ga in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer MQTT Broker-listener voor NodePort>Create. U kunt slechts één listener per servicetype maken. Als u al een listener van hetzelfde servicetype hebt, kunt u meer poorten toevoegen aan de bestaande listener.

    Geef de volgende instellingen op:

    Instelling Weergegeven als
    Naam aio-broker-loadbalancer
    Servicenaam Leeg laten of aio-broker-loadbalancer
    Poort 1883
    Verificatie Kies uit bestaande of geen
    Autorisatie Kies uit bestaande of geen
    Protocol MQTT kiezen
  4. Voeg TLS-instellingen toe aan de listener door TLS-invoegtoepassing> op de poort te selecteren. Deze stap is niet vereist als u TLS niet nodig hebt voor testen. Zie BrokerListener voor meer informatie.

  5. Selecteer Maken om de listener te maken.

  6. Selecteer Maken om de listener te maken.

Haal het externe IP-adres voor de brokerservice op:

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

Als de uitvoer er ongeveer als volgt uitziet:

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

Dit betekent dat er een extern IP-adres is toegewezen aan de load balancer-service en dat u het externe IP-adres en de poort kunt gebruiken om verbinding te maken met de broker. Als u bijvoorbeeld een bericht naar de broker wilt publiceren:

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

Als het externe IP-adres niet is toegewezen, moet u mogelijk port forwarding of een virtuele switch gebruiken om toegang te krijgen tot de broker.

Port Forwarding gebruiken

Met minikube-, kind- en andere clusteremulatiesystemen wordt mogelijk niet automatisch een extern IP-adres toegewezen. Het kan bijvoorbeeld worden weergegeven als status In behandeling .

  1. Als u toegang wilt krijgen tot de broker, stuurt u de broker-listenerpoort door naar de 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. Laat de opdracht port forwarding actief in de terminal.

  3. Maak verbinding met de broker op de hostpoort met dezelfde verificatie en TLS-configuratie als het voorbeeld zonder port forwarding.

Zie Port Forwarding gebruiken voor toegang tot toepassingen in een cluster voor meer informatie over minikube

Port forwarding op AKS Edge Essentials

Voor Azure Kubernetes Services Edge Essentials moet u een paar extra stappen uitvoeren. Met AKS Edge Essentials is het mogelijk dat het externe IP-adres niet voldoende is om verbinding te maken met de broker. Mogelijk moet u port forwarding instellen en de poort op de firewall openen om verkeer naar de brokerservice toe te staan.

  1. Haal eerst het externe IP-adres van de load balancer-listener van de broker op:

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

    Uitvoer moet er ongeveer als volgt uitzien:

    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. Port Forwarding naar de broker-loadbalancer service instellen op het externe IP-adres 192.168.0.4 en de poort 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Open de poort op de firewall om verkeer naar de brokerservice toe te staan:

    New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. Gebruik het openbare IP-adres van de host om verbinding te maken met de MQTT-broker.

Zie Kubernetes-services beschikbaar maken voor externe apparaten voor meer informatie over port forwarding.

Toegang via localhost

Sommige Kubernetes-distributies kunnen MQTT-broker beschikbaar maken voor een poort op het hostsysteem (localhost) als onderdeel van de clusterconfiguratie. Gebruik deze methode om clients op dezelfde host gemakkelijker toegang te geven tot MQTT-broker.

Als u bijvoorbeeld een K3d-cluster wilt maken met de toewijzing van de standaard MQTT-brokerpoort 1883 aan localhost:1883:

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

Of als u een bestaand cluster wilt bijwerken:

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

localhost Gebruik vervolgens en de poort om verbinding te maken met de broker. Als u bijvoorbeeld een bericht naar de broker wilt publiceren:

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

TLS en verificatie alleen uitschakelen voor testen

De reden dat MQTT Broker standaard TLS- en serviceaccountverificatie gebruikt, is door een standaardbeveiligingservaring te bieden waarmee onbedoelde blootstelling van uw IoT-oplossing aan aanvallers wordt geminimaliseerd. U moet TLS en verificatie in productie niet uitschakelen. Het blootstellen van MQTT-broker aan internet zonder verificatie en TLS kan leiden tot onbevoegde toegang en zelfs DDOS-aanvallen.

Waarschuwing

Als u de risico's begrijpt en een onveilige poort in een goed beheerde omgeving moet gebruiken, kunt u TLS en verificatie uitschakelen voor testdoeleinden door de tls instellingen authenticationRef uit de listenerconfiguratie te verwijderen.

  1. Ga in Azure Portal naar uw IoT Operations-exemplaar.

  2. Selecteer onder Onderdelen de optie MQTT Broker.

  3. Selecteer MQTT-brokerlistener voor NodePort of MQTT-brokerlistener voor LoadBalancer>Create. U kunt slechts één listener per servicetype maken. Als u al een listener van hetzelfde servicetype hebt, kunt u meer poorten toevoegen aan de bestaande listener.

    Geef de volgende instellingen op:

    Instelling Weergegeven als
    Naam Voer een naam in voor de listener
    Servicenaam Voer een servicenaam in
    Poort Voer een poortnummer in
    Verificatie Kies Geen
    Autorisatie Kies Geen
    Protocol MQTT kiezen
    Knooppuntpoort Voer een getal in tussen 30000-32767 als u knooppuntpoort gebruikt
  4. Selecteer Maken om de listener te maken.