Partager via


Démarrage rapide : configurer votre cluster

Important

Opérations Azure IoT Préversion avec Azure Arc est actuellement en préversion. Vous ne devez pas utiliser ce logiciel en préversion dans des environnements de production.

Lorsqu’une version en disponibilité générale sera publiée, vous devrez déployer une nouvelle installation d’Opérations Azure IoT. Vous ne pourrez pas mettre à niveau une installation en préversion.

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.

Dans ce guide de démarrage rapide, vous allez configurer les ressources suivantes dans votre cluster Azure IoT Operations (préversion) :

  • Un point de terminaison de ressource qui définit une connexion à un serveur OPC PLC simulé qui simule un four dans une boulangerie.
  • Une ressource qui représente le four et définit les points de données que le four expose.
  • Un flux de données qui manipule les messages du four simulé.

Une ressource est un appareil physique ou une entité logique qui représente un appareil, un ordinateur, un système ou un processus. Par exemple, une ressource physique peut être une pompe, un moteur, un réservoir ou une ligne de production. Une ressource logique que vous définissez peut avoir des propriétés, des données de télémétrie de flux ou générer des événements.

Les serveurs OPC UA sont des applications logicielles qui communiquent avec des ressources. Les balises OPC UA sont des points de données que les serveurs OPC UA exposent. Les balises OPC UA peuvent fournir des données en temps réel ou un historique sur l’état, les performances, la qualité ou la condition des ressources.

Dans ce guide de démarrage rapide, vous utilisez un fichier Bicep pour configurer votre instance Azure IoT Operations.

Prérequis

Avoir une instance d’Opérations Azure IoT – Préversion déployée dans un cluster Kubernetes. Le Guide de démarrage rapide : Exécuter Opérations Azure IoT – Préversion dans GitHub Codespaces avec K3s fournit des instructions simples pour déployer une instance Opérations Azure IoT que vous pouvez utiliser pour les démarrages rapides.

Sauf indication contraire, vous pouvez exécuter les commandes de la console de ce guide de démarrage rapide dans un environnement Bash ou PowerShell.

Quel problème résoudrons-nous ?

Les données exposées par les serveurs OPC UA peuvent avoir une structure complexe et peuvent être difficiles à comprendre. Opérations Azure IoT permettent de modéliser les ressources OPC UA en tant que balises, événements et propriétés. Cette modélisation facilite la compréhension des données et leur utilisation dans des processus en aval, comme l’Agent MQTT et les flux de données. Les flux de données vous permettent de manipuler et d’acheminer des données vers des services cloud comme Azure Event Hubs. Dans ce guide de démarrage rapide, le flux de données modifie les noms de certains champs dans la charge utile et ajoute un ID de ressource aux messages.

Déployer le simulateur de PLC OPC

Ce démarrage rapide utilise le simulateur OPC PLC pour générer des exemples de données. Pour déployer le simulateur OPC PLC, exécutez la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml

L’extrait de code suivant montre le fichier YAML que vous avez appliqué :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: opc-plc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: opcplc-000000
  template:
    metadata:
      labels:
        app.kubernetes.io/component: opcplc-000000
    spec:
      containers:
      - name: opc-plc
        image: mcr.microsoft.com/iotedge/opc-plc:latest
        args:
          - "--ph=opcplc-000000"
          - "--cdn=opcplc-000000"
          - "--ut"
          - "--sn=25"
          - "--sr=10"
          - "--fn=2000"
          - "--veryfastrate=1000"
          - "--gn=5"
          - "--pn=50000"
          - "--maxsessioncount=100"
          - "--maxsubscriptioncount=100"
          - "--maxqueuedrequestcount=2000"
          - "--ses"
          - "--alm"
          - "--at=FlatDirectory"
          - "--drurs"
          - "--ll-debug"
          - "--nodesfile"
          - "/app/config/nodesfile.json"
        ports:
        - containerPort: 50000
        volumeMounts:
          - name: opc-plc-default-application-cert
            mountPath: /app/pki/own
          - name: opc-plc-trust-list
            mountPath: /app/pki/trusted
          - name: config-volume
            mountPath: /app/config
      volumes:
        - name: opc-plc-default-application-cert
          secret:
            secretName: opc-plc-default-application-cert
        - name: opc-plc-trust-list
          secret:
            secretName: opc-plc-trust-list
        - name: config-volume
          configMap:
            name: opc-plc-config
      serviceAccountName: opcplc-000000-service-account
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opc-plc-config
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  nodesfile.json: |
    {
      "Folder": "MyTelemetry",
      "NodeList": [
        {
          "NodeId": "ns=3;s=FastUInt100",
          "Name": "Fryer Temperature",
          "DataType": "Double",
          "ValueRank": -1,
          "AccessLevel": "CurrentReadOrWrite",
          "Description": "Fryer Temperature with spikes",
          "Anomaly": "Spike",
          "MinValue": 150.0,
          "MaxValue": 200.0          
        }
      ]
    }
