Schnellstart: Konfigurieren Ihrer Cluster
Wichtig
Die von Azure Arc unterstützte Vorschauversion von „Azure IoT Einsatz“ befindet sich derzeit in der Vorschauphase. Sie sollten diese Vorschausoftware nicht in Produktionsumgebungen verwenden.
Sie müssen eine neue Installation von Azure IoT Einsatz bereitstellen, sobald eine allgemein verfügbare Version verfügbar ist. Sie werden kein Upgrade für eine Preview-Installation durchführen können.
Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.
In dieser Schnellstartanleitung konfigurieren Sie die folgenden Ressourcen in Ihrem Azure IoT Operations Preview-Cluster:
- Ein Asset-Endpunkt, der eine Verbindung mit einem simulierten OPC PLC-Server definiert, der einen Ofen in einer Bäckerei simuliert.
- Ein Asset, das den Ofen darstellt, und die Datenpunkte definiert, die der Ofen verfügbar macht.
- Ein Datenfluss, der die Nachrichten aus dem simulierten Ofen bearbeitet.
Eine Ressource ist ein physisches Gerät oder eine logische Entität, die ein Gerät, einen Computer, ein System oder einen Prozess darstellt. Ein physisches Objekt könnte beispielsweise eine Pumpe, ein Motor, ein Tank oder eine Produktionslinie sein. Eine von Ihnen definierte logische Ressource kann Eigenschaften, Stream-Telemetrie oder Ereignisse generieren.
OPC UA-Server sind Softwareanwendungen, die mit Ressourcen kommunizieren. OPC UA-Tags sind Datenpunkte, die OPC UA-Server verfügbar machen. OPC UA-Tags können Echtzeit- oder Verlaufsdaten über den Status, die Leistung, die Qualität oder den Zustand von Ressourcen bereitstellen.
In dieser Schnellstartanleitung verwenden Sie eine Bicep-Datei, um Ihre Azure IoT Operations-Instanz zu konfigurieren.
Voraussetzungen
Sie haben eine Instanz von Azure IoT Operations Preview in einem Kubernetes-Cluster bereitgestellt. Das Dokument Schnellstart: Ausführen der Azure IoT Operations Preview in GitHub Codespaces mit K3s enthält einfache Anweisungen zum Bereitstellen einer Azure IoT Operations-Instanz, die Sie für die Schnellstarts verwenden können.
Sofern nicht anders angegeben, können Sie die Konsolenbefehle in dieser Schnellstartanleitung entweder in einer Bash- oder PowerShell-Umgebung ausführen.
Welches Problem werden wir lösen?
Die Daten, die OPC UA-Server verfügbar machen, können eine komplexe Struktur aufweisen und schwer zu verstehen sein. Azure IoT Operations bietet eine Möglichkeit, OPC UA-Ressourcen als Tags, Ereignisse und Eigenschaften zu modellieren. Diese Modellierung erleichtert das Verständnis der Daten und deren Verwendung in nachgelagerten Prozessen wie dem MQTT-Broker und in Dataflows. Mit Datenflüssen können Sie Daten bearbeiten und an Clouddienste wie Azure Event Hubs weiterleiten. In diesem Schnellstart ändert der Datenfluss die Namen einiger Felder in der Payload und fügt den Nachrichten eine Asset-ID hinzu.
Bereitstellen des OPC PLC-Simulators
Dieser Schnellstart verwendet den OPC PLC-Simulator, um Beispieldaten zu generieren. Um den OPC PLG-Simulator bereitzustellen, führen Sie den folgenden Befehl aus:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml
Das folgende Codeschnipsel zeigt die YAML-Datei, die Sie angewendet haben:
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
Achtung
Diese Konfiguration verwendet ein selbstsigniertes Anwendungsinstanzzertifikat. Verwenden Sie diese Konfiguration nicht in einer Produktionsumgebung. Weitere Informationen finden Sie unter Konfigurieren der OPC UA-Zertifikatinfrastruktur für den Anschluss für OPC UA.
Festlegen Ihrer Umgebungsvariablen
Wenn Sie die Codespaces-Umgebung verwenden, sind die erforderlichen Umgebungsvariablen bereits festgelegt, und Sie können diesen Schritt überspringen. Legen Sie andernfalls die folgenden Umgebungsvariablen in Ihrer Shell fest:
# 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>
Konfigurieren des Clusters
Führen Sie die folgenden Befehle aus, um die Bicep-Datei herunterzuladen und auszuführen, die Ihre Azure IoT Operations-Instanz konfiguriert. Die Bicep-Datei:
- Fügt einen Asset-Endpunkt hinzu, der eine Verbindung mit dem OPC PLC-Simulator herstellt.
- Fügt ein Asset hinzu, das den Ofen darstellt, und die Datenpunkte definiert, die der Ofen verfügbar macht.
- Fügt einen Datenfluss hinzu, der die Nachrichten aus dem simulierten Ofen bearbeitet.
- Erstellt eine Azure Event Hubs-Instanz, um die Daten zu empfangen.
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
Überprüfen der Konfiguration
Die Bicep-Datei konfiguriert die folgenden Ressourcen:
- Ein Asset-Endpunkt, der eine Verbindung mit dem OPC PLC-Simulator herstellt.
- Ein Asset, das den Ofen darstellt, und die Datenpunkte definiert, die der Ofen verfügbar macht.
- Zwei Datenflüsse, die die Nachrichten aus dem simulierten Ofen verarbeiten.
- Ein Azure Event Hubs-Namespace, der einen Zielhub für die Datenflüsse enthält.
Um den Asset-Endpunkt, das Asset und die Datenflüsse anzuzeigen, navigieren Sie in Ihrem Browser zur Benutzeroberfläche für die Betriebsabläufe und melden Sie sich mit Ihren Microsoft Entra ID-Anmeldeinformationen an. Da Sie mit einer neuen Bereitstellung arbeiten, gibt es noch keine Websites. Sie finden den Cluster, den Sie in der vorherigen Schnellstartanleitung erstellt haben, indem Sie Nicht zugewiesene Instanzen auswählen. In der Betriebserfahrung stellt eine Instanz einen Cluster dar, in dem Sie Azure IoT Einsatz bereitgestellt haben.
Der Asset-Endpunkt definiert die Verbindung mit dem OPC PLC-Simulator:
Das Ofen-Asset definiert die Datenpunkte, die der Ofen verfügbar macht:
Die Datenflüsse definieren, wie die Nachrichten vom simulierten Ofen verarbeitet und an Event Hubs in der Cloud weitergeleitet werden:
Der folgende Screenshot zeigt, wie der Datenfluss für die Temperaturumrechnung konfiguriert ist:
Überprüfen, ob Daten an den MQTT-Broker fließen
Überprüfen Sie mit dem Tool mosquitto_sub, ob Daten an den MQTT-Broker fließen. In diesem Beispiel führen Sie das mosquitto_sub-Tool in Ihrem Kubernetes-Cluster aus:
Führen Sie den folgenden Befehl aus, um einen Pod bereitzustellen, der die Tools mosquitto_pub und mosquitto_sub enthält, die für die Interaktion mit dem MQTT-Broker im Cluster nützlich sind:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
Das folgende Codeschnipsel zeigt die YAML-Datei, die Sie angewendet haben:
# 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
Achtung
Diese Konfiguration ist nicht sicher. Verwenden Sie diese Konfiguration nicht in einer Produktionsumgebung.
Wenn der mqtt-client-Pod ausgeführt wird, führen Sie den folgenden Befehl aus, um eine Shellumgebung im erstellten Pod zu erstellen:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Führen Sie auf der Bash-Shell im mqtt-client-Pod den folgenden Befehl aus, um mithilfe des Tools mosquitto_sub, welches das
data/thermostat
-Thema abonniert hat, eine Verbindung mit dem MQTT-Broker herzustellen: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)
Dieser Befehl wird weiterhin ausgeführt und zeigt Nachrichten an, sobald sie im
data/thermostat
-Thema eingehen, bis Sie STRG+C drücken, um ihn zu beenden. Um die Shell-Umgebung zu beenden, geben Sie „exit
“ ein.
Um sicherzustellen, ob der von Ihnen hinzugefügte Ofen Daten veröffentlicht, sehen Sie sich die Telemetrie im Thema azure-iot-operations/data
an:
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}}
Wenn keine Daten fließen, starten Sie den aio-opc-opc.tcp-1
-Pod neu.
Um den Namen ihres
aio-opc-opc.tcp-1
-Pods zu finden, führen Sie den folgenden Befehl aus:kubectl get pods -n azure-iot-operations
Der Name Ihres Pods sieht aus wie
aio-opc-opc.tcp-1-849dd78866-vhmz6
.Starten Sie den
aio-opc-opc.tcp-1
-Pod neu, indem Sie einen Befehl verwenden, der wie das folgende Beispiel aussieht. Verwenden Sie denaio-opc-opc.tcp-1
-Pod aus dem vorherigen Schritt:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
Die Beispielressource, die Sie weiter oben in diesem Schnellstart hinzugefügt haben, generiert Nachrichten, die wie im folgenden Beispiel aussehen:
{
"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
}
}
Überprüfen, ob Daten an Event Hubs fließen
Um zu überprüfen, ob Daten in die Cloud fließen, können Sie Ihre Event Hubs-Instanz im Azure-Portal anzeigen. Möglicherweise müssen Sie mehrere Minuten warten, bis der Datenfluss gestartet wird und Nachrichten an den Event Hub fließen.
Die zuvor von Ihnen angewendete Bicep-Konfiguration hat einen Event-Hubs-Namespace und einen Hub erstellt, die vom Datenfluss als Ziel verwendet werden. Um den Namespace und den Hub anzuzeigen, navigieren Sie im Azure-Portal zu der Ressourcengruppe, die Ihre IoT Operations-Instanz enthält, und wählen Sie dann den Event-Hubs-Namespace aus.
Wenn Nachrichten an die Instanz fließen, können Sie die Anzahl eingehender Nachrichten auf der Seite Übersicht der Instanz sehen:
Wenn Nachrichten fließen, können Sie den Daten-Explorer verwenden, um die Nachrichten anzuzeigen:
Tipp
Möglicherweise müssen Sie sich die Rolle Azure Event Hubs-Datenempfänger für den Event Hubs-Namespace zuweisen, um die Nachrichten anzuzeigen.
Wie haben wir das Problem gelöst?
In dieser Schnellstartanleitung haben Sie eine Bizeps-Datei verwendet, um Ihre Azure IoT Operations-Instanz mit einem Asset-Endpunkt, einem Asset und einem Datenfluss zu konfigurieren. Die Konfiguration verarbeitet und leitet Daten von einem simulierten Ofen. Der Datenfluss in der Konfiguration leitet die Nachrichten an eine Azure Event Hubs-Instanz weiter.
Bereinigen von Ressourcen
Wenn Sie mit der nächsten Schnellstartanleitung fortfahren, sollten Sie alle Ihre Ressourcen beibehalten.
Wenn Sie die Azure IoT Einsatz-Bereitstellung entfernen, aber Ihren Cluster beibehalten möchten, verwenden Sie den Befehl az iot ops delete.
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Wenn Sie alle im Rahmen dieser Schnellstartanleitung erstellten Ressourcen löschen möchten, löschen Sie den Kubernetes-Cluster, in dem Sie Azure IoT Einsatz bereitgestellt haben, und entfernen Sie dann die Azure-Ressourcengruppe, in der das Cluster enthalten war.
Wenn Sie Codespaces für diese Schnellstarts verwendet haben, löschen Sie Ihren Codespace aus GitHub.
Nächster Schritt
Wenn Sie erfahren möchten, wie Sie ein Microsoft Fabric-Dashboard erstellen, um Erkenntnisse aus Ihren Ofen-Daten zu gewinnen, sehen Sie sich das Tutorial: Gewinnen von Erkenntnissen aus Ihren verarbeiteten Daten an.