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:
- TLS configureren met automatisch certificaatbeheer voor het beveiligen van MQTT-communicatie in MQTT-broker
- Verificatie configureren in MQTT-broker
- Kubernetes-services beschikbaar maken voor externe apparaten met behulp van port forwarding of een virtuele switch met Azure Kubernetes Services Edge Essentials.
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-nodeport
en luisteren op poort 1884 (knooppuntpoort 31884):
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
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 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.
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-loadbalancer
en luisteren op poort 1883:
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
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-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 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.
Selecteer Maken om de listener te maken.
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 .
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
Laat de opdracht port forwarding actief in de terminal.
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.
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
Port Forwarding naar de
broker-loadbalancer
service instellen op het externe IP-adres192.168.0.4
en de poort1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
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
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.
Ga in Azure Portal naar uw IoT Operations-exemplaar.
Selecteer onder Onderdelen de optie MQTT Broker.
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.
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 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 Selecteer Maken om de listener te maken.