Краткое руководство. Настройка кластера
Внимание
Предварительная версия операций Интернета вещей Azure, включенная Azure Arc в настоящее время в предварительной версии. Не следует использовать это программное обеспечение предварительной версии в рабочих средах.
Вам потребуется развернуть новую установку Операций Интернета вещей Azure, когда общедоступная версия станет доступной. Вы не сможете обновить предварительную установку.
Юридические условия, применимые к функциям Azure, которые находятся в бета-версии, предварительной версии или в противном случае еще не выпущены в общедоступную версию, см . в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этом кратком руководстве описано, как настроить следующие ресурсы в кластере Azure IoT Operations Preview:
- Конечная точка актива, определяющая подключение к имитированному серверу OPC PLC, который имитирует духовку в пекарне.
- Ресурс, представляющий духовку и определяющий точки данных, предоставляемые духовкой.
- Поток данных, который управляет сообщениями из имитированной духовки.
Ресурс — это физическое устройство или логическая сущность, представляющая устройство, компьютер, систему или процесс. Например, физический ресурс может быть насосом, двигателем, танком или производственной линией. Логический ресурс, который вы определяете, может иметь свойства, потоковую телеметрию или создавать события.
Серверы OPC UA — это программные приложения, взаимодействующие с ресурсами. Теги OPC UA — это точки данных, предоставляемые серверами OPC UA. Теги OPC UA могут предоставлять данные в режиме реального времени или исторические данные о состоянии, производительности, качестве или условии активов.
В этом кратком руководстве вы используете Bicep-файл для настройки экземпляра Операций Интернета вещей Azure.
Необходимые компоненты
Экземпляр Azure IoT Operations Preview развернут в кластере Kubernetes. Краткое руководство. Запуск предварительной версии операций Интернета вещей Azure в GitHub Codespaces с K3s предоставляет простые инструкции по развертыванию экземпляра Операций Интернета вещей Azure, который можно использовать для кратких руководств.
Если иное не указано, можно запустить команды консоли в этом кратком руководстве в среде Bash или PowerShell.
Какая проблема будет решена?
Данные, предоставляемые серверами OPC UA, могут иметь сложную структуру и могут быть трудно понять. Операции Интернета вещей Azure позволяют моделировать ресурсы OPC UA в виде тегов, событий и свойств. Это моделирование упрощает понимание данных и его использование в подчиненных процессах, таких как брокер MQTT и потоки данных. Потоки данных позволяют управлять и направлять данные в облачные службы, такие как Центры событий Azure. В этом кратком руководстве поток данных изменяет имена некоторых полей полезных данных и добавляет идентификатор ресурса в сообщения.
Развертывание симулятора OPC PLC
В этом кратком руководстве используется симулятор OPC PLC для создания примеров данных. Чтобы развернуть симулятор OPC PLC, выполните следующую команду:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml
В следующем фрагменте кода показан примененный ФАЙЛ 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
Внимание
Эта конфигурация использует самозаверяющий сертификат экземпляра приложения. Не используйте эту конфигурацию в рабочей среде. Дополнительные сведения см. в статье Настройка инфраструктуры сертификатов OPC UA для соединителя для OPC UA.
Настройка переменных среды
Если вы используете среду Codespaces, необходимые переменные среды уже заданы, и вы можете пропустить этот шаг. В противном случае задайте следующие переменные среды в оболочке:
# 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>
Настройка кластера
Выполните следующие команды, чтобы скачать и запустить файл Bicep, который настраивает экземпляр Операций Интернета вещей Azure. Файл Bicep:
- Добавляет конечную точку ресурса, которая подключается к симулятору OPC PLC.
- Добавляет ресурс, представляющий духовку и определяет точки данных, предоставляемые духовкой.
- Добавляет поток данных, который управляет сообщениями из имитированной духовки.
- Создает экземпляр Центры событий Azure для получения данных.
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
Проверка конфигурации
Файл Bicep настраивает следующие ресурсы:
- Конечная точка ресурса, которая подключается к симулятору OPC PLC.
- Ресурс, представляющий духовку и определяющий точки данных, предоставляемые духовкой.
- Два потока данных, обрабатывающие сообщения из имитированной духовки.
- Пространство имен Центры событий Azure, содержащее целевой концентратор для потоков данных.
Чтобы просмотреть конечную точку ресурса, ресурс и потоки данных, перейдите к пользовательскому интерфейсу операций в браузере и войдите с помощью учетных данных идентификатора Microsoft Entra. Так как вы работаете с новым развертыванием, еще нет сайтов. Кластер, созданный в предыдущем кратком руководстве, можно найти, выбрав неподписанные экземпляры. В интерфейсе операций экземпляр представляет кластер, в котором развернуты операции Интернета вещей Azure.
Конечная точка актива определяет подключение к симулятору OPC PLC:
Ресурс духовки определяет точки данных, предоставляемые духовкой:
Потоки данных определяют, как сообщения из имитированной духовки обрабатываются и направляются в Центры событий в облаке:
На следующем сниме экрана показано, как настроен поток данных преобразования температуры:
Проверка потоков данных в брокер MQTT
Убедитесь, что данные передаются брокеру MQTT с помощью средства mosquitto_sub . В этом примере вы запустите средство mosquitto_sub в кластере Kubernetes:
Выполните следующую команду, чтобы развернуть модуль pod, включающий средства mosquitto_pub и mosquitto_sub , которые полезны для взаимодействия с брокером MQTT в кластере:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
В следующем фрагменте кода показан примененный ФАЙЛ 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
Внимание
Эта конфигурация не безопасна. Не используйте эту конфигурацию в рабочей среде.
При запуске модуля pod mqtt-client выполните следующую команду, чтобы создать среду оболочки в созданном модуле pod:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
В оболочке Bash в модуле pod mqtt-client выполните следующую команду, чтобы подключиться к брокеру MQTT с помощью средства mosquitto_sub , подписанного на
data/thermostat
раздел: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)
Эта команда продолжает выполняться и отображает сообщения по мере их поступления в
data/thermostat
раздел, пока не нажимаете клавиши CTRL+C , чтобы остановить его. Чтобы выйти из среды оболочки, введитеexit
.
Чтобы убедиться, что добавленный ресурс духовки публикует данные, просмотрите данные телеметрии в 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}}
Если поток данных отсутствует, перезапустите aio-opc-opc.tcp-1
модуль pod:
Найдите имя pod
aio-opc-opc.tcp-1
с помощью следующей команды:kubectl get pods -n azure-iot-operations
Имя модуля pod выглядит следующим образом
aio-opc-opc.tcp-1-849dd78866-vhmz6
.aio-opc-opc.tcp-1
Перезапустите pod с помощью команды, которая выглядит следующим образом.aio-opc-opc.tcp-1
Используйте имя pod из предыдущего шага:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
Пример ресурса, добавленного ранее в этом кратком руководстве, создает сообщения, которые выглядят следующим образом:
{
"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
}
}
Проверка потока данных в Центры событий
Чтобы убедиться, что данные перетекают в облако, можно просмотреть экземпляр Центров событий в портал Azure. Возможно, потребуется дождаться нескольких минут, пока поток данных начнется, а сообщения будут передаваться в концентратор событий.
Конфигурация Bicep, примененная ранее, создала пространство имен Центров событий и концентратор, который используется в качестве назначения потока данных. Чтобы просмотреть пространство имен и концентратор, перейдите к группе ресурсов в портал Azure, содержащей экземпляр операций Интернета вещей, а затем выберите пространство имен Центров событий.
Если сообщения отправляются в экземпляр, можно увидеть количество входящих сообщений на странице обзора экземпляра:
Если поток сообщений выполняется, вы можете использовать обозреватель данных для просмотра сообщений:
Совет
Возможно, вам потребуется назначить себя роли приемника данных Центры событий Azure для пространства имен Центров событий для просмотра сообщений.
Как мы решили проблему?
В этом кратком руководстве вы использовали bicep-файл для настройки экземпляра Операций Интернета вещей Azure с конечной точкой ресурса, ресурсом и потоком данных. Процессы конфигурации и маршрутизация данных из имитированной духовки. Поток данных в конфигурации направляет сообщения в экземпляр Центры событий Azure.
Очистка ресурсов
Если вы продолжаете работу со следующим кратким руководством, сохраните все ресурсы.
Если вы хотите удалить развертывание Операций Интернета вещей Azure, но сохранить кластер, используйте команду az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Если вы хотите удалить все ресурсы, созданные для этого краткого руководства, удалите кластер Kubernetes, где вы развернули операции Интернета вещей Azure, а затем удалите группу ресурсов Azure, содержащую кластер.
Если вы использовали пространства кода для этих кратких руководств, удалите пространство Codespace из GitHub.
Следующий шаг
Если вы хотите узнать, как создать панель мониторинга Microsoft Fabric для получения аналитических сведений из данных духовки, см. руководство . Получение аналитических сведений из обработанных данных.