Dela via


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 typen LoadBalancer eller NodePort.
  • 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:

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-nodeportoch lyssnar på port 1884 (nodport 31884) följer du dessa steg.

  1. I Azure Portal går du till din IoT Operations-instans.

  2. Under Komponenter väljer du MQTT Broker.

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

  5. 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-loadbalanceroch lyssna på port 1883 följer du dessa steg.

  1. I Azure Portal går du till din IoT Operations-instans.

  2. Under Komponenter väljer du MQTT Broker.

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

  5. Välj Skapa för att skapa lyssnaren.

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

  1. 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
    
  2. Låt kommandot portvidarebefordring köras i terminalen.

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

  1. 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
    
  2. Konfigurera portvidarebefordring till broker-loadbalancer tjänsten på den externa IP-adressen 192.168.0.4 och porten 1883:

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

  1. I Azure Portal går du till din IoT Operations-instans.

  2. Under Komponenter väljer du MQTT Broker.

  3. 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.
  4. Välj Skapa för att skapa lyssnaren.