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.
Le point de terminaison de ressource définit la connexion au simulateur OPC PLC :
La ressource du four définit les points de données exposés par le four :
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 :
La capture d’écran suivante montre comment le flux de données de conversion de température est configuré :
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 :
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.
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
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, tapezexit
.
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
:
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
.Redémarrez le pod
aio-opc-opc.tcp-1
en utilisant une commande semblable à celle de l’exemple suivant. Utilisez le nom du podaio-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 :
Si des messages circulent, vous pouvez utiliser Data Explorer pour afficher les messages :
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.