Compartir a través de


Detección de servidores de OPC UA con Akri

Akri es una interfaz de recursos de Kubernetes que permite exponer fácilmente dispositivos hoja heterogéneos (como cámaras IP y dispositivos USB) como recursos en un clúster de Kubernetes. Akri detecta continuamente los nodos que tienen acceso a estos dispositivos para programar cargas de trabajo basadas en ellos. Akri es un proyecto de espacio aislado CNCF realizado para el borde, controlando la apariencia dinámica y la desaparición de los dispositivos hoja. Actualmente admite protocolos OPC UA, ONVIF y udev, pero también puede implementar controladores de protocolo personalizados proporcionados por la plantilla. Obtenga más información sobre Akri aquí.

En este artículo se describe cómo puede implementar contenedores de servidor OPC PLC de ejemplo en Azure y detectarlos mediante la implementación de Akri en el clúster de AKS Edge Essentials. OPC UA es un protocolo de comunicación para la automatización industrial. Es una tecnología cliente/servidor que viene con un marco de seguridad y comunicación. Si en algún momento de la demostración, quiere profundizar más en OPC UA o aclarar un término, consulte las especificaciones de OPC UA en línea.

Esta demostración le ayuda a empezar a usar Akri para detectar servidores OPC UA y usarlos a través de un agente que contiene un cliente de OPC UA. En concreto, se creó una configuración de Akri denominada Supervisión de OPC UA para este escenario. Esta configuración muestra cómo puede usar Akri para detectar valores de anomalía de una variable de OPC UA específica. Para ello, los clientes de OPC UA de los agentes se suscriben a esa variable y sirven su valor sobre gRPC para que consuma una aplicación web de detección de anomalías. Puede usar esta configuración para supervisar un barómetro, un detector de CO, etc. Sin embargo, en este ejemplo, la variable OPC UA representa los valores plc (controlador lógico programable) para la temperatura de un termostato. Cualquier valor fuera del intervalo de 70-80 grados es una anomalía. Además, si desea usar certificados para la seguridad, vaya a la sección al final.

Diagrama que muestra el flujo de la demostración de OPC UA de Akri.

Requisitos previos

  • Clúster de AKS Edge Essentials en funcionamiento.
  • Suscripción de Azure y un grupo de recursos en el que se van a implementar servidores OPC PLC.
  • Akri solo funciona en Linux: use nodos de Linux para este ejercicio.

Creación de servidores de OPC UA

Ahora, cree algunos servidores OPC UA PLC para detectar. En lugar de empezar desde cero, implemente contenedores de servidor de OPC PLC. Puede obtener más información sobre los contenedores y sus parámetros aquí. Esta demostración usa la plantilla proporcionada para implementar instancias de contenedor del servidor OPC PLC en Azure.

  1. Vaya al archivo Léame del ejemplo de OPC PLC de Azure IoT Edge y seleccione Implementar en Azure.

  2. Seleccione Editar plantilla y vaya a la línea 172. Reemplace toda la línea por el código siguiente para agregar las marcas necesarias para implementar los servidores OPC PLC deseados:

    "[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True --ut', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
    

    Puede obtener más información sobre los parámetros en el archivo Léame.

  3. Guarde la plantilla y rellene los detalles del proyecto y de la instancia. Para Number of Simulations, especifique 2 para ejecutar dos servidores OPC PLC.

  4. Seleccione Revisar y crear y, a continuación, Crear para implementar los servidores en Azure.

Ahora ha creado correctamente dos servidores OPC UA PLC, cada uno con un nodo PLC rápido, que genera un entero sin signo con límite inferior = 65 y límite superior = 85 a una velocidad de 1.

