Dela via


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.

Skärmbild i driftupplevelsen som visar otilldelade instanser.

Tillgångsslutpunkten definierar anslutningen till OPC PLC-simulatorn:

Skärmbild i driftupplevelsen som visar en lista över tillgångsslutpunkter.

Ugnstillgången definierar de datapunkter som ugnen exponerar:

Skärmbild i driftupplevelsen som visar en lista över tillgångar.

Dataflödena definierar hur meddelandena från den simulerade ugnen bearbetas och dirigeras till Event Hubs i molnet:

Skärmbild i driftupplevelsen som visar en lista över dataflöden.

Följande skärmbild visar hur dataflödet för temperaturkonvertering har konfigurerats:

Skärmbild av driftupplevelsen som visar temperaturkonverteringsberäkningen.

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:

  1. 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ö.

  2. 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
    
  3. 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 du exit.

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:

  1. 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.

  2. 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 :

Skärmbild som visar översiktssidan för Event Hubs-instansen med inkommande meddelanden.

Om meddelanden flödar kan du använda Datautforskaren för att visa meddelandena:

Skärmbild av sidan Event Hubs-instans **Datautforskaren**.

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.