Testa anslutningen till MQTT-asynkron meddelandekö med MQTT-klienter
Viktigt!
Den här sidan innehåller instruktioner för att hantera Azure IoT Operations-komponenter med hjälp av Kubernetes-distributionsmanifest, som finns i förhandsversion. Den här funktionen har flera begränsningar och bör inte användas för produktionsarbetsbelastningar.
Juridiska villkor för Azure-funktioner i betaversion, förhandsversion eller som av någon annan anledning inte har gjorts allmänt tillgängliga ännu finns i kompletterande användningsvillkor för Microsoft Azure-förhandsversioner.
Den här artikeln visar olika sätt att testa anslutningen till en MQTT-koordinator med MQTT-klienter i en icke-produktionsmiljö.
Som standard en MQTT-koordinator:
- Distribuerar en TLS-protokollaktiverad lyssnare (Transport Layer Security) på port 18883 med
ClusterIp
som tjänsttyp.ClusterIp
innebär att koordinatorn endast är tillgänglig från Kubernetes-klustret. Om du vill komma åt asynkron meddelandekö utanför klustret måste du konfigurera en tjänst av typenLoadBalancer
ellerNodePort
. - Accepterar Kubernetes-tjänstkonton för autentisering för anslutningar inifrån klustret. Om du vill ansluta utanför klustret måste du konfigurera en annan autentiseringsmetod.
Varning
I produktionsscenarier använder du autentisering med TLS- och tjänstkonton för att skydda din IoT-lösning. Mer information finns i:
- Konfigurera TLS med automatisk certifikathantering för att skydda MQTT-kommunikation i MQTT-koordinatorn.
- Konfigurera autentisering i MQTT-koordinatorn.
- Exponera Kubernetes-tjänster för externa enheter med hjälp av portvidarebefordring eller en virtuell växel med Azure Kubernetes Services (AKS) Edge Essentials.
Innan du börjar installerar eller konfigurerar du Azure IoT-åtgärder. Använd följande alternativ för att testa anslutningen till MQTT-koordinatorn med MQTT-klienter i en icke-produktionsmiljö.
Ansluta till standardlyssnaren i klustret
Det första alternativet är att ansluta inifrån klustret. Det här alternativet använder standardkonfigurationen och kräver inga extra uppdateringar. Följande exempel visar hur du ansluter inifrån klustret med hjälp av vanlig Alpine Linux och en vanlig MQTT-klient med hjälp av tjänstkontot och certifikatet för standardrotcertifikatutfärdare (CA).
Ladda ned distributionen mqtt-client.yaml
från GitHub-exempellagringsplatsen.
Viktigt!
Använd inte MQTT-klienten i produktion. Klienten är endast i testsyfte.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml
Använd distributionsfilen med kubectl:
kubectl apply -f mqtt-client.yaml
pod/mqtt-client created
När podden har körts använder du kubectl exec
för att köra kommandon i podden.
Om du till exempel vill publicera ett meddelande till asynkron meddelandekö öppnar du ett gränssnitt i podden:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
I poddens gränssnitt kör du följande kommando för att publicera ett meddelande till asynkron meddelandekö:
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)
Utdata bör se ut ungefär som följande exempel:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Mosquitto-klienten använder den tjänstkontotoken som monterats på /var/run/secrets/tokens/broker-sat
för att autentisera med asynkron meddelandekö. Token är giltig i 24 timmar. Klienten använder också standardrotcertifikatutfärdarcertifikatet monterat på /var/run/certs/ca.crt
för att verifiera koordinatorns TLS-certifikatkedja.
Dricks
Du kan använda kubectl för att ladda ned standardcertifikatutfärdarcertifikatet för rotcertifikatutfärdare som ska användas med andra klienter. Om du till exempel vill ladda ned standardcertifikatutfärdarcertifikatet för rotcertifikatutfärdare till en fil med namnet ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Om du vill prenumerera på ämnet kör du följande kommando:
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)
Utdata bör se ut ungefär som följande exempel:
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
Mosquitto-klienten använder samma tjänstkontotoken och rotcertifikatutfärdarcertifikatet för att autentisera med asynkron meddelandekö och prenumerera på ämnet.
Om du vill ta bort podden kör du kubectl delete pod mqtt-client -n azure-iot-operations
.
Ansluta klienter utanför klustret
Eftersom standardsynkroniseringslyssnaren är inställd på ClusterIp
tjänsttypen kan du inte ansluta till asynkron meddelandekö direkt utanför klustret. För att förhindra oavsiktliga avbrott i kommunikationen mellan interna IoT Operations-komponenter rekommenderar vi att du behåller standardlyssnaren oförändrad och dedikerad för intern IoT Operations-kommunikation. Även om det är möjligt att skapa en separat Kubernetes-tjänst LoadBalancer
för att exponera klustrets IP-tjänst är det bättre att skapa en separat lyssnare med olika inställningar, som vanligare MQTT-portar 1883 och 8883, för att undvika förvirring och potentiella säkerhetsrisker.
Nodport
Det enklaste sättet att testa anslutningen är att använda NodePort
tjänsttypen i lyssnaren. Med den metoden kan du använda <nodeExternalIP>:<NodePort>
för att ansluta på det sätt som visas i Kubernetes-dokumentationen.
Om du till exempel vill skapa en ny koordinatorlyssnare NodePort
med tjänsttypen, tjänstnamnet aio-broker-nodeport
och lyssnar på port 1884 (nodport 31884) följer du dessa steg.
I Azure Portal går du till din IoT Operations-instans.
Under Komponenter väljer du MQTT Broker.
Välj MQTT-koordinatorlyssnare för NodePort>Create. Du kan bara skapa en lyssnare per tjänsttyp. Om du redan har en lyssnare av samma tjänsttyp kan du lägga till fler portar i den befintliga lyssnaren.
Varning
Om du anger autentisering till Ingen och inte konfigurerar TLS inaktiveras autentisering och TLS endast i testsyfte.
Ange följande inställningar:
Inställning Värde Name aio-broker-nodeport
Servicenamn Lämna tomt eller använd aio-broker-nodeport
.Port 1884 Autentisering Välj mellan befintlig eller Ingen. Auktorisering Välj mellan befintlig eller Ingen. Protokoll Välj MQTT. Nodport 31884 Lägg till TLS-inställningar i lyssnaren genom att välja TLS>Lägg till på porten. Det här steget krävs inte om du inte behöver TLS för testning. Mer information finns i BrokerListener.
Välj Skapa för att skapa lyssnaren.
Kommentar
Som Kubernetes-standard måste nodportnumret ligga i intervallet 30000 till 32767.
Hämta nodens externa IP-adress:
kubectl get nodes -o yaml | grep ExternalIP -C 1
Utdata bör se ut ungefär som följande exempel:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Använd den externa IP-adressen och nodporten för att ansluta till asynkron meddelandekö. Om du till exempel vill publicera ett meddelande till asynkron meddelandekö:
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Om det inte finns någon extern IP-adress i utdata kanske du använder en Kubernetes-konfiguration som inte exponerar nodens externa IP-adress som standard, som många installationer av k3s, k3d eller minikube. I så fall kan du komma åt asynkron meddelandekö med den interna IP-adressen tillsammans med nodporten från datorer i samma nätverk. Om du till exempel vill hämta nodens interna IP-adress:
kubectl get nodes -o yaml | grep InternalIP -C 1
Utdata bör se ut ungefär som följande exempel:
- address: 172.19.0.2
type: InternalIP
allocatable:
Använd sedan den interna IP-adressen och nodporten för att ansluta till asynkron meddelandekö från en dator i samma kluster. Om Kubernetes körs på en lokal dator, till exempel med k3:or med en nod, kan du ofta använda localhost
i stället för den interna IP-adressen. Om Kubernetes körs i en Docker-container, till exempel med k3d, motsvarar den interna IP-adressen containerns IP-adress och bör kunna nås från värddatorn.
Lastbalanserare
Ett annat sätt att exponera mäklaren för Internet är att använda LoadBalancer
tjänsttypen. Den här metoden är mer komplex och kan kräva mer konfiguration, som att konfigurera portvidarebefordring.
Om du till exempel vill skapa en ny koordinatorlyssnare LoadBalancer
med tjänsttypen, tjänstnamnet aio-broker-loadbalancer
och lyssna på port 1883 följer du dessa steg.
I Azure Portal går du till din IoT Operations-instans.
Under Komponenter väljer du MQTT Broker.
Välj MQTT-koordinatorlyssnare för NodePort>Create. Du kan bara skapa en lyssnare per tjänsttyp. Om du redan har en lyssnare av samma tjänsttyp kan du lägga till fler portar i den befintliga lyssnaren.
Varning
Om du anger autentisering till Ingen och inte konfigurerar TLS inaktiveras autentisering och TLS endast i testsyfte.
Ange följande inställningar:
Inställning Värde Name aio-broker-loadbalancer
Servicenamn Lämna tomt eller använd aio-broker-loadbalancer
.Port 1883 Autentisering Välj mellan befintlig eller Ingen. Auktorisering Välj mellan befintlig eller Ingen. Protokoll Välj MQTT. Lägg till TLS-inställningar i lyssnaren genom att välja TLS>Lägg till på porten. Det här steget krävs inte om du inte behöver TLS för testning. Mer information finns i BrokerListener.
Välj Skapa för att skapa lyssnaren.
Välj Skapa för att skapa lyssnaren.
Hämta den externa IP-adressen för mäklarens tjänst:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Om utdata ser ut ungefär som i följande exempel:
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
Sedan tilldelades en extern IP-adress till lastbalanserarens tjänst. Du kan använda den externa IP-adressen och porten för att ansluta till asynkron meddelandekö. Om du till exempel vill publicera ett meddelande till asynkron meddelandekö:
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Om den externa IP-adressen inte har tilldelats kan du behöva använda portvidarebefordring eller en virtuell växel för att få åtkomst till asynkron meddelandekö.
Använda portvidarebefordring
Med minikube-, typ- och andra klusteremuleringssystem kanske en extern IP-adress inte tilldelas automatiskt. Tillståndet kan till exempel visas som Väntande.
Om du vill komma åt asynkron meddelandekö vidarebefordrar du mäklarlyssningsporten till värden.
# 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
Låt kommandot portvidarebefordring köras i terminalen.
Anslut till koordinatorn på värdporten med samma autentisering och TLS-konfiguration som exemplet utan portvidarebefordring.
Mer information om minikube finns i Använda portvidarebefordring för att komma åt program i ett kluster.
Portvidarebefordring på AKS Edge Essentials
För AKS Edge Essentials behöver du utföra några fler steg. Med AKS Edge Essentials räcker det kanske inte att hämta den externa IP-adressen för att ansluta till koordinatorn. Du kan behöva konfigurera portvidarebefordring och öppna porten i brandväggen för att tillåta trafik till koordinatortjänsten.
Hämta först den externa IP-adressen för koordinatorns lastbalanserares lyssnare:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
Utdata bör se ut ungefär som i följande exempel:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Konfigurera portvidarebefordring till
broker-loadbalancer
tjänsten på den externa IP-adressen192.168.0.4
och porten1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Öppna porten i brandväggen för att tillåta trafik till koordinatortjänsten:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Använd värdens offentliga IP-adress för att ansluta till MQTT-koordinatorn.
Mer information om portvidarebefordring finns i Exponera Kubernetes-tjänster för externa enheter.
Åtkomst via localhost
Vissa Kubernetes-distributioner kan exponera MQTT-koordinatorn för en port i värdsystemet (localhost
) som en del av klusterkonfigurationen. Använd den här metoden för att göra det enklare för klienter på samma värd att komma åt MQTT-koordinatorn.
Om du till exempel vill skapa ett k3d-kluster som mappar MQTT-brokerns standard MQTT-port 1883 till localhost:1883
:
k3d cluster create --port '1883:1883@loadbalancer'
Eller för att uppdatera ett befintligt kluster:
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
localhost
Använd sedan och porten för att ansluta till asynkron meddelandekö. Om du till exempel vill publicera ett meddelande till asynkron meddelandekö:
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Inaktivera endast TLS och autentisering för testning
Anledningen till att MQTT-koordinatorn använder TLS- och tjänstkontons autentisering som standard är att tillhandahålla en säker som standardupplevelse som minimerar oavsiktlig exponering av din IoT-lösning för angripare. Du bör inte inaktivera TLS och autentisering i produktion. Att exponera MQTT-koordinatorn för Internet utan autentisering och TLS kan leda till obehörig åtkomst och till och med distribuerade överbelastningsattacker.
Varning
Om du förstår riskerna och behöver använda en osäker port i en välkontrollerad miljö kan du inaktivera TLS och autentisering i testsyfte genom att ta bort tls
inställningarna och authenticationRef
från lyssnarkonfigurationen.
I Azure Portal går du till din IoT Operations-instans.
Under Komponenter väljer du MQTT Broker.
Välj MQTT-koordinatorlyssnare för NodePort eller MQTT-koordinatorlyssnare för LoadBalancer>Create. Du kan bara skapa en lyssnare per tjänsttyp. Om du redan har en lyssnare av samma tjänsttyp kan du lägga till fler portar i den befintliga lyssnaren.
Varning
Om du anger autentisering till Ingen och inte konfigurerar TLS inaktiveras autentisering och TLS endast i testsyfte.
Ange följande inställningar:
Inställning Värde Name Ange ett namn för lyssnaren. Servicenamn Ange ett tjänstnamn. Port Ange ett portnummer. Autentisering Välj Ingen. Auktorisering Välj Ingen. Protokoll Välj MQTT. Nodport Ange ett tal mellan 30000 och 32767 om du använder nodporten. Välj Skapa för att skapa lyssnaren.