Ejecución de Akri

  1. Asegúrese de que los servidores de OPC UA se ejecutan comprobando para ver que las instancias de contenedor se han iniciado en la Azure Portal.

  2. Para que Akri detecte correctamente los servidores, especifique las direcciones URL de detección correctas al instalar Akri.

    Las direcciones URL de detección aparecen como opc.tcp://<FQDN>:50000/. Para obtener los FQDN de los servidores OPC PLC, vaya a las implementaciones en Azure y verá el FQDN. Copie y pegue el FQDN en las direcciones URL de detección de cada servidor.

    Captura de pantalla que muestra el FQDN de la instancia de contenedor en Azure Portal.

  3. Agregue los gráficos de Helm de Akri, si aún no lo ha hecho:

    helm repo add akri-helm-charts https://project-akri.github.io/akri/
    

    Si ya ha agregado el gráfico de Helm de Akri anteriormente, actualice el repositorio para la compilación más reciente:

    helm repo update
    
  4. Instale Akri mediante Helm. Al instalar Akri, especifique que desea implementar los controladores de detección de OPC UA estableciendo el valor opcua.discovery.enabled=truede Helm .

    En este escenario, especifique y IdentifierNamespaceIndex del NodeID que desea que los agentes supervisen. En este caso, esa es la variable de temperatura creada anteriormente, que tiene un Identifier de FastUInt1 y NamespaceIndex de 2.

    Asegúrese de reemplazar por opcua.configuration.discoveryDetails.discoveryUrls las direcciones URL que obtuvo en el paso anterior:

    helm install akri akri-helm-charts/akri `
       --set opcua.discovery.enabled=true `
       --set opcua.configuration.enabled=true `
       --set opcua.configuration.name=akri-opcua-monitoring `
       --set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" `
       --set opcua.configuration.brokerPod.image.tag="latest-dev" `
       --set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' `
       --set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' `
       --set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" `
       --set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
    

    Nota

    FastUInt1 es el identificador del nodo de cambio rápido proporcionado por el servidor OPC PLC.

    Obtenga más información sobre los valores de configuración de OPC UA aquí.

  5. Una vez instalado Akri, el agente de Akri detecta los dos servidores y crea una instancia para cada servidor. Observe la puesta en marcha de dos pods de agente, uno para cada servidor:

    kubectl get pods -o wide --watch
    

    También puede asegurarse de que el pod de supervisión de Akri se haya conectado correctamente al servidor OPC UA:

    kubectl logs <name of OPC UA monitoring pod>
    

    Para inspeccionar más de los elementos de Akri:

    • Ejecute kubectl get crdy debería ver los CRD enumerados.
    • Ejecute kubectl get akricy debería ver akri-opcua-monitoring.
    • Si se detectaron los servidores OPC PLC y los pods se activan, puede ver las instancias mediante la ejecución kubectl get akriide y puede inspeccionar aún más mediante la ejecución kubectl get akrii akri-opcua-monitoring-<ID> -o yamlde .

Implementación de una aplicación web de detección de anomalías como consumidor final de los agentes

Se creó una aplicación web de detección de anomalías de ejemplo para esta demostración de un extremo a otro. Tiene un código auxiliar de gRPC que llama a los servicios gRPC de los agentes, obteniendo el valor de temperatura más reciente. A continuación, determina si este valor es un valor atípico para el conjunto de datos mediante la estrategia factor atípico local. El conjunto de datos es simplemente un archivo CSV con los números entre 70 y 80 repetidos varias veces; por lo tanto, cualquier valor significativamente fuera de este intervalo se verá como un valor atípico. La aplicación web actúa como registro, mostrando todos los valores de temperatura y la dirección del servidor OPC UA que envió los valores. Muestra los valores de anomalía en rojo. Las anomalías siempre tienen un valor de 120 debido a cómo se configura la DoSimulation función en los servidores de OPC UA.

  1. Implemente la aplicación de detección de anomalías y watch un número de pods para la aplicación:

    kubectl apply -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
    
    kubectl get pods -o wide --watch
    
  2. Una vez que se ejecutan los pods, obtenga la dirección IP del nodo y el número de puerto de servicio de la aplicación:

    Get-AKSEdgeNodeAddr
    
    kubectl get svc
    
  3. Vaya a http://<NODE IP>:<SERVICE PORT NUM>/. El sitio tarda unos segundos en cargarse y, a continuación, debería ver un registro de los valores de temperatura, que se actualiza cada pocos segundos. Tenga en cuenta cómo proceden los valores de dos direcciones URL de detección diferentes, específicamente las de cada uno de los dos servidores de OPC UA.

    Captura de pantalla que muestra la aplicación de detección de anomalías en el explorador.

Opcional: certificados para el servidor OPC UA y el agente

Este procedimiento opcional se puede usar para probar Akri con certificados para mayor seguridad. Siga estos pasos para implementar servidores OPC PLC con seguridad y crear un secreto de Kubernetes que se pueda usar para autenticar el servidor y el agente.

Creación de servidores de OPC UA con seguridad

  1. Vaya al archivo Léame del ejemplo de OPC PLC de Azure IoT Edge y seleccione Implementar en Azure.

  2. Seleccione Editar plantilla y vaya a la línea 172. Reemplace toda la línea por el código siguiente para agregar las marcas necesarias para implementar los servidores OPC PLC deseados:

    "[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
    
  3. En la resources sección , agregue el código siguiente dentro de la tercera properties sección (línea 167) (mismo nivel que image, command, ports, etc.):

    "volumeMounts": [
                      {
                      "name": "filesharevolume",
                      "mountPath": "/app/pki"
                      }
                    ],
    

    A continuación, agregue el código siguiente dentro de la segunda sección "properties" (línea 163) (mismo nivel que containers):

    "volumes": [
                   {
                      "name": "filesharevolume",
                      "azureFile": {
                            "shareName": "acishare",
                            "storageAccountName": "<storageAccName>",
                            "storageAccountKey": "<storageAccKey>"
                      }
                   }
               ]
    
  4. Guarde la plantilla y rellene los detalles del proyecto y de la instancia. Para Number of Simulations, especifique 2 para ejecutar dos servidores OPC PLC.

  5. Seleccione Revisar y crear y, a continuación, seleccione Crear para implementar los servidores en Azure.

Ahora ha creado correctamente dos servidores OPC UA PLC, cada uno con un nodo PLC rápido, que genera un entero sin signo con límite inferior = 65 y límite superior = 85 a una velocidad de 1.

Creación de certificados X.509 v3

Cree tres certificados X.509v3 compatibles con OPC UA (uno para el agente y otro para cada servidor), lo que garantiza que el certificado contiene los componentes necesarios, como un URI de aplicación.

Requisitos para los certificados:

  • Todos deben estar firmados por una entidad de certificación (CA) común y los algoritmos de firma de todos los certificados deben ser SHA256.
  • El tamaño de clave también debe ser mayor o igual que 2048 bits.
  • El DNS de los certificados de servidor y el certificado akriBroker deben contener el FQDN de la instancia de contenedor del servidor de OPC UA creada (vaya al paso 3 de Ejecución de Akri para obtener el FQDN).
  • El certificado de servidor de OPC UA debe denominarse OpcPlc (en términos de generación de certificados, CN=OpcPlc) y el certificado de agente de Akri debe tener AkriBroker el nombre () (CN=AkriBrokerno hay requisitos para el nombre de la entidad de certificación).

Hay muchas herramientas para generar certificados adecuados para OPC UA, como el generador de certificados de OPC Foundation o OpenSSL. El generador de certificados de OPC Foundation puede ser una opción más cómoda, mientras que OpenSSL proporciona más espacio para la personalización.

Si decide usar el generador de certificados de OPC Foundation, siga estos pasos para compilar:

  1. Instale Perl.

  2. Descargue el archivo .zip o clone el repositorio generador de certificados de OPC Foundation (Misc-Tools).

  3. Ejecute build_certificate-generator.bat desde el símbolo del sistema para desarrolladores de Visual Studio (se recomienda Visual Studio 2022).

  4. Compile Opc.Ua.CertificateGenerator la solución desde Visual Studio 2022.

  5. Compruebe si Opc.Ua.CertificateGenerator.exe se ha compilado correctamente en el build/Debug/Opc.Ua.CertificateGenerator directorio.

  6. Use los siguientes comandos de ejemplo para crear certificados. Consulte Misc-Tools para obtener más opciones:

    • Self-Signed CA:
    .\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -sn CN=<CA name e.g. MyCA> -ca true -pw <password>
    
    • Certificado de servidor de OPC UA:
    .\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an OpcPlc -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
    
    • Certificado de agente de Akri:
    .\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an AkriBroker -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
    
  7. Cree un .crl archivo para ca con OpenSSL (solo si creó una ENTIDAD de certificación desde el generador, lo que faltaría en el .crl archivo).

