Udostępnij za pośrednictwem


Testowanie łączności z brokerem MQTT przy użyciu klientów MQTT

Ważne

Ta strona zawiera instrukcje dotyczące zarządzania składnikami operacji usługi Azure IoT przy użyciu manifestów wdrażania platformy Kubernetes, które są w wersji zapoznawczej. Ta funkcja jest udostępniana z kilkoma ograniczeniami i nie powinna być używana w przypadku obciążeń produkcyjnych.

Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.

W tym artykule przedstawiono różne sposoby testowania łączności z brokerem MQTT przy użyciu klientów MQTT w środowisku nieprodukcyjnym.

Domyślnie broker MQTT:

  • Wdraża odbiornik z obsługą protokołu TLS na porcie 18883 z klasterIp jako typ usługi. ClusterIp oznacza, że broker jest dostępny tylko z poziomu klastra Kubernetes. Aby uzyskać dostęp do brokera spoza klastra, należy skonfigurować usługę typu LoadBalancer lub NodePort.

  • Akceptuje konta usługi Kubernetes na potrzeby uwierzytelniania połączeń z poziomu klastra. Aby nawiązać połączenie spoza klastra, należy skonfigurować inną metodę uwierzytelniania.

Uwaga

W przypadku scenariuszy produkcyjnych należy użyć uwierzytelniania za pomocą protokołu TLS i kont usług w celu zabezpieczenia rozwiązania IoT. Aby uzyskać więcej informacji, zobacz:

Przed rozpoczęciem zainstaluj lub skonfiguruj operacje IoT. Użyj następujących opcji, aby przetestować łączność z brokerem MQTT za pomocą klientów MQTT w środowisku nieprodukcyjnym.

Nawiązywanie połączenia z odbiornikiem domyślnym w klastrze

Pierwszą opcją jest nawiązanie połączenia z poziomu klastra. Ta opcja używa konfiguracji domyślnej i nie wymaga dodatkowych aktualizacji. W poniższych przykładach pokazano, jak nawiązać połączenie z poziomu klastra przy użyciu zwykłego systemu Alpine Linux i powszechnie używanego klienta MQTT przy użyciu konta usługi i domyślnego certyfikatu głównego urzędu certyfikacji.

Najpierw utwórz plik o nazwie client.yaml z następującą konfiguracją:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: mqtt-client
  namespace: azure-iot-operations
---
apiVersion: v1
kind: Pod
metadata:
  name: mqtt-client
  # Namespace must match MQTT broker BrokerListener's namespace
  # Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
  namespace: azure-iot-operations
spec:
  # Use the "mqtt-client" service account created from above
  # Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
  serviceAccountName: mqtt-client
  containers:
    # Mosquitto and mqttui on Alpine
  - image: alpine
    name: mqtt-client
    command: ["sh", "-c"]
    args: ["apk add mosquitto-clients mqttui && sleep infinity"]
    volumeMounts:
    - name: broker-sat
      mountPath: /var/run/secrets/tokens
    - name: trust-bundle
      mountPath: /var/run/certs
  volumes:
  - name: broker-sat
    projected:
      sources:
      - serviceAccountToken:
          path: broker-sat
          audience: aio-internal # Must match audience in BrokerAuthentication
          expirationSeconds: 86400
  - name: trust-bundle
    configMap:
      name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert

Następnie użyj polecenia kubectl , aby wdrożyć konfigurację. Uruchomienie powinno potrwać tylko kilka sekund.

kubectl apply -f client.yaml

Po uruchomieniu zasobnika użyj polecenia kubectl exec , aby uruchomić polecenia wewnątrz zasobnika.

Aby na przykład opublikować komunikat w brokerze, otwórz powłokę wewnątrz zasobnika:

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

W powłoce zasobnika uruchom następujące polecenie, aby opublikować komunikat w brokerze:

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)

Dane wyjściowe powinny wyglądać mniej więcej tak:

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