---
apiVersion: v1
kind: Service
metadata:
  name: opcplc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/component: opcplc-000000
  ports:
    - port: 50000
      protocol: TCP
      targetPort: 50000
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: opc-plc-self-signed-issuer
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: opc-plc-default-application-cert
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  secretName: opc-plc-default-application-cert
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  issuerRef:
    name: opc-plc-self-signed-issuer
    kind: Issuer
  commonName: OpcPlc
  dnsNames:
    - opcplc-000000
    - opcplc-000000.azure-iot-operations.svc.cluster.local
    - opcplc-000000.azure-iot-operations
  uris:
    - urn:OpcPlc:opcplc-000000
  usages:
    - digital signature
    - key encipherment
    - data encipherment
    - server auth
    - client auth
  privateKey:
    algorithm: RSA
    size: 2048
  encodeUsagesInRequest: true
  isCA: false
---
apiVersion: v1
kind: Secret
metadata:
  name: opc-plc-trust-list
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data: {}
---
apiVersion: batch/v1
kind: Job
metadata:
  name: opcplc-000000-execute-mutual-trust
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  backoffLimit: 1
  template:
    spec:
      containers:
      - name: kubectl
        image: mcr.microsoft.com/oss/kubernetes/kubectl:v1.27.1
        imagePullPolicy: Always
        command: ["/bin/sh"]
        args: ["/scripts/execute-commands.sh"]
        volumeMounts:
        - name: scripts
          mountPath: /scripts
          readOnly: true
      restartPolicy: Never
      serviceAccountName: opcplc-000000-service-account
      volumes:
      - name: scripts
        configMap:
          name: opcplc-000000-execute-commands-script
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opcplc-000000-execute-commands-script
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  execute-commands.sh: |
    #!/bin/sh

    # wait 20 seconds for the resources to be created
    sleep 20

    # Extract the OPC UA connector application instance certificate and add it to the OPC PLC trust list
    cert=$(kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcuabroker.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret opc-plc-trust-list -n azure-iot-operations -p "{\"data\": $data}"

    # Extract the OPC PLC application instance certificate and add it to the OPC UA connector trust list
    cert=$(kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcplc-000000.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret aio-opc-ua-broker-trust-list -n azure-iot-operations -p "{\"data\": $data}"
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: opc-plc-000000-secret-access-role
  namespace: azure-iot-operations
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: opc-plc-000000-secret-access-rolebinding
  namespace: azure-iot-operations
subjects:
- kind: ServiceAccount
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
roleRef:
  kind: Role
  name: opc-plc-000000-secret-access-role
  apiGroup: rbac.authorization.k8s.io

Attention

Cette configuration utilise un certificat d’instance d’application auto-signé. N’utilisez pas cette configuration dans un environnement de production. Pour en savoir plus, consultez Configurer l’infrastructure des certificats OPC UA pour le Connecteur OPC UA.


Définir vos variables d’environnement

Si vous utilisez l’environnement Codespaces, les variables d’environnement obligatoires sont déjà définies et vous pouvez ignorer cette étape. Sinon, définissez les variables d’environnement suivantes dans votre interpréteur de commandes :

# Your subscription ID
SUBSCRIPTION_ID=<subscription-id>

# The name of the resource group where your Kubernetes cluster is deployed
RESOURCE_GROUP=<resource-group-name>

# The name of your Kubernetes cluster
CLUSTER_NAME=<kubernetes-cluster-name>

Configurer votre cluster

Exécutez les commandes suivantes pour télécharger et exécuter le fichier Bicep qui configure votre instance Azure IoT Operations. Le fichier Bicep :

  • Ajoute un point de terminaison de ressource qui se connecte au simulateur OPC PLC.
  • Ajoute une ressource qui représente le four et définit les points de données que le four expose.
  • Ajoute un flux de données qui manipule les messages du four simulé.
  • Crée une instance Azure Event Hubs pour recevoir les données.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/quickstart.bicep -O quickstart.bicep

AIO_EXTENSION_NAME=$(az k8s-extension list -g $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --cluster-type connectedClusters --query "[?extensionType == 'microsoft.iotoperations'].id" -o tsv | awk -F'/' '{print $NF}')
AIO_INSTANCE_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].name" -o tsv)
CUSTOM_LOCATION_NAME=$(az iot ops list -g $RESOURCE_GROUP --query "[0].extendedLocation.name" -o tsv | awk -F'/' '{print $NF}')

az deployment group create --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --template-file quickstart.bicep --parameters clusterName=$CLUSTER_NAME customLocationName=$CUSTOM_LOCATION_NAME aioExtensionName=$AIO_EXTENSION_NAME aioInstanceName=$AIO_INSTANCE_NAME

Vérifier la configuration

Le fichier Bicep a configuré les ressources suivantes :

  • Un point de terminaison de ressource qui se connecte au simulateur OPC PLC.
  • Une ressource qui représente le four et définit les points de données que le four expose.
  • Deux flux de données qui traitent les messages du four simulé.
  • Un espace de noms Azure Event Hubs qui contient un hub de destination pour les flux de données.

Pour afficher le point de terminaison de ressource, la ressource et les flux de données, accédez à l’interface utilisateur de l’expérience des opérations dans votre navigateur et connectez-vous avec vos informations d’identification Microsoft Entra ID. Étant donné que vous travaillez avec un nouveau déploiement, aucun site n’est encore présent. Vous trouverez le cluster que vous avez créé dans le guide de démarrage rapide précédent en sélectionnant des instances non attribuées. Dans l’expérience des opérations, une instance représente un cluster où vous avez déployé des opérations Azure IoT.

Capture d’écran de l’expérience des opérations montrant les instances non attribuées.

Le point de terminaison de ressource définit la connexion au simulateur OPC PLC :

Capture d’écran de l’expérience des opérations montrant une liste de points de terminaison de ressources.

La ressource du four définit les points de données exposés par le four :

Capture d’écran de l’expérience des opérations montrant une liste de ressources.

Les flux de données définissent la façon dont les messages du four simulé sont traités et acheminés vers Event Hubs dans le cloud :

Capture d’écran de l’expérience des opérations montrant une liste de flux de données.

La capture d’écran suivante montre comment le flux de données de conversion de température est configuré :

Capture d’écran de l’expérience des opérations montrant le calcul de conversion de température.

Vérifier que les données parviennent à l’Agent MQTT

Vérifiez que les données circulent vers l’agent MQTT à l’aide de l’outil mosquitto_sub. Dans cet exemple, vous exécutez l’outil mosquitto_sub à l’intérieur de votre cluster Kubernetes :

  1. Exécutez la commande suivante pour déployer un pod qui inclut les mosquitto_pub et les outils mosquitto_sub qui sont utiles pour interagir avec l’agent MQTT dans le cluster :

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
    

    L’extrait de code suivant montre le fichier YAML que vous avez appliqué :

    # Important: do not use in production environments
    # Creates a pod with mosquitto-clients and mqttui utilities in your cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: mqtt-client
      # The namespace must match the IoT MQ BrokerListener's namespace
      # Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
      namespace: azure-iot-operations
    spec:
      # Use the "mqtt-client" service account which comes with default deployment
      # Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
      serviceAccountName: mqtt-client
      containers:
        # Install mosquitto and mqttui utilities on Alpine linux
      - image: alpine
        name: mqtt-client
        command: ["sh", "-c"]
        args: ["apk add mosquitto-clients mqttui && sleep infinity"]
        resources:
          limits:
            cpu: 500m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: broker-sat
          mountPath: /var/run/secrets/tokens
        - name: trust-bundle
          mountPath: /var/run/certs
      volumes:
      - name: broker-sat
        projected:
          sources:
          - serviceAccountToken:
              path: broker-sat
              audience: aio-internal # Must match audience in BrokerAuthentication
              expirationSeconds: 86400
      - name: trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
    

    Attention

    Cette configuration n’est pas sécurisée. N’utilisez pas cette configuration dans un environnement de production.

  2. Quand le pod mqtt-client s’exécute, exécutez la commande suivante pour créer un environnement d’interpréteur de commandes dans le pod que vous avez créé :

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. Dans le shell Bash du pod mqtt-client, exécutez la commande suivante pour vous connecter à l’Agent MQTT en utilisant l’outil mosquitto_sub abonné à la rubrique data/thermostat :

    mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -v --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
    

    Cette commande continue à s’exécuter et affiche les messages à mesure qu’ils arrivent sur la rubrique data/thermostat jusqu’à ce que vous appuyiez sur Ctrl+C pour l’arrêter. Pour quitter l’environnement shell, tapez exit.

Pour vérifier que la ressource du four (oven) que vous avez ajoutée publie des données, examinez la télémétrie dans la rubrique azure-iot-operations/data :

Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:17.1858435Z","Value":4558},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:17.1858869Z","Value":4558}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:18.1838125Z","Value":4559},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:18.1838523Z","Value":4559}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:19.1834363Z","Value":4560},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:19.1834879Z","Value":4560}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:20.1861251Z","Value":4561},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:20.1861709Z","Value":4561}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/oven', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:21.1856798Z","Value":4562},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:21.1857211Z","Value":4562}}

