Sdílet prostřednictvím


Kurz: Přidání prostředků OPC UA do clusteru Azure IoT Operations

V tomto kurzu ručně přidáte prostředky OPC UA do clusteru Azure IoT Operations. Tyto prostředky publikují zprávy do zprostředkovatele MQTT ve vašem clusteru Azure IoT Operations. Tento postup obvykle provede uživatel OT.

Prostředek je fyzické zařízení nebo logická entita, která představuje zařízení, počítač, systém nebo proces. Například fyzické aktivum může být pumpa, motor, nádrž nebo výrobní linka. Logický prostředek, který definujete, může mít vlastnosti, streamovat telemetrii nebo generovat události.

Servery OPC UA jsou softwarové aplikace, které komunikují s prostředky. Značky OPC UA jsou datové body, které servery OPC UA zveřejňují. Značky OPC UA můžou poskytovat historická data o stavu, výkonu, kvalitě nebo stavu prostředků v reálném čase.

V tomto kurzu použijete webové uživatelské rozhraní provozního prostředí k vytvoření prostředků. Některé z těchto úloh můžete provést také pomocí Azure CLI.

Požadavky

Instance operací Azure IoT nasazených v clusteru Kubernetes K vytvoření instance použijte jednu z následujících možností k nasazení operací Azure IoT:

Pokud se chcete přihlásit k webovému uživatelskému rozhraní provozního prostředí, potřebujete účet Microsoft Entra ID s alespoň oprávněními přispěvatele pro skupinu prostředků, která obsahuje vaši instanci Kubernetes – Azure Arc . Další informace najdete ve webovém uživatelském rozhraní provozního prostředí.

Pokud není uvedeno jinak, můžete příkazy konzoly spustit v tomto kurzu v prostředí Bash nebo PowerShellu.

Jaký problém vyřešíme?

Data, která servery OPC UA zpřístupňují, můžou mít složitou strukturu a mohou být obtížně pochopitelné. Operace Azure IoT poskytují způsob, jak modelovat prostředky OPC UA jako značky, události a vlastnosti. Toto modelování usnadňuje pochopení dat a jejich použití v podřízených procesech, jako je zprostředkovatel MQTT a toky dat.

Nasazení simulátoru OPC PLC

Tento kurz používá simulátor OPC PLC k vygenerování ukázkových dat. Pokud chcete nasadit simulátor OPC PLC, spusťte následující příkaz:

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

Následující fragment kódu ukazuje použitý soubor YAML:

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

Upozornění

Tato konfigurace není zabezpečená. Tuto konfiguraci nepoužívejte v produkčním prostředí.

Přihlášení k provoznímu prostředí

Pokud chcete vytvářet koncové body prostředků, prostředky a přihlásit se k odběru značek a událostí OPC UA, použijte provozní prostředí.

Přejděte do provozního prostředí v prohlížeči a přihlaste se pomocí přihlašovacích údajů Microsoft Entra ID.

Vyberte svůj web.

Web je kolekce instancí operací Azure IoT. Weby obvykle seskupují instance podle fyzického umístění a usnadňují uživatelům OT vyhledání a správu prostředků. Správce IT vytvoří weby a přiřadí jim instance provozu Azure IoT. Vzhledem k tomu, že pracujete s novým nasazením, ještě neexistují žádné weby. Cluster, který jste vytvořili v předchozím příkladu, najdete tak, že vyberete Zobrazit nepřiřazené instance. V provozním prostředí představuje instance cluster, ve kterém jste nasadili operace Azure IoT.

Snímek obrazovky znázorňující uzel nepřiřazených instancí v provozním prostředí

Vyberte instanci.

Vyberte instanci, ve které jste nasadili operace Azure IoT v předchozím kurzu:

Snímek obrazovky se seznamem instancí operací Azure IoT

Tip

