Partager via


Tester la connectivité à l’Agent MQTT avec des clients MQTT

Important

Cette page inclut des instructions pour la gestion des composants Azure IoT Operations à l’aide des manifestes de déploiement Kubernetes, qui sont en version préliminaire. Cette fonctionnalité est fournie avec plusieurs limitations et ne doit pas être utilisée pour les charges de travail de production.

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 présente différentes manières de tester la connectivité à un courtier MQTT avec des clients MQTT dans un environnement hors production.

Par défaut, un courtier MQTT :

Attention

Pour les scénarios de production, utilisez TLS et l’authentification des comptes de service pour sécuriser votre solution IoT. Pour plus d’informations, consultez l’article suivant :

Avant de commencer, installez ou configurez Azure IoT Operations. Utilisez les options suivantes pour tester la connectivité au courtier MQTT avec les clients MQTT dans un environnement hors 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 simple et un client MQTT couramment utilisé en utilisant le compte de service et le certificat d'autorité de certification (CA) racine par défaut.

Téléchargez le déploiement mqtt-client.yaml à partir du référentiel d’exemples GitHub.

Important

N’utilisez pas le client MQTT en production. Le client ne doit être utilisé qu’à des fins de test.

wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml

Appliquez le fichier de déploiement avec kubectl :

kubectl apply -f mqtt-client.yaml
pod/mqtt-client created

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)

La sortie doit être semblable à l’exemple suivant :

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 courtier. Le jeton est valide pendant 24 heures. Le client utilise également le certificat CA racine par défaut monté /var/run/certs/ca.crt pour vérifier la chaîne de certificats TLS du courtier.

Conseil

Vous pouvez utiliser kubectl pour télécharger le certificat CA racine par défaut à 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)

La sortie doit être semblable à l’exemple suivant :

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 même certificat d’autorité de certification racine pour s’authentifier auprès du courtier 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 du courtier par défaut est défini sur le type de service ClusterIp, vous ne pouvez pas vous connecter directement au courtier depuis l'extérieur du cluster. Pour éviter toute interruption involontaire de la communication entre les composants internes d'IoT Operations, nous vous recommandons de conserver l'écouteur par défaut inchangé et dédié à la communication interne d'IoT Operations. Bien qu'il soit possible de créer un service Kubernetes LoadBalancer distinct pour exposer le service IP du cluster, il est préférable de créer un écouteur distinct avec des paramètres différents, comme les ports MQTT plus courants 1883 et 8883, pour éviter toute confusion et tout risque de sécurité potentiel.

Port de nœud

Le moyen le plus simple de tester la connectivité est d’utiliser le type de service NodePort dans l’écouteur. Avec cette méthode, vous pouvez utiliser <nodeExternalIP>:<NodePort> pour vous connecter comme indiqué dans la documentation Kubernetes.

Par exemple, pour créer un nouvel écouteur de courtier avec le type de service NodePort, le nom de service aio-broker-nodeport et l'écoute sur le port 1884 (port de nœud 31884), procédez comme suit.

  1. Dans le Portail Azure, accédez à votre instance Opérations IoT.

  2. Sous Composants, sélectionnez Agent MQTT.

  3. 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 aio-broker-nodeport
    Nom du service Laissez vide ou utilisez aio-broker-nodeport.
    Port 1884
    Authentification Choisissez entre existant ou Aucun.
    Autorisation Choisissez entre existant ou Aucun.
    Protocol Choisissez MQTT.
    Port de nœud 31884
  4. Ajoutez des paramètres TLS à l’écouteur en sélectionnant TLS>Ajouter sur le port. Cette étape n’est pas nécessaire si vous n’avez pas besoin de TLS pour les tests. Pour plus d’informations, consultez BrokerListener.

  5. Sélectionnez Créer pour créer l’écouteur.

Remarque

Par défaut de Kubernetes, le numéro de port du nœud doit être compris entre 30 000 et 32 767.