Si aucune donnée ne circule, redémarrez le pod aio-opc-opc.tcp-1 :

  1. Recherchez le nom de votre pod aio-opc-opc.tcp-1 à l’aide de la commande suivante :

    kubectl get pods -n azure-iot-operations
    

    Le nom de votre pod ressemble à aio-opc-opc.tcp-1-849dd78866-vhmz6.

  2. Redémarrez le pod aio-opc-opc.tcp-1 en utilisant une commande semblable à celle de l’exemple suivant. Utilisez le nom du pod aio-opc-opc.tcp-1 de l’étape précédente :

    kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
    

L’exemple de ressource que vous avez ajouté précédemment dans ce guide de démarrage rapide génère des messages qui ressemblent à l’exemple suivant :

{
   "Temperature":{
      "SourceTimestamp":"2024-11-04T21:30:31.9454188Z",
      "Value":357
   },
   "FillWeight":{
      "SourceTimestamp":"2024-11-04T21:30:31.9455619Z",
      "Value":357
   },
   "EnergyUse":{
      "SourceTimestamp":"2024-11-04T21:30:31.9455641Z",
      "Value":357
   }
}

Vérifier que les données parviennent à Event Hubs

Pour vérifier que les données circulent vers le cloud, vous pouvez afficher votre instance Event Hubs dans le Portail Azure. Il se peut que vous deviez attendre quelques minutes pour que le flux de données démarre et que les messages circulent vers le Event Hub.