Klient mosquitto używa tokenu konta usługi zainstalowanego na stronie /var/run/secrets/tokens/broker-sat do uwierzytelniania za pomocą brokera. Token jest ważny przez 24 godziny. Klient używa również domyślnego certyfikatu głównego urzędu certyfikacji zainstalowanego pod adresem , /var/run/certs/ca.crt aby zweryfikować łańcuch certyfikatów TLS brokera.

Napiwek

Możesz użyć kubectl polecenia , aby pobrać domyślny certyfikat głównego urzędu certyfikacji do użycia z innymi klientami. Aby na przykład pobrać domyślny certyfikat głównego urzędu certyfikacji do pliku o nazwie ca.crt:

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

Aby zasubskrybować temat, uruchom następujące polecenie:

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)

Dane wyjściowe powinny wyglądać mniej więcej tak:

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

Klient mosquitto używa tego samego tokenu konta usługi i certyfikatu głównego urzędu certyfikacji do uwierzytelniania za pomocą brokera i subskrybowania tematu.

Aby usunąć zasobnik, uruchom polecenie kubectl delete pod mqtt-client -n azure-iot-operations.

Łączenie klientów spoza klastra

Ponieważ domyślny odbiornik brokera jest ustawiony na typ usługi ClusterIp, nie można nawiązać bezpośredniego połączenia z brokerem spoza klastra. Aby zapobiec niezamierzonym przerwom w komunikacji między wewnętrznymi składnikami operacji usługi Azure IoT, zalecamy zachowanie domyślnego odbiornika niezmodyfikowanego i dedykowanego do komunikacji wewnętrznej AIO. Chociaż istnieje możliwość utworzenia oddzielnej usługi Kubernetes LoadBalancer w celu uwidocznienia usługi adresów IP klastra, lepiej jest utworzyć oddzielny odbiornik z różnymi ustawieniami, takimi jak bardziej typowy port MQTT 1883 i 8883, aby uniknąć nieporozumień i potencjalnych zagrożeń bezpieczeństwa.

Port węzła

Najprostszym sposobem testowania łączności jest użycie typu usługi NodePort w odbiorniku. Dzięki niemu można nawiązać połączenie <nodeExternalIP>:<NodePort> , tak jak w dokumentacji platformy Kubernetes.

Aby na przykład utworzyć nowy odbiornik brokera z typem usługi portów węzła, nazwą aio-broker-nodeportusługi i nasłuchiwaniem na porcie 1884 (port węzła 31884):

  1. W witrynie Azure Portal przejdź do wystąpienia operacji IoT.

  2. W obszarze Składniki wybierz pozycję Broker MQTT.

  3. Wybierz pozycję Odbiornik brokera MQTT dla pozycji NodePort>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.

    Uwaga

    Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.

    Wprowadź następujące ustawienia:

    Ustawienie Wartość
    Nazwisko aio-broker-nodeport
    Service name Pozostaw puste lub aio-broker-nodeport
    Port 1884
    Uwierzytelnianie Wybierz jedną z istniejących lub braków
    Autoryzacja Wybierz jedną z istniejących lub braków
    Protokół Wybierz MQTT
    Port węzła 31884
  4. Dodaj ustawienia protokołu TLS do odbiornika, wybierając pozycję Dodaj tls>na porcie. Ten krok nie jest wymagany, jeśli nie potrzebujesz protokołu TLS do testowania. Aby uzyskać więcej informacji, zobacz BrokerListener.

  5. Wybierz pozycję Utwórz , aby utworzyć odbiornik.

Uwaga

Domyślnie na platformie Kubernetes numer portu węzła musi należeć do zakresu 30000–32767.

Pobierz zewnętrzny adres IP węzła:

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

Dane wyjściowe powinny wyglądać mniej więcej tak:

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

Użyj zewnętrznego adresu IP i portu węzła, aby nawiązać połączenie z brokerem. Aby na przykład opublikować komunikat w brokerze:

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

