Tester la connectivité à l’Agent MQTT avec des clients MQTT
Important
Opérations Azure IoT Préversion avec Azure Arc est actuellement en préversion. Vous ne devez pas utiliser ce logiciel en préversion dans des environnements de production.
Lorsqu’une version en disponibilité générale sera publiée, vous devrez déployer une nouvelle installation d’Opérations Azure IoT. Vous ne pourrez pas mettre à niveau une installation en préversion.
Pour connaître les conditions juridiques qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou plus généralement non encore en disponibilité générale, consultez l’Avenant aux conditions d’utilisation des préversions de Microsoft Azure.
Cet article montre différentes façons de tester la connectivité à l’Agent MQTT avec des clients MQTT hors environnement de production.
Par défaut, l’Agent MQTT :
Déploie un Écouteur compatible avec TLS sur le port 18883 avec ClusterIp comme type de service. ClusterIp signifie que le répartiteur est accessible uniquement à partir du cluster Kubernetes. Pour accéder au répartiteur à partir de l’extérieur du cluster, vous devez configurer un service de type LoadBalancer ou NodePort.
Accepte les comptes de service Kubernetes pour l’authentification pour les connexions à partir du cluster. Pour vous connecter à partir de l’extérieur du cluster, vous devez configurer une autre méthode d’authentification.
Attention
Pour les scénarios de production, vous devez utiliser le protocole TLS et l’authentification des comptes de service pour sécuriser votre solution IoT. Pour plus d’informations, consultez l’article suivant :
- Configurer TLS avec la gestion automatique des certificats pour sécuriser la communication MQTT dans l’Agent MQTT
- Configurer l’authentification dans l’Agent MQTT
- Exposer des services Kubernetes à des appareils externes à l’aide du transfert de port ou d’un commutateur virtuel avec Azure Kubernetes Services Edge Essentials.
Avant de commencer, installez ou configurez des opérations IoT. Utilisez les options suivantes pour tester la connectivité à l’Agent MQTT avec des clients MQTT hors environnement de production.
Se connecter à l’écouteur par défaut à l’intérieur du cluster
La première option consiste à se connecter à partir du cluster. Cette option utilise la configuration par défaut et ne nécessite aucune mise à jour supplémentaire. Les exemples suivants montrent comment se connecter à partir du cluster en utilisant Alpine Linux traditionnel et un client MQTT couramment utilisé, le compte de service et le certificat par défaut de l’autorité de certification racine.
Créez tout d’abord un fichier nommé client.yaml
avec la configuration suivante :
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
Utilisez ensuite kubectl
pour déployer la configuration. Le démarrage ne doit prendre que quelques secondes.
kubectl apply -f client.yaml
Une fois le pod en cours d’exécution, utilisez kubectl exec
pour exécuter des commandes à l’intérieur du pod.
Par exemple, pour publier un message sur le répartiteur, ouvrez un interpréteur de commandes à l’intérieur du pod :
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
Dans l’interpréteur de commandes du pod, exécutez la commande suivante pour publier un message sur le répartiteur :
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)
Le résultat doit être semblable à ce qui suit :
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Le client mosquitto utilise le jeton de compte de service monté sur /var/run/secrets/tokens/broker-sat
pour s’authentifier auprès du répartiteur. Le jeton est valide pendant 24 heures. Le client utilise également le certificat d’autorité de certification racine par défaut monté sur /var/run/certs/ca.crt
pour vérifier la chaîne de certificats TLS du répartiteur.
Conseil
Vous pouvez utiliser kubectl
pour télécharger le certificat par défaut de l’autorité de certification racine à utiliser avec d’autres clients. Par exemple, pour télécharger le certificat par défaut de l’autorité de certification racine dans un fichier nommé ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Pour vous abonner à la rubrique, exécutez la commande suivante :
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)
Le résultat doit être semblable à ce qui suit :
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
Le client mosquitto utilise le même jeton de compte de service et le certificat d’autorité de certification racine pour s’authentifier auprès du répartiteur et s’abonner à la rubrique.
Pour supprimer le pod, exécutez kubectl delete pod mqtt-client -n azure-iot-operations
.
Connecter des clients de l’extérieur du cluster
Étant donné que l’écouteur de broker par défaut est défini sur le type de service ClusterIp, vous ne pouvez pas vous connecter au broker de l’extérieur du cluster directement. Pour empêcher les interruptions involontaires des communications entre les composants Opérations Azure IoT (AIO) internes, nous recommandons de conserver l’écouteur par défaut non modifié et dédié pour les communications internes AIO. Bien qu’il soit possible de créer un service LoadBalancer Kubernetes distinct pour exposer le service d’IP du cluster, il est préférable de créer un écouteur distinct avec différents paramètres, comme les ports MQTT 1883 et 8883 plus courants, afin d’éviter la confusion et les risques de sécurité potentiels.
Port de nœud
Le moyen le plus simple de tester la connectivité est d’utiliser le type de service NodePort dans l’écouteur. Dans cet esprit, vous pouvez utiliser <nodeExternalIP>:<NodePort>
pour vous connecter comme dans la documentation Kubernetes.
Par exemple, créez un écouteur d’agent avec un type de service de port de nœud écoutant sur le port 1883 :
Dans le Portail Azure, accédez à votre instance Opérations IoT.
Sous Ressources Opérations Azure IoT, sélectionnez Agent MQTT.
Sélectionnez Écouteur de l’Agent MQTT pour NodePort>Créer. Vous ne pouvez créer qu’un seul écouteur par type de service. Si vous avez déjà un écouteur du même type de service, vous pouvez ajouter d’autres ports à l’écouteur existant.
Attention
La définition de l’authentification sur Aucun sans configurer TLS désactive l’authentification et TLS à des fins de test uniquement.
Entrez les paramètres suivants :
Paramètre Valeur Nom nodeport Nom du service agent-aio-nodeport Port 1883 Authentification Choisir Par défaut ou Aucun Autorisation Choose par défaut Protocol Choisir MQTT Port de nœud 31883 Ajoutez des paramètres TLS à l’écouteur en sélectionnant TLS sur le port.
Setting Description TLS Cliquez sur le bouton Ajouter. Mode TLS Choisissez Manuel ou Automatique. Nom de l'émetteur Nom de l’émetteur du gestionnaire de certificats. Obligatoire. Type d’émetteur Type de l’émetteur du gestionnaire de certificats. Obligatoire. Groupe d’émetteurs Groupe de l’émetteur du gestionnaire de certificats. Obligatoire. Algorithme de clé privée Algorithme de la clé privée. Stratégie de rotation de clé privée Stratégie de rotation de la clé privée. Noms DNS Autres noms de l’objet DNS pour le certificat. Adresses IP Adresses IP des autres noms de l’objet pour le certificat. Nom du secret Secret Kubernetes contenant un certificat client X.509. Durée Durée de vie totale du certificat de serveur TLS (par défaut : 90 jours). Renouveler avant Quand commencer le renouvellement du certificat. Sélectionnez Appliquer pour enregistrer les paramètres TLS.
Sélectionnez Créer pour créer l’écouteur.
Obtenez l’adresse IP externe du nœud :
kubectl get nodes -o yaml | grep ExternalIP -C 1
Le résultat doit être semblable à ce qui suit :
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Utilisez l’adresse IP externe et le port de nœud pour vous connecter au broker. Par exemple, pour publier un message sur le broker :
mosquitto_pub --host <EXTERNAL_IP> --port 31883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
S’il n’existe aucun IP externe dans la sortie, il est possible que vous utilisiez une configuration Kubernetes qui n’expose pas l’adresse IP externe du nœud par défaut, comme plusieurs configurations de k3s, k3d ou minikube. Dans ce cas, vous pouvez accéder au broker avec l’IP interne, ainsi que le port de nœud des machines sur le même réseau. Par exemple, pour obtenir l’adresse IP interne du nœud :
kubectl get nodes -o yaml | grep InternalIP -C 1
Le résultat doit être semblable à ce qui suit :
- address: 172.19.0.2
type: InternalIP
allocatable:
Utilisez ensuite l’adresse IP interne et le port de nœud pour vous connecter au broker dans une machine au sein du même cluster. Si Kubernetes s’exécute sur une machine locale, comme k3s à nœud unique, vous pouvez souvent utiliser localhost
à la place de l’adresse IP interne. Si Kubernetes s’exécute dans un conteneur Docker, comme k3d, l’adresse IP interne correspond à l’adresse IP du conteneur et doit être accessible à partir de la machine hôte.
Équilibreur de charge
Un autre moyen d’exposer le broker sur Internet consiste à utiliser le type de service LoadBalancer. Cette méthode est plus complexe et peut nécessiter une configuration supplémentaire, comme la configuration du réacheminement de port.
Par exemple, créez un écouteur d’agent avec un type de service d’équilibreur de charge écoutant sur le port 1883 :
Dans le Portail Azure, accédez à votre instance Opérations IoT.
Sous Ressources Opérations Azure IoT, sélectionnez Agent MQTT.
Sélectionnez Écouteur de l’Agent MQTT pour NodePort>Créer. Vous ne pouvez créer qu’un seul écouteur par type de service. Si vous avez déjà un écouteur du même type de service, vous pouvez ajouter d’autres ports à l’écouteur existant.
Attention
La définition de l’authentification sur Aucun sans configurer TLS désactive l’authentification et TLS à des fins de test uniquement.
Entrez les paramètres suivants :
Paramètre Valeur Nom loadbalancer Nom du service agent-aio-équilibreur-de-charge Port 1883 Authentification Choose par défaut Autorisation Choisir Par défaut ou Aucun Protocol Choisir MQTT Vous pouvez ajouter des paramètres TLS à l’écouteur en sélectionnant TLS sur le port.
Setting Description TLS Cliquez sur le bouton Ajouter. Mode TLS Choisissez Manuel ou Automatique. Nom de l'émetteur Nom de l’émetteur du gestionnaire de certificats. Obligatoire. Type d’émetteur Type de l’émetteur du gestionnaire de certificats. Obligatoire. Groupe d’émetteurs Groupe de l’émetteur du gestionnaire de certificats. Obligatoire. Algorithme de clé privée Algorithme de la clé privée. Stratégie de rotation de clé privée Stratégie de rotation de la clé privée. Noms DNS Autres noms de l’objet DNS pour le certificat. Adresses IP Adresses IP des autres noms de l’objet pour le certificat. Nom du secret Secret Kubernetes contenant un certificat client X.509. Durée Durée de vie totale du certificat de serveur TLS (par défaut : 90 jours). Renouveler avant Quand commencer le renouvellement du certificat. Sélectionnez Appliquer pour enregistrer les paramètres TLS.
Sélectionnez Créer pour créer l’écouteur.
Obtenez l’adresse IP externe pour le service de l’agent :
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Si la sortie ressemble à ce qui suit :
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
Cela signifie qu’une adresse IP externe a été affectée au service d’équilibreur de charge et que vous pouvez utiliser l’adresse IP externe et le port pour vous connecter au broker. Par exemple, pour publier un message sur le broker :
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Si l’adresse IP externe n’est pas affectée, il est possible que vous deviez utiliser le réacheminement de port ou un commutateur virtuel pour accéder au broker.
Utiliser le transfert de port
Avec minikube, kindet d’autres systèmes d’émulation de cluster, une adresse IP externe peut ne pas être automatiquement affectée. Par exemple, il peut s’afficher en tant qu’état en attente.
Pour accéder au broker, transférez le port d’écoute du broker 18883 à l’hôte.
kubectl port-forward --namespace azure-iot-operations service/aio-broker 18883:mqtts-18883
Utilisez 127.0.0.1 pour vous connecter au broker au port 18883 avec la même configuration d’authentification et TLS que l’exemple sans réacheminement de port.
Pour plus d’informations sur minikube, consultez Utiliser le transfert de port pour accéder aux applications dans un cluster
Transfert de port sur AKS Edge Essentials
Pour Azure Kubernetes Services Edge Essentials, vous devez effectuer quelques étapes supplémentaires. Avec AKS Edge Essentials, il est possible que l’obtention de l’adresse IP externe ne soit pas suffisante pour vous connecter au broker. Vous devrez peut-être configurer le réacheminement de port et ouvrir le port sur le pare-feu pour autoriser le trafic vers le service du broker.
Obtenez d’abord l’adresse IP externe de l’écouteur d’équilibreur de charge du broker :
kubectl get service broker-loadbalancer --namespace azure-iot-operations
La sortie doit ressembler à ce qui suit :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Configurez le transfert de port vers le service
broker-loadbalancer
sur l’adresse IP externe192.168.0.4
et le port1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Ouvrez le port sur le pare-feu pour autoriser le trafic vers le service de l’agent :
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Utilisez l’adresse IP publique de l’hôte pour vous connecter à l’agent MQTT.
Pour plus d’informations sur le transfert de port, consultez Exposer les services Kubernetes aux appareils externes.
Accès via localhost
Certaines distributions Kubernetes peuvent exposer l’Agent MQTT sur un port du système hôte (localhost) dans le cadre de la configuration de cluster. Utilisez cette approche parce qu’elle permet aux clients sur le même hôte d’accéder plus facilement à l’Agent MQTT.
Par exemple, pour créer un cluster K3d avec le mappage 1883 par défaut de l’Agent MQTT à localhost:1883
:
k3d cluster create --port '1883:1883@loadbalancer'
Ou pour mettre à jour un cluster existant :
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
Utilisez ensuite localhost
et le port pour vous connecter au broker. Par exemple, pour publier un message sur le broker :
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Désactiver uniquement le protocole TLS et l’authentification pour des tests
L’Agent MQTT utilise l’authentification TLS et les comptes de service par défaut parce qu’il fournit une expérience sécurisée par défaut qui réduit l’exposition accidentelle de votre solution IoT aux attaquants. Vous ne devez pas désactiver TLS et l’authentification en production. L’exposition de l’Agent MQTT à Internet sans authentification et TLS peut entraîner des accès non autorisés et même des attaques DDOS.
Avertissement
Si vous comprenez les risques et devez utiliser un port non sécurisé dans un environnement bien contrôlé, vous pouvez désactiver TLS et l’authentification à des fins de test en supprimant les paramètres tls
et authenticationRef
de la configuration de l’écouteur.
Dans le Portail Azure, accédez à votre instance Opérations IoT.
Sous Ressources Opérations Azure IoT, sélectionnez Agent MQTT.
Sélectionnez Écouteur de l’Agent MQTT pour NodePort>Créer. Vous ne pouvez créer qu’un seul écouteur par type de service. Si vous avez déjà un écouteur du même type de service, vous pouvez ajouter d’autres ports à l’écouteur existant.
Attention
La définition de l’authentification sur Aucun sans configurer TLS désactive l’authentification et TLS à des fins de test uniquement.
Entrez les paramètres suivants :
Paramètre Valeur Nom Entrer un nom pour l’écouteur Nom du service Entrer un nom de service Port 1883 Authentification Choisissez Aucun(e) Autorisation Choisissez Aucun(e) Protocol Choisir MQTT Port de nœud 31883 si vous utilisez un port de nœud Sélectionnez Créer pour créer l’écouteur.