Compartir vía


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:

  1. Se suscribe al tema sensor/data para los datos del sensor.
  2. Cuando los datos se reciben en el tema, se publican en el almacén de estados de MQTT broker.
  3. 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.
  4. Los datos anteriores a 30 segundos expiran en el almacén de estado.
  5. 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

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.
  1. 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
    
  2. Implemente la aplicación mediante la ejecución del siguiente comando:

    kubectl apply -f app.yaml
    
  3. 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.

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

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

  1. Abra un shell en el pod de cliente de Mosquitto:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  2. 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
    
  3. 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

  1. Docker para compilar el contenedor de aplicaciones
  2. Un registro de contenedor, para hospedar el contenedor de aplicaciones

Compilar la aplicación

  1. Clone el repositorio Explorar operaciones de IoT:

    git clone https://github.com/Azure-Samples/explore-iot-operations
    
  2. Cambie al directorio del tutorial de Dapr:

    cd explore-iot-operations/tutorials/mq-event-driven-dapr/src
    
  3. Compile la imagen de Docker:

    docker build docker build . -t mq-event-driven-dapr
    
  4. 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>
    
  5. 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

Pasos siguientes