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:
- Konfigurowanie protokołu TLS z automatycznym zarządzaniem certyfikatami w celu zabezpieczenia komunikacji MQTT w brokerze MQTT
- Konfigurowanie uwierzytelniania w brokerze MQTT
- Uwidacznianie usług Kubernetes na urządzeniach zewnętrznych przy użyciu przekazywania portów lub przełącznika wirtualnego za pomocą usługi Azure Kubernetes Services Edge Essentials.
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-nodeport
usługi i nasłuchiwaniem na porcie 1884 (port węzła 31884):
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
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 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.
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-loadbalancer
usługi i nasłuchiwaniem na porcie 1883:
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
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 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.
Wybierz pozycję Utwórz , aby utworzyć odbiornik.
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 .
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
Pozostaw polecenie przekierowywania portów uruchomione w terminalu.
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.
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
Skonfiguruj przekazywanie portów do
broker-loadbalancer
usługi na zewnętrznym adresie192.168.0.4
IP i porcie1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
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
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.
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
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 Wybierz pozycję Utwórz , aby utworzyć odbiornik.