Jeśli w danych wyjściowych nie ma zewnętrznego adresu IP, może być używana konfiguracja platformy Kubernetes, która domyślnie nie uwidacznia zewnętrznego adresu IP węzła, na przykład wiele konfiguracji k3s, k3d lub minikube. W takim przypadku możesz uzyskać dostęp do brokera za pomocą wewnętrznego adresu IP wraz z portem węzła z maszyn w tej samej sieci. Aby na przykład uzyskać wewnętrzny adres IP węzła:

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

Dane wyjściowe powinny wyglądać mniej więcej tak:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Następnie użyj wewnętrznego adresu IP i portu węzła, aby nawiązać połączenie z brokerem z maszyny w tym samym klastrze. Jeśli platforma Kubernetes jest uruchomiona na komputerze lokalnym, podobnie jak w przypadku k3 z jednym węzłem, często można użyć localhost zamiast wewnętrznego adresu IP. Jeśli platforma Kubernetes jest uruchomiona w kontenerze platformy Docker, na przykład k3d, wewnętrzny adres IP odpowiada adresowi IP kontenera i powinien być dostępny z maszyny hosta.

Moduł równoważenia obciążenia

Innym sposobem uwidocznienia brokera w Internecie jest użycie typu usługi LoadBalancer . Ta metoda jest bardziej złożona i może wymagać dodatkowej konfiguracji, takiej jak konfigurowanie przekazywania portów.

Aby na przykład utworzyć nowy odbiornik brokera z typem usługi równoważenia obciążenia, nazwą aio-broker-loadbalancerusługi i nasłuchiwaniem na porcie 1883:

  1. W witrynie Azure Portal przejdź do wystąpienia operacji IoT.

  2. W obszarze Składniki wybierz pozycję Broker MQTT.

  3. Wybierz pozycję Odbiornik brokera MQTT dla pozycji NodePort>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.

    Uwaga

    Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.

    Wprowadź następujące ustawienia:

    Ustawienie Wartość
    Nazwisko aio-broker-loadbalancer
    Service name Pozostaw puste lub aio-broker-loadbalancer
    Port 1883
    Uwierzytelnianie Wybierz jedną z istniejących lub braków
    Autoryzacja Wybierz jedną z istniejących lub braków
    Protokół Wybierz MQTT
  4. Dodaj ustawienia protokołu TLS do odbiornika, wybierając pozycję Dodaj tls>na porcie. Ten krok nie jest wymagany, jeśli nie potrzebujesz protokołu TLS do testowania. Aby uzyskać więcej informacji, zobacz BrokerListener.

  5. Wybierz pozycję Utwórz , aby utworzyć odbiornik.

  6. Wybierz pozycję Utwórz , aby utworzyć odbiornik.

Pobierz zewnętrzny adres IP dla usługi brokera:

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

Jeśli dane wyjściowe wyglądają podobnie do następujących:

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

Oznacza to, że zewnętrzny adres IP został przypisany do usługi modułu równoważenia obciążenia i można użyć zewnętrznego adresu IP i portu w celu nawiązania połączenia z brokerem. Aby na przykład opublikować komunikat w brokerze:

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

Jeśli zewnętrzny adres IP nie jest przypisany, może być konieczne użycie przekazywania portów lub przełącznika wirtualnego w celu uzyskania dostępu do brokera.

Używanie przekierowania portów

W przypadku minikube, rodzaju i innych systemów emulacji klastra zewnętrzny adres IP może nie zostać automatycznie przypisany. Na przykład może być wyświetlany jako Stan oczekujący .

  1. Aby uzyskać dostęp do brokera, przekaż port odbiornika brokera do hosta.

    # 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. Pozostaw polecenie przekierowywania portów uruchomione w terminalu.

  3. Połącz się z brokerem na porcie hosta przy użyciu tej samej konfiguracji uwierzytelniania i protokołu TLS, co przykład bez przekazywania portów.