Obtenez l’adresse IP externe du nœud :

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

La sortie doit être semblable à l’exemple suivant :

    - 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 31884 --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

La sortie doit être semblable à l’exemple suivant :

    - 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

Une autre façon d’exposer le courtier à Internet est d’utiliser le type de service LoadBalancer. Cette méthode est plus complexe et peut nécessiter davantage de configuration, comme la configuration de la redirection de port.

Par exemple, pour créer un nouvel écouteur de courtier avec le type de service LoadBalancer, le nom de service aio-broker-loadbalancer et l'écoute sur le port 1883, procédez comme suit.

  1. Dans le Portail Azure, accédez à votre instance Opérations IoT.

  2. Sous Composants, sélectionnez Agent MQTT.

  3. 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 aio-broker-loadbalancer
    Nom du service Laissez vide ou utilisez aio-broker-loadbalancer.
    Port 1883
    Authentification Choisissez entre existant ou Aucun.
    Autorisation Choisissez entre existant ou Aucun.
    Protocol Choisissez MQTT.
  4. Ajoutez des paramètres TLS à l’écouteur en sélectionnant TLS>Ajouter sur le port. Cette étape n’est pas nécessaire si vous n’avez pas besoin de TLS pour les tests. Pour plus d’informations, consultez BrokerListener.

  5. Sélectionnez Créer pour créer l’écouteur.

  6. 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 le résultat ressemble à l’exemple suivant :

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

Ensuite, une adresse IP externe a été attribuée au service d’équilibrage de charge. Vous pouvez utiliser l'adresse IP externe et le port pour vous connecter au courtier. 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 attribuée, vous devrez peut-être utiliser la redirection de port ou un commutateur virtuel pour accéder au courtier.

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, l’état peut s’afficher comme En attente.

  1. Pour accéder au broker, transférez le port d’écouteur du broker à l’hôte.

    # 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. Laissez la commande de transfert de port en cours d’exécution dans le terminal.

  3. Connectez-vous au broker au port hôte 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 la redirection de port pour accéder aux applications d'un cluster.

Transfert de port sur AKS Edge Essentials

Pour AKS 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.

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

    Le résultat devrait ressembler à l’exemple suivant :

    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. Configurez le transfert de port vers le service broker-loadbalancer sur l’adresse IP externe 192.168.0.4 et le port 1883 :

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. 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
    
  4. 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 le courtier MQTT à un port sur le système hôte (localhost) dans le cadre de la configuration du cluster. Utilisez cette approche pour faciliter l’accès des clients sur le même hôte au courtier MQTT.

Par exemple, pour créer un cluster k3d qui mappe le port MQTT par défaut 1883 du courtier 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

La raison pour laquelle le courtier MQTT utilise l’authentification TLS et les comptes de service par défaut est de fournir une expérience sécurisée par défaut qui minimise l’exposition accidentelle de votre solution IoT aux attaquants. Vous ne devez pas désactiver TLS et l’authentification en production. L’exposition du courtier MQTT à Internet sans authentification ni TLS peut conduire à un accès non autorisé et même à des attaques par déni de service distribué.

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.

  1. Dans le Portail Azure, accédez à votre instance Opérations IoT.

  2. Sous Composants, sélectionnez Agent MQTT.

  3. Sélectionnez Écouteur de l’Agent MQTT pour NodePort ou Écouteur de l’Agent MQTT pour LoadBalancer>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 Entrez un nom pour l'auditeur.
    Nom du service Entrez un nom de service.
    Port Entrez un numéro de port.
    Authentification Choisissez Aucun(e).
    Autorisation Choisissez Aucun(e).
    Protocol Choisissez MQTT.
    Port de nœud Entrez un nombre compris entre 30 000 et 32 767 si vous utilisez le port du nœud.
  4. Sélectionnez Créer pour créer l’écouteur.