Rychlý start: Konfigurace clusteru

Důležité

Azure IoT Operations Preview – Služba Azure Arc je aktuálně ve verzi Preview. Tento software ve verzi Preview byste neměli používat v produkčních prostředích.

Až bude dostupná obecně dostupná verze, budete muset nasadit novou instalaci operací Azure IoT. Nebudete moct upgradovat instalaci verze Preview.

Právní podmínky, které platí pro funkce Azure, které jsou ve verzi beta, verzi Preview nebo které zatím nejsou veřejně dostupné, najdete v Dodatečných podmínkách použití pro Microsoft Azure verze Preview.

V tomto rychlém startu nakonfigurujete v clusteru Azure IoT Operations Preview následující prostředky:

  • Koncový bod prostředku, který definuje připojení k simulovanému serveru OPC PLC, který simuluje troubu v pekárnu.
  • Prostředek, který představuje troubu a definuje datové body, které trouba zveřejňuje.
  • Tok dat, který manipuluje se zprávami ze simulované trouby.

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 rychlém startu pomocí souboru Bicep nakonfigurujete instanci Azure IoT Operations.

Požadavky

Máte instanci Azure IoT Operations Preview nasazenou v clusteru Kubernetes. Rychlý start: Spuštění Azure IoT Operations Preview v GitHub Codespaces s K3s poskytuje jednoduché pokyny k nasazení instance Azure IoT Operations, kterou můžete použít pro rychlé starty.

Pokud není uvedeno jinak, můžete příkazy konzoly spustit v tomto rychlém startu 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. Toky dat umožňují manipulovat s daty a směrovat je do cloudových služeb, jako je Azure Event Hubs. V tomto rychlém startu tok dat změní názvy některých polí v datové části a přidá do zpráv ID prostředku.

Nasazení simulátoru OPC PLC

V tomto rychlém startu se k vygenerování ukázkových dat používá simulátor OPC PLC. 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 používá certifikát instance aplikace podepsaný svým držitelem. Tuto konfiguraci nepoužívejte v produkčním prostředí. Další informace najdete v tématu Konfigurace infrastruktury certifikátů OPC UA pro konektor pro OPC UA.


Nastavení proměnných prostředí

Pokud používáte prostředí Codespaces, požadované proměnné prostředí jsou už nastavené a můžete tento krok přeskočit. V opačném případě v prostředí nastavte následující proměnné prostředí:

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

Konfigurace clusteru

Spuštěním následujících příkazů stáhněte a spusťte soubor Bicep, který konfiguruje vaši instanci Azure IoT Operations. Soubor Bicep:

  • Přidá koncový bod prostředku, který se připojí k simulátoru OPC PLC.
  • Přidá prostředek, který představuje troubu a definuje datové body, které trouba zveřejňuje.
  • Přidá tok dat, který manipuluje se zprávami ze simulované trouby.
  • Vytvoří instanci služby Azure Event Hubs pro příjem dat.
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

Kontrola konfigurace

Soubor Bicep nakonfiguroval následující prostředky:

  • Koncový bod prostředku, který se připojuje k simulátoru OPC PLC.
  • Prostředek, který představuje troubu a definuje datové body, které trouba zveřejňuje.
  • Dva toky dat, které zpracovávají zprávy ze simulované trouby.
  • Obor názvů služby Azure Event Hubs, který obsahuje cílové centrum pro toky dat.

Pokud chcete zobrazit koncový bod prostředku, prostředek a toky dat, přejděte do uživatelského rozhraní provozního prostředí v prohlížeči a přihlaste se pomocí přihlašovacích údajů Microsoft Entra ID. Vzhledem k tomu, že pracujete s novým nasazením, ještě neexistují žádné weby. Cluster, který jste vytvořili v předchozím rychlém startu, najdete výběrem nepřiřazených instancí. V provozním prostředí představuje instance cluster, ve kterém jste nasadili operace Azure IoT.

Snímek obrazovky s provozním prostředím zobrazující nepřiřazené instance

Koncový bod prostředku definuje připojení k simulátoru OPC PLC:

Snímek obrazovky s provozním prostředím, který zobrazuje seznam koncových bodů prostředků

Prostředek trouby definuje datové body, které trouba zveřejňuje:

Snímek obrazovky s provozním prostředím, který zobrazuje seznam prostředků

Toky dat definují, jak se zprávy ze simulované trouby zpracovávají a směrují do služby Event Hubs v cloudu:

Snímek obrazovky s provozním prostředím, který zobrazuje seznam toků dat

Následující snímek obrazovky ukazuje, jak je nakonfigurovaný tok dat pro převod teploty:

Snímek obrazovky s provozním prostředím, který ukazuje výpočet převodu teploty

Ověření toku dat do zprostředkovatele MQTT

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
    # 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ý asset trouby 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/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}}

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ý prostředek, který jste přidali dříve v tomto rychlém startu, generuje zprávy, které vypadají jako v následujícím příkladu:

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

Ověření toku dat do služby Event Hubs

Pokud chcete ověřit, že data proudí do cloudu, můžete instanci služby Event Hubs zobrazit na webu Azure Portal. Možná budete muset několik minut počkat, než se tok dat spustí, a na tok zpráv do centra událostí.

Konfigurace Bicep, kterou jste použili dříve, vytvořili obor názvů služby Event Hubs a centrum, které se používá jako cíl toku dat. Pokud chcete zobrazit obor názvů a centrum, přejděte na webu Azure Portal ke skupině prostředků, která obsahuje vaši instanci ioT Operations, a pak vyberte obor názvů služby Event Hubs.

Pokud do instance proudí zprávy, uvidíte počet příchozích zpráv na stránce Přehled instance:

Snímek obrazovky znázorňující stránku přehledu instance služby Event Hubs s příchozími zprávami

Pokud zprávy proudí, můžete k zobrazení zpráv použít Průzkumník dat:

Snímek obrazovky se stránkou Instance služby Event Hubs **Průzkumník dat**.

Tip

Abyste mohli zobrazit zprávy, budete si možná muset přiřadit roli příjemce dat služby Azure Event Hubs pro obor názvů služby Event Hubs.

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

V tomto rychlém startu jste použili soubor bicep ke konfiguraci instance operace Azure IoT s koncovým bodem prostředku, assetem a tokem dat. Konfigurace zpracovává a směruje data ze simulované trouby. Tok dat v konfiguraci směruje zprávy do instance služby Azure Event Hubs.

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

Pokud budete pokračovat k dalšímu rychlému startu, 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

Pokud chcete zjistit, jak vytvořit řídicí panel Microsoft Fabric pro získání přehledů z dat trouby, přečtěte si kurz : Získání přehledů z zpracovaných dat.