Aby uzyskać więcej informacji na temat minikube, zobacz Use Port Forwarding to Access Applications in a Cluster (Używanie przekazywania portów do uzyskiwania dostępu do aplikacji w klastrze)

Przekazywanie portów w usłudze AKS Edge Essentials

W przypadku usługi Azure Kubernetes Services Edge Essentials należy wykonać kilka dodatkowych kroków. W usłudze AKS Edge Essentials uzyskanie zewnętrznego adresu IP może nie wystarczyć do nawiązania połączenia z brokerem. Może być konieczne skonfigurowanie przekierowania portów i otwarcie portu w zaporze w celu zezwolenia na ruch do usługi brokera.

  1. Najpierw uzyskaj zewnętrzny adres IP odbiornika modułu równoważenia obciążenia brokera:

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

    Dane wyjściowe powinny wyglądać podobnie do następujących:

    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. Skonfiguruj przekazywanie portów do broker-loadbalancer usługi na zewnętrznym adresie 192.168.0.4 IP i porcie 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Otwórz port zapory, aby zezwolić na ruch do usługi brokera:

    New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. Użyj publicznego adresu IP hosta, aby nawiązać połączenie z brokerem MQTT.

Aby uzyskać więcej informacji na temat przekierowywania portów, zobacz Uwidacznianie usług Kubernetes na urządzeniach zewnętrznych.

Dostęp za pośrednictwem hosta lokalnego

Niektóre dystrybucje platformy Kubernetes mogą uwidaczniać brokera MQTT na porcie w systemie hosta (localhost) w ramach konfiguracji klastra. Użyj tego podejścia, aby ułatwić klientom na tym samym hoście dostęp do brokera MQTT.

Aby na przykład utworzyć klaster K3d z mapowaniem domyślnego portu MQTT brokera MQTT 1883 na localhost:1883:

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

Lub zaktualizować istniejący klaster:

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

Następnie użyj polecenia localhost i port, aby nawiązać połączenie z brokerem. Aby na przykład opublikować komunikat w brokerze:

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

Wyłącz tylko protokół TLS i uwierzytelnianie na potrzeby testowania

Powodem, dla którego broker MQTT domyślnie używa uwierzytelniania tls i kont usług, jest zapewnienie bezpiecznego domyślnie środowiska, które minimalizuje przypadkowe narażenie rozwiązania IoT na osoby atakujące. Nie należy wyłączać protokołu TLS i uwierzytelniania w środowisku produkcyjnym. Uwidacznianie brokera MQTT w Internecie bez uwierzytelniania i tls może prowadzić do nieautoryzowanego dostępu, a nawet ataków DDOS.

Ostrzeżenie

Jeśli rozumiesz czynniki ryzyka i musisz użyć niezabezpieczonego portu w dobrze kontrolowanym środowisku, możesz wyłączyć protokół TLS i uwierzytelnianie na potrzeby testowania, usuwając tls ustawienia i z authenticationRef konfiguracji odbiornika.

  1. W witrynie Azure Portal przejdź do wystąpienia operacji IoT.

  2. W obszarze Składniki wybierz pozycję Broker MQTT.

  3. Wybierz odbiornik brokera MQTT dla węzłaPort lub odbiornika brokera MQTT dla modułu LoadBalancer>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.

    Uwaga

    Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.

    Wprowadź następujące ustawienia:

    Ustawienie Wartość
    Nazwisko Wprowadź nazwę odbiornika
    Service name Wprowadź nazwę usługi
    Port Wprowadź numer portu
    Uwierzytelnianie Wybierz pozycję Brak
    Autoryzacja Wybierz pozycję Brak
    Protokół Wybierz MQTT
    Port węzła Wprowadź liczbę z zakresu od 30000 do 32767, jeśli używasz portu węzła
  4. Wybierz pozycję Utwórz , aby utworzyć odbiornik.