Tutoriel : Ajouter des ressources OPC UA à votre cluster Opérations Azure IoT
Dans ce tutoriel, vous ajoutez manuellement des ressources OPC UA à votre cluster Opérations Azure IoT. Ces ressources publient des messages sur l’agent MQTT dans votre cluster Azure IoT Operations. En règle générale, un utilisateur OT effectue ces étapes.
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 tutoriel, vous utilisez l’interface utilisateur web de l’expérience des opérations pour créer vos ressources. Vous pouvez également utiliser Azure CLI pour effectuer certaines de ces tâches.
Prérequis
Une instance d’Opérations Azure IoT déployée dans un cluster Kubernetes. Pour créer une instance, utilisez l’une des opérations suivantes pour déployer les Opérations Azure IoT :
- Démarrage rapide : Exécuter Opérations Azure IoT dans GitHub Codespaces avec K3s fournit des instructions simples pour déployer une instance Opérations Azure IoT que vous pouvez utiliser pour les tutoriels.
- La vue d’ensemble du déploiement fournit des instructions détaillées pour déployer une instance d’Opérations Azure IoT sur Windows à l’aide d’Azure Kubernetes Service Edge Essentials ou Ubuntu à l’aide de K3s.
Pour vous connecter à l’interface utilisateur web de l’expérience des opérations, vous devez avoir un compte Microsoft Entra ID avec au moins des autorisations de contributeur pour le groupe de ressources contenant votre instance Kubernetes – Azure Arc. Pour plus d’informations, consultez Interface utilisateur web de l’expérience des opérations.
Sauf indication contraire, vous pouvez exécuter les commandes de la console de ce tutoriel 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.
Déployer le simulateur de PLC OPC
Ce tutoriel 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 n’est pas sécurisée. N’utilisez pas cette configuration dans un environnement de production.
Se connecter à l’expérience des opérations
Pour créer des points de terminaison de ressources, des ressources et s’abonner aux étiquettes et événements OPC UA, utilisez l’expérience des opérations.
Accédez à l’expérience des opérations dans votre navigateur et connectez-vous avec vos informations d’identification Microsoft Entra ID.
Sélectionner votre site
Un site est une collection d’instances d’Opérations Azure IoT. Les sites regroupent généralement des instances par emplacement physique et facilitent la localisation et la gestion des ressources par les utilisateurs OT. Votre administrateur informatique crée des sites et leur affecte des instances Opérations Azure IoT. É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 Afficher 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.
Sélectionner votre instance
Sélectionnez l’instance sur laquelle vous avez déployé Opérations Azure IoT dans le tutoriel précédent :
Conseil
Si vous ne voyez aucune instance, il est possible que vous ne soyez pas dans le locataire Microsoft Entra ID approprié. Vous pouvez changer le locataire à partir du menu supérieur droit dans le portail.
Ajouter un point de terminaison de ressource
Lorsque vous avez déployé Opérations Azure IoT dans l’article précédent, vous avez inclus un simulateur OPC PLC intégré. Dans cette étape, vous ajoutez un point de terminaison de ressource qui vous permet de vous connecter au simulateur OPC PLC.
Pour ajouter un point de terminaison de ressource :
Sélectionnez Points de terminaison de ressource, puis Créer un point de terminaison de ressource :
Entrez les informations de point de terminaison suivantes :
Champ Valeur Nom du point de terminaison de la ressource opc-ua-connector-0
URL du serveur OPC UA opc.tcp://opcplc-000000:50000
Mode d’authentification utilisateur Anonymous
Pour enregistrer la définition, sélectionnez Créer.
Cette configuration déploie un nouveau point de terminaison de ressource appelé
opc-ua-connector-0
sur le cluster. Vous pouvez utiliserkubectl
pour voir les points de terminaison de ressource :kubectl get assetendpointprofile -n azure-iot-operations
Gérer vos actifs
Une fois que vous avez sélectionné votre instance dans l’expérience des opérations, vous voyez la liste disponible des ressources dans la page Ressources. S’il n’y a pas encore de ressources, cette liste est vide :
Créer un actif
Pour créer une ressource, sélectionnez Créer une ressource. Entrez ensuite les informations de ressource suivantes :
Champ | Valeur |
---|---|
Point de terminaison de ressource | opc-ua-connector-0 |
Nom de l’actif | thermostat |
Description | A simulated thermostat asset |
Rubrique MQTT par défaut | azure-iot-operations/data/thermostat |
Supprimez les Propriétés personnalisées existantes et ajoutez les propriétés personnalisées suivantes. Veillez à utiliser les noms de propriété exacts, car le modèle Power BI les demande dans un tutoriel ultérieur :
Nom de la propriété | Détail de la propriété |
---|---|
batch | 102 |
client | Contoso |
équipement | Chaudière |
isSpare | true |
location | Seattle |
Sélectionnez Suivant pour accéder à la page Ajouter des balises.
Créer des balises OPC UA
Ajoutez deux étiquettes OPC UA sur la page Ajouter des étiquettes. Pour ajouter chaque étiquette, sélectionnez Ajouter une étiquette ou un CSV, puis Ajouter une étiquette. Entrez les détails de la balise indiqués dans le tableau suivant :
ID de nœud | Nom de la balise | Mode d’observabilité |
---|---|---|
ns=3;s=FastUInt10 | température | Aucune |
ns=3;s=FastUInt100 | Balise 10 | Aucune |
Le mode Observabilité est l’une des valeurs suivantes : None
, Gauge
, Counter
, Histogram
ou Log
.
Vous pouvez sélectionner Gérer les paramètres par défaut pour modifier l’intervalle d’échantillonnage et la taille de file d’attente par défaut pour chaque balise.
Sélectionnez Suivant pour accéder à la page Ajouter des évènements, puis Suivant pour la page Révision.
Révision
Passez en revue votre ressource et les détails de la balise et apportez les ajustements nécessaires avant de sélectionner Créer :
Cette configuration déploie une nouvelle ressource appelée thermostat
sur le cluster. Vous pouvez utiliser kubectl
pour voir les ressources :
kubectl get assets -n azure-iot-operations
Afficher des ressources dans le portail Azure
Pour afficher le point de terminaison du bien et le bien que vous avez créé dans le portail Azure, accédez au groupe de ressources qui contient votre instance Opérations Azure IoT. Vous pouvez voir la ressource thermostat dans le groupe de ressources Opérations Azure IoT. Si vous sélectionnez Afficher les types masqués, vous pouvez également voir le point de terminaison de ressource :
Le portail vous permet d’afficher les détails de la ressource. Sélectionnez vue JSON pour plus d’informations :
Vérifier que les données circulent
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 # Create a service account apiVersion: v1 kind: ServiceAccount metadata: name: mqtt-client namespace: azure-iot-operations --- # 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 thermostat que vous avez ajoutée publie des données, visualisez 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/thermostat', ... (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/thermostat', ... (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/thermostat', ... (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/thermostat', ... (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/thermostat', ... (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
Les exemples de balises que vous avez ajoutés dans le tutoriel précédent génèrent des messages à partir de votre ressource qui ressemblent à l’exemple suivant :
{
"temperature": {
"SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
"Value": 2696
},
"Tag 10": {
"SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
"Value": 2696
}
}
Comment avons-nous résolu le problème ?
Dans ce tutoriel, vous avez ajouté un point de terminaison de ressource, puis défini une ressource et des balises. Les ressources et balises modélisent les données du serveur OPC UA pour faciliter l’utilisation des données dans un répartiteur MQTT et d’autres processus en aval. Vous utilisez la ressource thermostat que vous avez définie dans le tutoriel suivant.
Nettoyer les ressources
Si vous passez au tutoriel 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
Tutoriel : Envoyer la télémétrie de ressources dans le cloud en utilisant un flux de données