Delen via


Quickstart: Uw cluster configureren

Belangrijk

Azure IoT Operations Preview: ingeschakeld door Azure Arc is momenteel in preview. Gebruik deze preview-software niet in productieomgevingen.

U moet een nieuwe Azure IoT Operations-installatie implementeren wanneer er een algemeen beschikbare release beschikbaar komt. U kunt geen preview-installatie upgraden.

Zie de aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in de bètaversie, in preview of anderszins nog niet zijn uitgebracht in algemene beschikbaarheid.

In deze quickstart configureert u de volgende resources in uw Azure IoT Operations Preview-cluster:

  • Een asseteindpunt dat een verbinding definieert met een gesimuleerde OPC PLC-server die een oven in een bakkerij simuleert.
  • Een asset die de oven vertegenwoordigt en de gegevenspunten definieert die door de oven worden weergegeven.
  • Een gegevensstroom die de berichten van de gesimuleerde oven bewerkt.

Een asset is een fysiek apparaat of logische entiteit die een apparaat, een machine, een systeem of een proces vertegenwoordigt. Een fysiek activum kan bijvoorbeeld een pomp, een motor, een tank of een productielijn zijn. Een logische asset die u definieert, kan eigenschappen hebben, telemetrie streamen of gebeurtenissen genereren.

OPC UA-servers zijn softwaretoepassingen die communiceren met assets. OPC UA-tags zijn gegevenspunten die OPC UA-servers beschikbaar maken. OPC UA-tags kunnen realtime of historische gegevens bieden over de status, prestaties, kwaliteit of conditie van assets.

In deze quickstart gebruikt u een Bicep-bestand om uw Azure IoT Operations-exemplaar te configureren.

Vereisten

Een exemplaar van Azure IoT Operations Preview geïmplementeerd in een Kubernetes-cluster. De quickstart: Azure IoT Operations Preview uitvoeren in GitHub Codespaces met K3s biedt eenvoudige instructies voor het implementeren van een Azure IoT Operations-exemplaar dat u voor de quickstarts kunt gebruiken.

Tenzij anders vermeld, kunt u de consoleopdrachten in deze quickstart uitvoeren in een Bash- of PowerShell-omgeving.

Welk probleem gaan we oplossen?

De gegevens die OPC UA-servers beschikbaar maken, kunnen een complexe structuur hebben en kunnen moeilijk te begrijpen zijn. Azure IoT Operations biedt een manier om OPC UA-assets te modelleren als tags, gebeurtenissen en eigenschappen. Deze modellering maakt het gemakkelijker om inzicht te hebben in de gegevens en deze te gebruiken in downstreamprocessen zoals de MQTT-broker en gegevensstromen. Met gegevensstromen kunt u gegevens bewerken en routeren naar cloudservices zoals Azure Event Hubs. In deze snelstart wijzigt de gegevensstroom de namen van sommige velden in nettolading en voegt een asset-id toe aan de berichten.

De OPC PLC-simulator implementeren

In deze quickstart wordt de OPC PLC-simulator gebruikt om voorbeeldgegevens te genereren. Voer de volgende opdracht uit om de OPC PLC-simulator te implementeren:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml

In het volgende fragment ziet u het YAML-bestand dat u hebt toegepast:

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

Let op

Deze configuratie maakt gebruik van een zelfondertekend toepassingsexemplarencertificaat. Gebruik deze configuratie niet in een productieomgeving. Zie De infrastructuur voor OPC UA-certificaten configureren voor de connector voor OPC UA voor meer informatie.


Uw omgevingsvariabelen instellen

Als u de Codespaces-omgeving gebruikt, zijn de vereiste omgevingsvariabelen al ingesteld en kunt u deze stap overslaan. Stel anders de volgende omgevingsvariabelen in uw shell in:

# 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>

Het cluster configureren

Voer de volgende opdrachten uit om het Bicep-bestand te downloaden en uit te voeren waarmee uw Azure IoT Operations-exemplaar wordt geconfigureerd. Het Bicep-bestand:

  • Hiermee voegt u een asseteindpunt toe dat verbinding maakt met de OPC PLC-simulator.
  • Hiermee voegt u een asset toe die de oven vertegenwoordigt en definieert u de gegevenspunten die door de oven worden weergegeven.
  • Hiermee voegt u een gegevensstroom toe waarmee de berichten van de gesimuleerde oven worden bewerkt.
  • Hiermee maakt u een Azure Event Hubs-exemplaar om de gegevens te ontvangen.
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

Configuratie controleren

Het Bicep-bestand heeft de volgende resources geconfigureerd:

  • Een asseteindpunt dat verbinding maakt met de OPC PLC-simulator.
  • Een asset die de oven vertegenwoordigt en de gegevenspunten definieert die door de oven worden weergegeven.
  • Twee gegevensstromen waarmee de berichten van de gesimuleerde oven worden verwerkt.
  • Een Azure Event Hubs-naamruimte die een doelhub voor de gegevensstromen bevat.

Als u het asseteindpunt, de asset en de gegevensstromen wilt weergeven, gaat u naar de gebruikersinterface van de bewerkingservaring in uw browser en meldt u zich aan met uw Microsoft Entra ID-referenties. Omdat u met een nieuwe implementatie werkt, zijn er nog geen sites. U vindt het cluster dat u in de vorige quickstart hebt gemaakt door niet-toegewezen exemplaren te selecteren. In de bewerkingservaring vertegenwoordigt een exemplaar een cluster waarin u Azure IoT-bewerkingen hebt geïmplementeerd.

Schermopname in de bewerkingservaring met niet-toegewezen exemplaren.

Het asseteindpunt definieert de verbinding met de OPC PLC-simulator:

Schermopname in de bewerkingservaring met een lijst met asseteindpunten.

De ovenasset definieert de gegevenspunten die door de oven worden weergegeven:

Schermopname in de bewerkingservaring met een lijst met assets.

De gegevensstromen definiëren hoe de berichten van de gesimuleerde oven worden verwerkt en doorgestuurd naar Event Hubs in de cloud:

Schermopname in de bewerkingservaring met een lijst met gegevensstromen.

In de volgende schermopname ziet u hoe de gegevensstroom voor temperatuurconversie is geconfigureerd:

Schermopname in de bewerkingservaring waarin de berekening van de temperatuurconversie wordt weergegeven.

Controleren of gegevens stromen naar MQTT-broker

Controleer of de gegevens naar de MQTT-broker stromen met behulp van het hulpprogramma mosquitto_sub . In dit voorbeeld voert u het hulpprogramma mosquitto_sub uit in uw Kubernetes-cluster:

  1. Voer de volgende opdracht uit om een pod te implementeren die de mosquitto_pub en mosquitto_sub hulpprogramma's bevat die nuttig zijn voor interactie met de MQTT-broker in het cluster:

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
    

    In het volgende fragment ziet u het YAML-bestand dat u hebt toegepast:

    # 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
    

    Let op

    Deze configuratie is niet beveiligd. Gebruik deze configuratie niet in een productieomgeving.

  2. Wanneer de mqtt-client-pod wordt uitgevoerd, voert u de volgende opdracht uit om een shell-omgeving te maken in de pod die u hebt gemaakt:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. Voer in de Bash-shell in de mqtt-client-pod de volgende opdracht uit om verbinding te maken met de MQTT-broker met behulp van het hulpprogramma mosquitto_sub dat is geabonneerd op het data/thermostat onderwerp:

    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)
    

    Deze opdracht blijft actief en geeft berichten weer wanneer ze binnenkomen in het data/thermostat onderwerp totdat u op Ctrl+C drukt om deze te stoppen. Als u de shell-omgeving wilt afsluiten, typt exitu .

Als u wilt controleren of de ovenasset die u hebt toegevoegd gegevens publiceert, bekijkt u de telemetrie in het azure-iot-operations/data onderwerp:

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}}

Als er geen gegevensstromen zijn, start u de aio-opc-opc.tcp-1 pod opnieuw op:

  1. Zoek de naam van uw aio-opc-opc.tcp-1 pod met behulp van de volgende opdracht:

    kubectl get pods -n azure-iot-operations
    

    De naam van uw pod ziet er als aio-opc-opc.tcp-1-849dd78866-vhmz6volgt uit.

  2. Start de aio-opc-opc.tcp-1 pod opnieuw op met behulp van een opdracht die lijkt op het volgende voorbeeld. Gebruik de aio-opc-opc.tcp-1 podnaam uit de vorige stap:

    kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
    

Met de voorbeeldasset die u eerder in deze quickstart hebt toegevoegd, worden berichten gegenereerd die eruitzien als in het volgende voorbeeld:

{
   "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
   }
}

Controleren of gegevens naar Event Hubs stromen

Als u wilt controleren of de gegevens naar de cloud stromen, kunt u uw Event Hubs-exemplaar bekijken in Azure Portal. Mogelijk moet u enkele minuten wachten totdat de gegevensstroom is gestart en voordat berichten naar de Event Hub worden verzonden.

De Bicep-configuratie die u eerder hebt toegepast, heeft een Event Hubs-naamruimte en -hub gemaakt die wordt gebruikt als bestemming door de gegevensstroom. Als u de naamruimte en hub wilt weergeven, gaat u naar de resourcegroep in Azure Portal die uw IoT Operations-exemplaar bevat en selecteert u vervolgens de Event Hubs-naamruimte.

Als berichten naar het exemplaar stromen, ziet u het aantal binnenkomende berichten op de pagina Overzicht van het exemplaar:

Schermopname van de overzichtspagina van het Event Hubs-exemplaar met binnenkomende berichten.

Als berichten stromen, kunt u Data Explorer gebruiken om de berichten weer te geven:

Schermopname van de pagina **Data Explorer** van het Event Hubs-exemplaar.

Tip

Mogelijk moet u uzelf toewijzen aan de azure Event Hubs-gegevensontvangerrol voor de Event Hubs-naamruimte om de berichten weer te geven.

Hoe hebben we het probleem opgelost?

In deze quickstart hebt u een bicep-bestand gebruikt om uw Azure IoT Operations-exemplaar te configureren met een asseteindpunt, asset en gegevensstroom. De configuratie verwerkt en routeert gegevens van een gesimuleerde oven. De gegevensstroom in de configuratie stuurt de berichten naar een Azure Event Hubs-exemplaar.

Resources opschonen

Als u doorgaat met de volgende quickstart, houdt u al uw resources bij.

Als u de Implementatie van Azure IoT Operations wilt verwijderen, maar uw cluster wilt behouden, gebruikt u de opdracht az iot ops delete :

az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Als u alle resources wilt verwijderen die u voor deze quickstart hebt gemaakt, verwijdert u het Kubernetes-cluster waarin u Azure IoT Operations hebt geïmplementeerd en verwijdert u vervolgens de Azure-resourcegroep die het cluster bevat.

Als u Codespaces voor deze quickstarts hebt gebruikt, verwijdert u uw Codespace uit GitHub.

Volgende stap

Als u wilt weten hoe u een Microsoft Fabric-dashboard bouwt om inzichten te krijgen uit uw ovengegevens, raadpleegt u Zelfstudie: Inzichten verkrijgen uit uw verwerkte gegevens.