La configuration Bicep que vous avez appliquée précédemment a créé un espace de noms Event Hubs et un hub utilisé comme destination par le flux de données. Pour afficher l’espace de noms et le hub, accédez au groupe de ressources dans le Portail Azure qui contient votre instance IoT Operations, puis sélectionnez l’espace de noms Event Hubs.

Si les messages circulent vers l’instance, vous pouvez voir le nombre de messages entrants sur la page Vue d’ensemble de l’instance :

Capture d’écran montrant la page vue d’ensemble de l’instance Event Hubs avec les messages entrants.

Si des messages circulent, vous pouvez utiliser Data Explorer pour afficher les messages :

Capture d’écran de la page **Data Explorer** de l’instance Event Hubs.

Conseil

Vous devez peut-être vous attribuer le rôle Récepteur de données Azure Event Hubs pour l’espace de noms Event Hubs afin d’afficher les messages.

Comment avons-nous résolu le problème ?

Dans ce guide de démarrage rapide, vous avez utilisé un fichier bicep pour configurer votre instance Azure IoT Operations avec un point de terminaison de ressource, une ressource et un flux de données. La configuration traite et achemine les données d’un four simulé. Le flux de données dans la configuration achemine les messages vers une instance Azure Event Hubs.

Nettoyer les ressources

Si vous passez au guide de démarrage rapide suivant, conservez toutes vos ressources.

Si vous voulez supprimer le déploiement d’Opérations Azure IoT mais conserver votre cluster, utilisez la commande az iot ops delete :

az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Si vous voulez supprimer toutes les ressources que vous avez créées pour ce démarrage rapide, supprimez le cluster Kubernetes où vous avez déployé Opérations Azure IoT, puis supprimez le groupe de ressources Azure qui contenait le cluster.

Si vous avez utilisé Codespaces pour ces démarrages rapides, supprimez votre codespace de GitHub.

Étape suivante

Si vous souhaitez apprendre à créer un tableau de bord Microsoft Fabric pour obtenir des aperçus à partir des données du four, consultez Tutoriel : obtenir des aperçus à partir de vos données traitées.