Si decide usar OpenSSL, esta es una lista de referencias:

Creación de un secreto de Kubernetes opcua-broker-credentials

El certificado de cliente de OPC UA se pasa al agente de supervisión de OPC UA como secreto de Kubernetes montado como un volumen.

Cree un secreto de Kubernetes, proyectando cada certificado,crl/clave privada con el nombre de clave esperado (client_certificate, client_key, ca_certificatey ca_crl). Especifique las rutas de acceso de archivo para que apunten a las credenciales creadas en la sección anterior:

kubectl create secret generic opcua-broker-credentials `
--from-file=client_certificate=/path/to/AkriBroker/own/certs/AkriBroker\ \[<hash>\].der `
--from-file=client_key=/path/to/AkriBroker/own/private/AkriBroker\ \[<hash>\].pfx `
--from-file=ca_certificate=/path/to/ca/certs/SomeCA\ \[<hash>\].der `
--from-file=ca_crl=/path/to/ca/crl/SomeCA\ \[<hash>\].crl

El certificado se monta en el volumen credentials en mountPath /etc/opcua-certs/client-pki, como se muestra en la plantilla de helm de configuración de OPC UA. Esta ruta de acceso es donde los agentes esperan encontrar los certificados.

Montaje de la carpeta de certificados en la ACI

Siga estas instrucciones para crear un recurso compartido de archivos de Azure.

Después de crear el recurso compartido de archivos de Azure y los certificados, cargue los certificados de servidor ca y OPC UA en el recurso compartido de archivos, tal y como se describe.

├── own
│   ├── certs
│   │   └── OpcPlc [hash].der
│   └── private
│       └── OpcPlc [hash].pfx
└── trusted
    ├── certs
    │   └── CA.der
    └── crl
        └── CA.crl

Nota

Dado que hemos agregado una marca para la seguridad en la plantilla, esto hace que se genere un certificado arbitrario en el recurso compartido de archivos. Puede eliminar los certificados no identificados en el recurso compartido de archivos (las rutas de acceso de carpeta deben tener exactamente el mismo aspecto que el diagrama anterior).

Después de seguir estos pasos para la seguridad, haga clic en Reiniciar en la instancia de contenedor para actualizarla y ejecutarla con los certificados montados.

Ejecución de Akri e implementación de una aplicación web

Siga la sección anterior para ejecutar Akri y detectar los servidores, pero ahora agregue una línea --set opcua.configuration.mountCertificates='true' al final del comando. Asegúrese de reemplazar opcua.configuration.discoveryDetails.discoveryUrls por las direcciones URL que se encuentran en el Azure Portal:

helm install akri akri-helm-charts/akri `
   --set opcua.discovery.enabled=true `
   --set opcua.configuration.enabled=true `
   --set opcua.configuration.name=akri-opcua-monitoring `
   --set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" `
   --set opcua.configuration.brokerPod.image.tag="latest-dev" `
   --set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' `
   --set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' `
   --set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" `
   --set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
   --set opcua.configuration.mountCertificates='true'

Desde aquí, puede seguir la sección sobre la implementación de una aplicación web de detección de anomalías como consumidor final de los agentes para ver los valores de OPC PLC en la página web.

Limpieza

  1. Elimine la aplicación de detección de anomalías:

    kubectl delete -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
    
  2. Desinstale Akri del clúster.

    helm delete akri
    
  3. Para eliminar la implementación del servidor de OPC UA, vaya a la instancia de contenedor y seleccione Eliminar en el Azure Portal.

Pasos siguientes

Introducción a AKS Edge Essentials