Tutoriel : Créer une application pilotée par les événements avec Dapr et MQTT broker
Dans cette procédure pas à pas, vous déployez une application Dapr sur le cluster. L’application Dapr consomme des données MQTT simulées publiées sur MQTT broker, applique une fonction de fenêtrage, puis publie le résultat sur MQTT broker. La sortie publiée représente la façon dont les gros volumes de données peuvent être agrégés sur la périphérie pour réduire la fréquence et la taille des messages. L’application Dapr est sans état et utilise le magasin d’états de MQTT broker pour mettre en cache les valeurs antérieures nécessaires pour les calculs de fenêtre.
L'application Dapr effectue les étapes suivantes :
- S’abonne à la rubrique
sensor/data
pour les données de capteur. - Quand des données sont reçues sur la rubrique, elles sont publiées au magasin d’états de MQTT broker.
- Toutes les 10 secondes, il extrait les données du magasin d’états et calcule les valeurs minimale, maximale, moyenne, médiane et 75e centile sur les données de capteur horodatées au cours des 30 dernières secondes.
- Les données antérieures à ces 30 secondes sont expirées dans le magasin d’états.
- Le résultat est publié dans la rubrique
sensor/window_data
au format JSON.
Remarque
Ce tutoriel désactive Dapr CloudEvents, ce qui lui permet de publier et de s’abonner avec le protocole MQTT brut.
Prérequis
- Opérations Azure IoT installé – Démarrage rapide : Exécuter Opérations Azure IoT dans GitHub Codespaces avec K3s
- Composants Dapr de MQTT broker installés – Installer des composants Dapr de MQTT broker
Déployer l’application Dapr
À ce stade, vous pouvez déployer l’application Dapr. L’inscription des composants ne déploie pas le binaire associé empaqueté dans un conteneur. Pour déployer le binaire avec votre application, vous pouvez utiliser un déploiement pour regrouper l’application Dapr conteneurisée et les deux composants ensemble.
Pour commencer, créez un fichier yaml qui utilise les définitions suivantes :
Composant | Description |
---|---|
volumes.mqtt-client-token |
Le SAT utilisé pour authentifier les composants Dapr enfichables avec MQTT broker et le magasin d’états |
volumes.aio-internal-ca-cert-chain |
Chaîne d’approbation pour valider le certificat TLS du MQTT broker |
containers.mq-event-driven |
Conteneur d’application Dapr prédéfini. |
Enregistrez le yaml de déploiement suivant dans un fichier nommé
app.yaml
:apiVersion: v1 kind: ServiceAccount metadata: name: dapr-client namespace: azure-iot-operations annotations: aio-broker-auth/group: dapr-workload --- apiVersion: apps/v1 kind: Deployment metadata: name: mq-event-driven-dapr namespace: azure-iot-operations spec: selector: matchLabels: app: mq-event-driven-dapr template: metadata: labels: app: mq-event-driven-dapr annotations: dapr.io/enabled: "true" dapr.io/inject-pluggable-components: "true" dapr.io/app-id: "mq-event-driven-dapr" dapr.io/app-port: "6001" dapr.io/app-protocol: "grpc" spec: serviceAccountName: dapr-client volumes: # SAT token used to authenticate between Dapr and the MQTT broker - name: mqtt-client-token projected: sources: - serviceAccountToken: path: mqtt-client-token audience: aio-internal expirationSeconds: 86400 # Certificate chain for Dapr to validate the MQTT broker - name: aio-ca-trust-bundle configMap: name: azure-iot-operations-aio-ca-trust-bundle containers: - name: mq-event-driven-dapr image: ghcr.io/azure-samples/explore-iot-operations/mq-event-driven-dapr:latest
Déployez l’application en exécutant la commande suivante :
kubectl apply -f app.yaml
Vérifiez que l’application a été déployée avec succès. Le pod doit signaler que tous les conteneurs sont prêts après un court intervalle, comme indiqué avec la commande suivante :
kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
Avec la sortie suivante :
NAME READY STATUS RESTARTS AGE mq-event-driven-dapr 3/3 Running 0 30s
Déployer le simulateur
Simuler des données de test en déployant une charge de travail Kubernetes. Il simule un capteur en envoyant périodiquement des échantillons de lectures de température, de vibration et de pression au MQTT broker en utilisant un client MQTT sur la rubrique sensor/data
.
Déployer le simulateur à partir du référentiel Explorer Opérations IoT :
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml
Vérifiez que le simulateur s’exécute correctement :
kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
Avec la sortie suivante :
Get:1 http://deb.debian.org/debian stable InRelease [151 kB] Get:2 http://deb.debian.org/debian stable-updates InRelease [52.1 kB] Get:3 http://deb.debian.org/debian-security stable-security InRelease [48.0 kB] Get:4 http://deb.debian.org/debian stable/main amd64 Packages [8780 kB] Get:5 http://deb.debian.org/debian stable-updates/main amd64 Packages [6668 B] Get:6 http://deb.debian.org/debian-security stable-security/main amd64 Packages [101 kB] Fetched 9139 kB in 3s (3570 kB/s) ... Messages published in the last 10 seconds: 10 Messages published in the last 10 seconds: 10 Messages published in the last 10 seconds: 10
Déployer un client MQTT
Pour vérifier que le pont MQTT fonctionne, déployez un client MQTT sur le cluster.
Dans un nouveau fichier nommé
client.yaml
, spécifiez le déploiement du client :apiVersion: v1 kind: ServiceAccount metadata: name: mqtt-client namespace: azure-iot-operations --- apiVersion: v1 kind: Pod metadata: name: mqtt-client namespace: azure-iot-operations spec: serviceAccountName: mqtt-client containers: - image: alpine name: mqtt-client command: ["sh", "-c"] args: ["apk add mosquitto-clients mqttui && sleep infinity"] volumeMounts: - name: mqtt-client-token mountPath: /var/run/secrets/tokens - name: aio-ca-trust-bundle mountPath: /var/run/certs/aio-internal-ca-cert/ volumes: - name: mqtt-client-token projected: sources: - serviceAccountToken: path: mqtt-client-token audience: aio-internal expirationSeconds: 86400 - name: aio-ca-trust-bundle configMap: name: azure-iot-operations-aio-ca-trust-bundle
Appliquez le fichier de déploiement avec kubectl :
kubectl apply -f client.yaml
Vérifiez la sortie :
pod/mqtt-client created
Vérifier la sortie de l’application Dapr
Ouvrez un interpréteur de commandes sur le pod client Mosquitto :
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Abonnez-vous à la rubrique
sensor/window_data
pour observer la sortie publiée depuis l’application Dapr :mosquitto_sub -L mqtt://aio-broker/sensor/window_data
Vérifiez que l’application génère un calcul des fenêtres glissantes pour les différents capteurs toutes les 10 secondes :
{ "timestamp": "2023-11-16T21:59:53.939690+00:00", "window_size": 30, "temperature": { "min": 553.024, "max": 598.907, "mean": 576.4647857142858, "median": 577.4905, "75_per": 585.96125, "count": 28 }, "pressure": { "min": 290.605, "max": 299.781, "mean": 295.521, "median": 295.648, "75_per": 297.64050000000003, "count": 28 }, "vibration": { "min": 0.00124192, "max": 0.00491257, "mean": 0.0031171810714285715, "median": 0.003199235, "75_per": 0.0038769150000000003, "count": 28 } }
Facultatif - Créer l’application Dapr
Ce tutoriel utilise un conteneur prédéfini de l’application Dapr. Si vous souhaitez modifier et générer le code vous-même, suivez ces étapes :
Prérequis
- Docker : pour la création du conteneur d’applications
- Registre de conteneurs : pour l’hébergement du conteneur d’applications
Créer l’application
Clonez le référentiel Explorer les opérations IoT :
git clone https://github.com/Azure-Samples/explore-iot-operations
Modification apportée au répertoire du tutoriel Dapr :
cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
Créez l’image Docker :
docker build docker build . -t mq-event-driven-dapr
Pour utiliser l’application dans votre cluster Kubernetes, vous devez envoyer (push) l’image à un registre de conteneurs tel qu’Azure Container Registry. Vous pouvez également envoyer (push) à un registre de conteneurs local tel que minikube ou Docker.
docker tag mq-event-driven-dapr <container-alias> docker push <container-alias>
Mettez à jour votre
app.yaml
pour extraire votre image nouvellement créée.
Dépannage
Si l’application ne démarre pas ou si vous voyez les conteneurs dans CrashLoopBackoff
, le journal de conteneur daprd
contient des informations utiles.
Exécutez la commande suivante pour afficher les journaux d’activité des pods :
kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd