Tutorial: Compilación de una aplicación controlada por eventos con Dapr y MQTT broker
En este tutorial, implementará una aplicación Dapr en el clúster. La aplicación Dapr consume datos MQTT simulados publicados en MQTT broker, aplica una función de ventana y, después, vuelve a publicar el resultado en MQTT broker. La salida publicada representa cómo se pueden agregar datos de gran volumen en el perímetro para reducir la frecuencia y el tamaño de los mensajes. La aplicación Dapr no tiene estado y usa el almacén de estados de MQTT broker para almacenar en caché los valores anteriores necesarios para los cálculos de ventana.
La aplicación de Dapr realiza estos pasos:
- Se suscribe al tema
sensor/data
para los datos del sensor. - Cuando los datos se reciben en el tema, se publican en el almacén de estados de MQTT broker.
- Cada 10 segundos, captura los datos del almacén de estado y calcula los valores de mínimo, máximo, media, mediana y percentil 75 en cualquier dato del sensor con marca de tiempo en los últimos 30 segundos.
- Los datos anteriores a 30 segundos expiran en el almacén de estado.
- El resultado se publica en el tema
sensor/window_data
en formato JSON.
Nota:
En este tutorial, se deshabilita CloudEvents de Dapr que le permite publicar y suscribirse mediante MQTT sin procesar.
Requisitos previos
- Operaciones de Azure IoT instaladas: Inicio rápido: Ejecución de operaciones de Azure IoT en GitHub Codespaces con K3s
- Componentes de Dapr de MQTT broker instalados: Instalación de componentes de Dapr de MQTT broker
Implementación de la aplicación de Dapr
En este momento, puede implementar la aplicación de Dapr. Registrar los componentes no implementa el binario asociado que se empaqueta en un contenedor. Para implementar el binario junto con la aplicación, puede usar una implementación para agrupar la aplicación de Dapr contenedorizada y los dos componentes juntos.
Para empezar, cree un archivo YAML que use las siguientes definiciones:
Componente | Descripción |
---|---|
volumes.mqtt-client-token |
El SAT usado para autenticar los componentes conectables de Dapr con el MQTT broker y el almacén de estado |
volumes.aio-internal-ca-cert-chain |
Cadena de confianza para validar el certificado TLS de MQTT broker. |
containers.mq-event-driven |
Contenedor de aplicaciones de Dapr precompilado. |
Guarde el siguiente archivo YAML de implementación en un archivo llamado
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
Implemente la aplicación mediante la ejecución del siguiente comando:
kubectl apply -f app.yaml
Compruebe que la aplicación se ha implementado correctamente. El pod debe notificar que todos los contenedores están listos después de un intervalo corto, como se muestra con el siguiente comando:
kubectl get pods -l app=mq-event-driven-dapr -n azure-iot-operations
Con la siguiente salida:
NAME READY STATUS RESTARTS AGE mq-event-driven-dapr 3/3 Running 0 30s
Implementación del simulador
Simule datos de prueba mediante la implementación de una carga de trabajo de Kubernetes. Simula un sensor mediante el envío de lecturas de temperatura, vibración y presión de muestra periódicamente al MQTT broker mediante un cliente MQTT en el tema sensor/data
.
Implemente el simulador desde el repositorio Explorar operaciones de IoT:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/tutorials/mq-event-driven-dapr/simulate-data.yaml
Confirme que el simulador se está ejecutando correctamente:
kubectl logs deployment/mqtt-publisher-deployment -n azure-iot-operations -f
Con la siguiente salida:
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
Implementación de un cliente MQTT
Para comprobar que el puente MQTT funciona, implemente un cliente MQTT en el clúster.
En un nuevo archivo llamado
client.yaml
, especifique la implementación del cliente: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
Aplique el archivo de implementación con kubectl:
kubectl apply -f client.yaml
Compruebe la salida:
pod/mqtt-client created
Comprobación de que la salida de la aplicación de Dapr
Abra un shell en el pod de cliente de Mosquitto:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Suscríbase al tema
sensor/window_data
para observar la salida de publicación de la aplicación de Dapr:mosquitto_sub -L mqtt://aio-broker/sensor/window_data
Compruebe que la aplicación genera un cálculo de ventanas deslizantes para los distintos sensores cada 10 segundos:
{ "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 } }
Opcional: Creación de la aplicación de Dapr
En este tutorial se usa un contenedor precompilado de la aplicación Dapr. Si quiere modificar y compilar el código personalmente, siga estos pasos:
Requisitos previos
- Docker para compilar el contenedor de aplicaciones
- Un registro de contenedor, para hospedar el contenedor de aplicaciones
Compilar la aplicación
Clone el repositorio Explorar operaciones de IoT:
git clone https://github.com/Azure-Samples/explore-iot-operations
Cambie al directorio del tutorial de Dapr:
cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
Compile la imagen de Docker:
docker build docker build . -t mq-event-driven-dapr
Para consumir la aplicación en el clúster de Kubernetes, debe insertar la imagen en un registro de contenedor, como Azure Container Registry. También puede insertarla en un registro de contenedor local, como minikube o Docker.
docker tag mq-event-driven-dapr <container-alias> docker push <container-alias>
Actualice
app.yaml
para extraer la imagen recién creada.
Solución de problemas
Si la aplicación no se inicia o ve los contenedores en CrashLoopBackoff
, el registro de contenedor de daprd
suele contener información útil.
Ejecute el comando siguiente para ver los registros del componente daprd:
kubectl logs -l app=mq-event-driven-dapr -n azure-iot-operations -c daprd