Snabbstart: Konfigurera klustret
Viktigt!
Förhandsversion av Azure IoT Operations – aktiverad av Azure Arc är för närvarande i förhandsversion. Du bör inte använda den här förhandsgranskningsprogramvaran i produktionsmiljöer.
Du måste distribuera en ny Azure IoT Operations-installation när en allmänt tillgänglig version blir tillgänglig. Du kommer inte att kunna uppgradera en förhandsgranskningsinstallation.
Juridiska villkor som gäller för Azure-funktioner som är i betaversion, förhandsversion eller som ännu inte har släppts i allmän tillgänglighet finns i Kompletterande användningsvillkor för Förhandsversioner av Microsoft Azure.
I den här snabbstarten konfigurerar du följande resurser i azure IoT Operations Preview-klustret:
- En tillgångsslutpunkt som definierar en anslutning till en simulerad OPC PLC-server som simulerar en ugn i ett bageri.
- En tillgång som representerar ugnen och definierar de datapunkter som ugnen exponerar.
- Ett dataflöde som manipulerar meddelandena från den simulerade ugnen.
En tillgång är en fysisk enhet eller logisk entitet som representerar en enhet, en dator, ett system eller en process. En fysisk tillgång kan till exempel vara en pump, en motor, en tank eller en produktionslinje. En logisk tillgång som du definierar kan ha egenskaper, strömma telemetri eller generera händelser.
OPC UA-servrar är program som kommunicerar med tillgångar. OPC UA-taggar är datapunkter som OPC UA-servrar exponerar. OPC UA-taggar kan tillhandahålla realtidsdata eller historiska data om tillgångars status, prestanda, kvalitet eller villkor.
I den här snabbstarten använder du en Bicep-fil för att konfigurera din Azure IoT Operations-instans.
Förutsättningar
Ha en instans av Azure IoT Operations Preview distribuerad i ett Kubernetes-kluster. Snabbstart: Kör Azure IoT Operations Preview i GitHub Codespaces med K3s innehåller enkla instruktioner för att distribuera en Azure IoT Operations-instans som du kan använda för snabbstarterna.
Om inget annat anges kan du köra konsolkommandona i den här snabbstarten i antingen en Bash- eller PowerShell-miljö.
Vilket problem kommer vi att lösa?
De data som OPC UA-servrar exponerar kan ha en komplex struktur och kan vara svåra att förstå. Med Azure IoT Operations kan du modellera OPC UA-tillgångar som taggar, händelser och egenskaper. Den här modelleringen gör det enklare att förstå data och använda dem i underordnade processer som MQTT-asynkron meddelandekö och dataflöden. Med dataflöden kan du manipulera och dirigera data till molntjänster som Azure Event Hubs. I den här snabbstarten ändrar dataflödet namnen på vissa fält i nyttolasten och lägger till ett tillgångs-ID i meddelandena.
Distribuera OPC PLC-simulatorn
Den här snabbstarten använder OPC PLC-simulatorn för att generera exempeldata. Kör följande kommando för att distribuera OPC PLC-simulatorn:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml
Följande kodfragment visar YAML-filen som du använde:
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
Varning
Den här konfigurationen använder ett självsignerat programinstanscertifikat. Använd inte den här konfigurationen i en produktionsmiljö. Mer information finns i Konfigurera OPC UA-certifikatinfrastruktur för anslutningsappen för OPC UA.
Ange miljövariabler
Om du använder Codespaces-miljön har de miljövariabler som krävs redan angetts och du kan hoppa över det här steget. Annars anger du följande miljövariabler i gränssnittet:
# 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>
Konfigurera ditt kluster
Kör följande kommandon för att ladda ned och köra Bicep-filen som konfigurerar din Azure IoT Operations-instans. Bicep-filen:
- Lägger till en tillgångsslutpunkt som ansluter till OPC PLC-simulatorn.
- Lägger till en tillgång som representerar ugnen och definierar de datapunkter som ugnen exponerar.
- Lägger till ett dataflöde som ändrar meddelandena från den simulerade ugnen.
- Skapar en Azure Event Hubs-instans för att ta emot data.
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
Granska konfigurationen
Bicep-filen konfigurerade följande resurser:
- En tillgångsslutpunkt som ansluter till OPC PLC-simulatorn.
- En tillgång som representerar ugnen och definierar de datapunkter som ugnen exponerar.
- Två dataflöden som bearbetar meddelandena från den simulerade ugnen.
- Ett Azure Event Hubs-namnområde som innehåller en målhubb för dataflödena.
Om du vill visa tillgångsslutpunkten, tillgången och dataflödena går du till användargränssnittet för driftupplevelse i webbläsaren och loggar in med dina Microsoft Entra-ID-autentiseringsuppgifter. Eftersom du arbetar med en ny distribution finns det inga platser ännu. Du hittar klustret som du skapade i föregående snabbstart genom att välja Otilldelade instanser. I driftmiljön representerar en instans ett kluster där du distribuerade Azure IoT Operations.
Tillgångsslutpunkten definierar anslutningen till OPC PLC-simulatorn:
Ugnstillgången definierar de datapunkter som ugnen exponerar:
Dataflödena definierar hur meddelandena från den simulerade ugnen bearbetas och dirigeras till Event Hubs i molnet:
Följande skärmbild visar hur dataflödet för temperaturkonvertering har konfigurerats:
Kontrollera att data flödar till MQTT-asynkron meddelandekö
Kontrollera att data flödar till MQTT-koordinatorn med hjälp av verktyget mosquitto_sub . I det här exemplet kör du verktyget mosquitto_sub i Kubernetes-klustret:
Kör följande kommando för att distribuera en podd som innehåller verktygen mosquitto_pub och mosquitto_sub som är användbara för att interagera med MQTT-koordinatorn i klustret:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
Följande kodfragment visar YAML-filen som du använde:
# 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
Varning
Den här konfigurationen är inte säker. Använd inte den här konfigurationen i en produktionsmiljö.
När mqtt-client-podden körs kör du följande kommando för att skapa en gränssnittsmiljö i podden som du skapade:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Kör följande kommando i Bash-gränssnittet i mqtt-client-podden för att ansluta till MQTT-koordinatorn med hjälp av det mosquitto_sub verktyg som prenumererar på
data/thermostat
ämnet: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)
Det här kommandot fortsätter att köras och visar meddelanden när de tas emot i
data/thermostat
ämnet tills du trycker på Ctrl+C för att stoppa det. Om du vill avsluta shell-miljön skriver duexit
.
Om du vill kontrollera att den ugnstillgång som du har lagt till publicerar data visar du telemetrin i ämnet 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}}
Om inga data flödar startar du om aio-opc-opc.tcp-1
podden:
Hitta namnet på din
aio-opc-opc.tcp-1
podd med hjälp av följande kommando:kubectl get pods -n azure-iot-operations
Namnet på din podd ser ut som
aio-opc-opc.tcp-1-849dd78866-vhmz6
.aio-opc-opc.tcp-1
Starta om podden med hjälp av ett kommando som ser ut som i följande exempel.aio-opc-opc.tcp-1
Använd poddnamnet från föregående steg:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
Exempeltillgången som du lade till tidigare i den här snabbstarten genererar meddelanden som ser ut som i följande exempel:
{
"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
}
}
Kontrollera att data flödar till Event Hubs
Om du vill kontrollera att data flödar till molnet kan du visa din Event Hubs-instans i Azure Portal. Du kan behöva vänta i flera minuter för att dataflödet ska starta och för att meddelanden ska flöda till händelsehubben.
Den Bicep-konfiguration som du använde tidigare skapade ett Event Hubs-namnområde och en hubb som används som mål av dataflödet. Om du vill visa namnområdet och hubben går du till resursgruppen i Azure Portal som innehåller din IoT Operations-instans och väljer sedan Event Hubs-namnområdet.
Om meddelanden flödar till instansen kan du se antalet inkommande meddelanden på instansens översiktssida :
Om meddelanden flödar kan du använda Datautforskaren för att visa meddelandena:
Dricks
Du kan behöva tilldela dig själv rollen Azure Event Hubs Data Receiver för Event Hubs-namnområdet för att visa meddelandena.
Hur löste vi problemet?
I den här snabbstarten använde du en bicep-fil för att konfigurera din Azure IoT Operations-instans med en tillgångsslutpunkt, tillgång och dataflöde. Konfigurationen bearbetar och dirigerar data från en simulerad ugn. Dataflödet i konfigurationen dirigerar meddelandena till en Azure Event Hubs-instans.
Rensa resurser
Om du fortsätter till nästa snabbstart behåller du alla dina resurser.
Om du vill ta bort Azure IoT Operations-distributionen men behålla klustret använder du kommandot az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Om du vill ta bort alla resurser som du skapade för den här snabbstarten tar du bort Kubernetes-klustret där du distribuerade Azure IoT-åtgärder och tar sedan bort azure-resursgruppen som innehöll klustret.
Om du använde Codespaces för dessa snabbstarter tar du bort ditt Codespace från GitHub.
Gå vidare
Om du vill lära dig hur du skapar en Microsoft Fabric-instrumentpanel för att få insikter från dina ugnsdata kan du läsa Självstudie: Hämta insikter från dina bearbetade data.