Pokud nevidíte žádné instance, možná nejste ve správném tenantovi Microsoft Entra ID. Tenanta můžete změnit z pravé horní nabídky v provozním prostředí.

Přidání koncového bodu prostředku

Při nasazení operací Azure IoT v předchozím článku jste zahrnuli integrovaný simulátor OPC PLC. V tomto kroku přidáte koncový bod prostředku, který vám umožní připojit se k simulátoru OPC PLC.

Přidání koncového bodu prostředku:

  1. Vyberte koncové body assetu a pak vytvořte koncový bod prostředku:

    Snímek obrazovky znázorňující stránku koncových bodů prostředku v provozním prostředí

  2. Zadejte následující informace o koncovém bodu:

    Pole Hodnota
    Název koncového bodu prostředku opc-ua-connector-0
    Adresa URL serveru OPC UA opc.tcp://opcplc-000000:50000
    Režim ověřování uživatelů Anonymous
  3. Pokud chcete definici uložit, vyberte Vytvořit.

    Tato konfigurace nasadí do clusteru nový koncový bod prostředku volaný opc-ua-connector-0 . Můžete použít kubectl k zobrazení koncových bodů prostředku:

    kubectl get assetendpointprofile -n azure-iot-operations
    

Správa vašich prostředků

Po výběru instance v provozním prostředí se na stránce Prostředky zobrazí dostupný seznam prostředků. Pokud ještě žádné prostředky neexistují, je tento seznam prázdný:

Snímek obrazovky se seznamem prázdných prostředků operací Azure IoT

Vytvoření majetku

Pokud chcete vytvořit prostředek, vyberte Vytvořit prostředek. Pak zadejte následující informace o aktivech:

Pole Hodnota
Koncový bod prostředku opc-ua-connector-0
Název prostředku thermostat
Popis A simulated thermostat asset
Výchozí téma MQTT azure-iot-operations/data/thermostat

Odeberte existující vlastní vlastnosti a přidejte následující vlastní vlastnosti. Buďte opatrní, abyste použili přesné názvy vlastností, protože šablona Power BI v pozdějším kurzu se na ně dotazuje:

Název vlastnosti Podrobnosti o vlastnosti
batch 102
Zákazník Contoso
vybavení Kotel
isSpare true
location Seattle

Snímek obrazovky se stránkou podrobností o prostředku azure IoT Operations

Výběrem možnosti Další přejděte na stránku Přidat značky .

Vytvoření značek OPC UA

Přidejte dvě značky OPC UA na stránce Přidat značky . Pokud chcete přidat každou značku, vyberte Přidat značku nebo CSV a pak vyberte Přidat značku. Zadejte podrobnosti o značce uvedené v následující tabulce:

ID uzlu Název značky Režim pozorovatelnosti
ns=3; s=FastUInt10 Teplota Nic
ns=3; s=FastUInt100 Značka 10 Nic

Režim pozorovatelnosti je jedna z následujících hodnot: None, Gauge, Counter, Histogram, nebo Log.

Můžete vybrat Možnost Spravovat výchozí nastavení a změnit výchozí interval vzorkování a velikost fronty pro každou značku.

Snímek obrazovky se stránkou přidání značky operací Azure IoT

Výběrem možnosti Další přejdete na stránku Přidat události a pak přejdete na stránku Revize.

Přehled

Než vyberete Vytvořit, zkontrolujte podrobnosti o prostředku a značkách a proveďte potřebné úpravy:

Snímek obrazovky se stránkou pro kontrolu prostředku operace Azure IoT

Tato konfigurace nasadí do clusteru nový prostředek.thermostat K zobrazení prostředků můžete použít kubectl :

kubectl get assets -n azure-iot-operations

Zobrazení prostředků na webu Azure Portal

Pokud chcete zobrazit koncový bod prostředku a prostředek, který jste vytvořili na webu Azure Portal, přejděte do skupiny prostředků, která obsahuje vaši instanci Azure IoT Operations. Asset termostatu můžete zobrazit ve skupině prostředků Azure IoT Operations . Pokud vyberete Možnost Zobrazit skryté typy, zobrazí se také koncový bod prostředku:

