Testen der Konnektivität zum MQTT-Broker mit MQTT-Clients
Wichtig
Diese Seite enthält Anweisungen zum Verwalten der Komponenten von Azure IoT Einsatz mithilfe von Kubernetes-Bereitstellungsmanifesten. Diese Option befindet sich in der Vorschau. Dieses Feature wird mit einigen Einschränkungen bereitgestellt und sollte nicht für Produktionsworkloads verwendet werden.
Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.
In diesem Artikel werden verschiedene Möglichkeiten zum Testen der Konnektivität mit MQTT-Broker mit MQTT-Clients in einer Nichtproduktionsumgebung gezeigt.
Standardmäßig, MQTT-Broker:
Stellt einen TLS-fähigen Listener auf Port 18883 mit ClusterIp als Diensttyp bereit. ClusterIp bedeutet, dass der Broker nur über den Kubernetes-Cluster zugänglich ist. Um von außerhalb des Clusters auf den Broker zuzugreifen, müssen Sie einen Dienst vom Typ LoadBalancer oder NodePort konfigurieren.
Akzeptiert nur Kubernetes-Dienstkonten für die Authentifizierung für Verbindungen aus dem Cluster. Um eine Verbindung von außerhalb des Clusters herzustellen, müssen Sie eine andere Authentifizierungsmethode konfigurieren.
Achtung
Für Produktionsszenarien sollten Sie die TLS- und Dienstkontenauthentifizierung verwenden, um Ihre IoT-Lösung zu schützen. Weitere Informationen finden Sie unter:
- Konfigurieren von TLS mit automatischer Zertifikatverwaltung zum Sichern der MQTT-Kommunikation
- Konfigurieren der MQTT-Brokerauthentifizierung
- Stellen Sie Kubernetes-Dienste für externe Geräte bereit, indem Sie die Portweiterleitung oder einen virtuellen Switch mit Azure Kubernetes Services Edge Essentials verwenden.
Bevor Sie beginnen, installieren oder konfigurieren Sie IoT-Vorgänge. Verwenden Sie die folgenden Optionen, um die Konnektivität zum MQTT-Broker mit MQTT-Clients in einer Nichtproduktionsumgebung zu testen.
Herstellen einer Verbindung mit dem Standardlistener im Cluster
Die erste Option besteht darin, eine Verbindung aus dem Cluster herzustellen. Diese Option verwendet die Standardkonfiguration und erfordert keine zusätzlichen Updates. Die folgenden Beispiele zeigen, wie eine Verbindung innerhalb des Clusters mit einfachem Alpine Linux und einem gängigen MQTT-Client unter Verwendung des Dienstkontos und des Standard-Root-ZS-Zertifikats hergestellt wird.
Laden Sie die mqtt-client.yaml
-Bereitstellung aus dem GitHub-Beispiel-Repository herunter.
Wichtig
Verwenden Sie den MQTT-Client nicht in der Produktion. Dieser Client dient ausschließlich zu Testzwecken.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml
Wenden Sie die Bereitstellungsdatei mit kubectl an.
kubectl apply -f mqtt-client.yaml
pod/mqtt-client created
Sobald der Pod läuft, verwenden Sie kubectl exec
, um Befehle innerhalb des Pods auszuführen.
Um beispielsweise eine Nachricht im Broker zu veröffentlichen, öffnen Sie eine Shell innerhalb des Pods:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
Führen Sie innerhalb der Shell des Pods den folgenden Befehl aus, um eine Nachricht im Broker zu veröffentlichen:
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)
Die Ausgabe sollte in etwa wie folgt aussehen:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Der Mosquitto-Client verwendet das bei /var/run/secrets/tokens/broker-sat
hinterlegte Dienstkontotoken zur Authentifizierung beim Broker. Das Token ist 24 Stunden lang gültig. Der Client verwendet auch das Standard-Root-ZS-Zertifikat, das auf /var/run/certs/ca.crt
gespeichert ist, um die TLS-Zertifikatskette des Brokers zu überprüfen.
Tipp
Sie können mit kubectl
das Standardzertifikat der Stammzertifizierungsstelle herunterladen, um es mit anderen Clients zu verwenden. So laden Sie z. B. das Standardzeritifkat einer Stammzertifizierungsstelle in eine Datei mit dem Namen ca.crt
herunter
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Führen Sie zum Abonnieren des Themas den folgenden Befehl aus:
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)
Die Ausgabe sollte in etwa wie folgt aussehen:
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
Der Mosquitto-Client verwendet dasselbe Dienstkontotoken und Root-ZS-Zertifikat, um sich beim Broker zu authentifizieren und das Thema zu abonnieren.
Führen Sie zum Entfernen des Pods kubectl delete pod mqtt-client -n azure-iot-operations
aus.
Verbinden von Clients von außerhalb des Clusters
Da der Standardbrokerlistener auf den Diensttyp ClusterIp festgelegt ist, können Sie keine direkte Verbindung mit dem Broker von außerhalb des Clusters herstellen. Um unbeabsichtigte Unterbrechungen der Kommunikation zwischen internen Azure IoT Einsatz-Komponenten zu verhindern, wird empfohlen, den Standardlistener nicht zu ändern und für die interne AIO-Kommunikation zu verwenden. Es ist zwar möglich, einen separaten Kubernetes-LoadBalancer-Dienst zu erstellen, um den Cluster-IP-Dienst verfügbar zu machen, es ist aber besser, einen separaten Listener mit anderen Einstellungen zu erstellen, z. B. den häufig verwendeten MQTT-Ports 1883 und 8883, um Verwirrung und potenzielle Sicherheitsrisiken zu vermeiden.
Knotenport
Die einfachste Möglichkeit zum Testen der Konnektivität bietet die Verwendung des Diensttyps NodePort im Listener. Damit können Sie mit <nodeExternalIP>:<NodePort>
eine Verbindung wie in der Kubernetes-Dokumentation herstellen.
So erstellen Sie beispielsweise einen neuen Brokerlistener mit dem Diensttyp „NodePort“ und dem Dienstnamen aio-broker-nodeport
, der an Port 1884 lauscht (Knotenport 31884)
Navigieren Sie im Azure-Portal zu Ihrer IoT Einsatz-Instanz.
Wählen Sie unter "Komponenten" den MQTT-Brokeraus.
Wählen Sie den MQTT-Brokerlistener für NodePort>Erstellen aus. Sie können nur einen Listener pro Diensttyp erstellen. Wenn Sie bereits über einen Listener desselben Diensttyps verfügen, können Sie dem vorhandenen Listener weitere Ports hinzufügen.
Achtung
Wenn Sie die Authentifizierung auf Keine festlegen und TLS nicht konfigurieren, werden die Authentifizierung und TLS nur zu Testzwecken deaktiviert.
Geben Sie folgende Einstellungen ein:
Einstellung Wert Name aio-broker-nodeport
Dienstname Leer lassen oder aio-broker-nodeport
Port 1884 Authentifizierung Vorhandene oder Keine auswählen Autorisierung Vorhandene oder Keine auswählen Protokoll Wählen Sie MQTT aus. Knotenport 31884 Fügen Sie dem Listener TLS-Einstellungen hinzu, indem Sie TLS>Hinzufügen für den Port auswählen. Dieser Schritt ist nicht erforderlich, wenn Sie TLS nicht zum Testen benötigen. Weitere Informationen finden Sie unter BrokerListener.
Wählen Sie Erstellen aus, um den Listener zu erstellen.
Hinweis
Standardmäßig muss sich die Knotenportnummer im Bereich 30000–32767 befinden.
Rufen Sie die externe IP-Adresse des Knotens ab:
kubectl get nodes -o yaml | grep ExternalIP -C 1
Die Ausgabe sollte in etwa wie folgt aussehen:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Verwenden Sie die externe IP-Adresse und den Knotenport, um eine Verbindung mit dem Broker herzustellen. So veröffentlichen Sie z. B. eine Nachricht im Broker
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Wenn keine in der Ausgabe keine externe IP-Adresse enthalten ist, verwenden Sie möglicherweise ein Kubernetes-Setup, das die externe IP-Adresse des Knotens standardmäßig nicht verfügbar macht, dies gilt z. B. für viele Setups von k3s, k3d oder minikube. In diesem Fall können Sie auf den Broker mit der internen IP-Adresse und dem Knotenport von Computern im selben Netzwerk zugreifen. So rufen Sie z. B. die interne IP-Adresse des Knotens ab
kubectl get nodes -o yaml | grep InternalIP -C 1
Die Ausgabe sollte in etwa wie folgt aussehen:
- address: 172.19.0.2
type: InternalIP
allocatable:
Verwenden Sie dann die interne IP-Adresse und den Knotenport, um eine Verbindung mit dem Broker von einem Computer im selben Clusters herzustellen. Wenn Kubernetes auf einem lokalen Computer ausgeführt wird, z. B. mit k3s und einem einzelnen Knoten, können Sie häufig anstelle der internen IP-Adresse localhost
verwenden. Wenn Kubernetes in einem Docker-Container ausgeführt wird, wie bei k3d, entspricht die interne IP-Adresse der IP-Adresse des Containers und sollte vom Hostcomputer aus erreichbar sein.
Load Balancer
Eine weitere Möglichkeit, den Broker für das Internet verfügbar zu machen, bietet die Verwendung des Diensttyps LoadBalancer. Diese Methode ist komplexer und erfordert möglicherweise eine zusätzliche Konfiguration, z. B. die Einrichtung einer Portweiterleitung.
So erstellen Sie beispielsweise einen neuen Brokerlistener mit dem Diensttyp „LoadBalancer“ und dem Dienstnamen aio-broker-loadbalancer
, der an Port 1883 lauscht
Navigieren Sie im Azure-Portal zu Ihrer IoT Einsatz-Instanz.
Wählen Sie unter "Komponenten" den MQTT-Brokeraus.
Wählen Sie den MQTT-Brokerlistener für NodePort>Erstellen aus. Sie können nur einen Listener pro Diensttyp erstellen. Wenn Sie bereits über einen Listener desselben Diensttyps verfügen, können Sie dem vorhandenen Listener weitere Ports hinzufügen.
Achtung
Wenn Sie die Authentifizierung auf Keine festlegen und TLS nicht konfigurieren, werden die Authentifizierung und TLS nur zu Testzwecken deaktiviert.
Geben Sie folgende Einstellungen ein:
Einstellung Wert Name aio-broker-loadbalancer
Dienstname Leer lassen oder aio-broker-loadbalancer
Port 1883 Authentifizierung Vorhandene oder Keine auswählen Autorisierung Vorhandene oder Keine auswählen Protokoll Wählen Sie MQTT aus. Fügen Sie dem Listener TLS-Einstellungen hinzu, indem Sie TLS>Hinzufügen für den Port auswählen. Dieser Schritt ist nicht erforderlich, wenn Sie TLS nicht zum Testen benötigen. Weitere Informationen finden Sie unter BrokerListener.
Wählen Sie Erstellen aus, um den Listener zu erstellen.
Wählen Sie Erstellen aus, um den Listener zu erstellen.
Rufen Sie die externe IP-Adresse für den Dienst des Brokers ab:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Die Ausgabe sieht in etwa wie folgt aus:
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
Dies bedeutet, dass dem Lastenausgleichsdienst eine externe IP-Adresse zugewiesen wurde. Sie können dann die externe IP-Adresse und den Port verwenden, um eine Verbindung mit dem Broker herzustellen. So veröffentlichen Sie z. B. eine Nachricht im Broker
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Wenn die externe IP-Adresse nicht zugewiesen ist, müssen Sie möglicherweise die Portweiterleitung oder einen virtuellen Switch verwenden, um auf den Broker zuzugreifen.
Verwenden der Portweiterleitung
Bei Minikube-, Kind- und anderen Clusteremulationssystemen wird möglicherweise keine externe IP automatisch zugewiesen. Sie kann z. B. als ausstehender Zustand angezeigt werden.
Um auf den Broker zuzugreifen, leiten Sie den Broker-Überwachungsport an den Host weiter.
# 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
Lassen Sie den Portweiterleitungsbefehl im Terminal laufen.
Verbinden Sie sich mit dem Broker am Host-Port mit der gleichen Authentifizierungs- und TLS-Konfiguration wie im Beispiel ohne Portweiterleitung.
Weitere Informationen über Minikube finden Sie unter Verwenden der Portweiterleitung für den Zugriff auf Anwendungen in einem Cluster.
Portweiterleitung unter AKS Edge Essentials
Für Azure Kubernetes Services Edge Essentials müssen Sie einige zusätzliche Schritte ausführen. Bei AKS Edge Essentials reicht das Abrufen der externen IP-Adresse möglicherweise nicht aus, um eine Verbindung mit dem Broker herzustellen. Sie müssen eventuell die Portweiterleitung einrichten und den Port in der Firewall öffnen, um Datenverkehr mit dem Dienst des Brokers zuzulassen.
Rufen Sie zunächst die externe IP-Adresse des Lastenausgleichslisteners des Brokers ab:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
Die Ausgabe sollte in etwa wie folgt aussehen:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Richten Sie die Portweiterleitung an den Dienst
broker-loadbalancer
für die externe IP-Adresse192.168.0.4
und Port1883
ein:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Öffnen Sie den Port auf der Firewall, um Datenverkehr zum Brokerdienst zuzulassen:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Verwenden Sie die öffentliche IP-Adresse des Hosts, um eine Verbindung mit dem MQTT-Broker herzustellen.
Weitere Informationen zur Portweiterleitung finden Sie unter Bereitstellen von Kubernetes-Diensten für externe Geräte.
Zugreifen über localhost
Einige Kubernetes-Distributionen können MQTT-Broker als Teil der Clusterkonfiguration über einen Port auf dem Hostsystem (localhost) verfügbar machen. Verwenden Sie diesen Ansatz, um Clients auf demselben Host den Zugriff auf den MQTT-Broker zu vereinfachen.
So erstellen Sie z. B. einen K3d-Cluster mit Zuordnung des standardmäßigen MQTT-Ports 1883 vom MQTT-Broker zu localhost:1883
k3d cluster create --port '1883:1883@loadbalancer'
So aktualisieren Sie alternativ einen vorhandenen Cluster
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
Verwenden Sie dann localhost
und den Port, um eine Verbindung mit dem Broker herzustellen. So veröffentlichen Sie z. B. eine Nachricht im Broker
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Deaktivieren von TLS und Authentifizierung ausschließlich für Tests
Der Grund dafür, dass der MQTT-Broker standardmäßig TLS- und Dienstkontenauthentifizierung verwendet, besteht darin, eine sichere standardmäßige Erfahrung bereitzustellen, die die unbeabsichtigte Gefährdung Ihrer IoT-Lösung gegenüber Angreifern minimiert. Sie sollten TLS und Authentifizierung in der Produktion nicht deaktivieren. Das Offenlegen des MQTT-Brokers im Internet ohne Authentifizierung und TLS kann zu nicht autorisierten Zugriffen und sogar zu DDOS-Angriffen führen.
Warnung
Wenn Sie die Risiken verstehen und einen unsicheren Port in einer gut kontrollierten Umgebung verwenden möchten, können Sie TLS und die Authentifizierung zu Testzwecken deaktivieren, indem Sie die Einstellungen tls
und authenticationRef
aus der Listenerkonfiguration entfernen.
Navigieren Sie im Azure-Portal zu Ihrer IoT Einsatz-Instanz.
Wählen Sie unter "Komponenten" den MQTT-Brokeraus.
Wählen Sie MQTT-Brokerlistener für NodePort oder MQTT-Brokerlistener für LoadBalancer>Erstellen aus. Sie können nur einen Listener pro Diensttyp erstellen. Wenn Sie bereits über einen Listener desselben Diensttyps verfügen, können Sie dem vorhandenen Listener weitere Ports hinzufügen.
Achtung
Wenn Sie die Authentifizierung auf Keine festlegen und TLS nicht konfigurieren, werden die Authentifizierung und TLS nur zu Testzwecken deaktiviert.
Geben Sie folgende Einstellungen ein:
Einstellung Wert Name Geben Sie einen Namen für den Listener ein. Dienstname Geben Sie einen Dienstnamen ein. Port Eingeben einer Portnummer Authentifizierung Wählen Sie die Option Keine aus. Autorisierung Wählen Sie die Option Keine aus. Protokoll Wählen Sie MQTT aus. Knotenport Geben Sie eine Zahl zwischen 30000 und 32767 ein, wenn Sie den Knotenport verwenden. Wählen Sie Erstellen aus, um den Listener zu erstellen.