Snímek obrazovky webu Azure Portal znázorňující skupinu prostředků Azure IoT Operations včetně prostředku a koncového bodu prostředku

Portál umožňuje zobrazit podrobnosti o prostředku. Další podrobnosti získáte výběrem zobrazení JSON:

Snímek obrazovky s podrobnostmi o prostředku provozu Azure IoT na webu Azure Portal

Ověření toku dat

Pomocí nástroje mosquitto_sub ověřte, že data proudí do zprostředkovatele MQTT. V tomto příkladu spustíte nástroj mosquitto_sub v clusteru Kubernetes:

  1. Spuštěním následujícího příkazu nasaďte pod, který obsahuje mosquitto_pub a mosquitto_sub nástroje, které jsou užitečné pro interakci s zprostředkovatelem MQTT v clusteru:

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

    Následující fragment kódu ukazuje použitý soubor YAML:

    # 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
    

    Upozornění

    Tato konfigurace není zabezpečená. Tuto konfiguraci nepoužívejte v produkčním prostředí.

  2. Když je pod mqtt-client spuštěný, spuštěním následujícího příkazu vytvořte prostředí v podu, který jste vytvořili:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. V prostředí Bash v podu mqtt-client spusťte následující příkaz pro připojení k zprostředkovateli MQTT pomocí nástroje mosquitto_sub přihlášeného k odběru data/thermostat tématu:

    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)
    

    Tento příkaz bude dál spouštět a zobrazovat zprávy při jejich doručení do data/thermostat tématu, dokud ho nezastavíte stisknutím ctrl+C . Pokud chcete prostředí opustit, zadejte exit.

Pokud chcete ověřit, že přidaný termostatický prostředek publikuje data, podívejte se na telemetrii v azure-iot-operations/data tématu:

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

Pokud tok dat neexistuje, restartujte pod aio-opc-opc.tcp-1 :

  1. Pomocí následujícího příkazu najděte název podu aio-opc-opc.tcp-1 :

    kubectl get pods -n azure-iot-operations
    

    Název podu vypadá takto aio-opc-opc.tcp-1-849dd78866-vhmz6.

  2. aio-opc-opc.tcp-1 Restartujte pod pomocí příkazu, který vypadá jako v následujícím příkladu. Použijte název podu aio-opc-opc.tcp-1 z předchozího kroku:

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

Ukázkové značky, které jste přidali v předchozím kurzu, generují zprávy z vašeho prostředku, které vypadají jako v následujícím příkladu:

{
    "temperature": {
        "SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
        "Value": 2696
    },
    "Tag 10": {
        "SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
        "Value": 2696
    }
}

Jak jsme tento problém vyřešili?

V tomto kurzu jste přidali koncový bod assetu a pak definovali prostředek a značky. Prostředky a značky modelují data ze serveru OPC UA, aby se data snadněji používala ve zprostředkovateli MQTT a dalších podřízených procesech. Použijete termostatický prostředek, který jste definovali v dalším kurzu.

Vyčištění prostředků

Pokud budete pokračovat k dalšímu kurzu, ponechte všechny prostředky.

Pokud chcete odebrat nasazení operací Azure IoT, ale zachovat cluster, použijte příkaz az iot ops delete :

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

Pokud chcete odstranit všechny prostředky, které jste vytvořili pro účely tohoto rychlého startu, odstraňte cluster Kubernetes, ve kterém jste nasadili operace Azure IoT, a pak odeberte skupinu prostředků Azure, která obsahovala cluster.

Pokud jste pro tyto rychlé starty použili Codespaces, odstraňte codespace z GitHubu.

Další krok

Kurz: Odesílání telemetrických dat do cloudu pomocí toku dat