Обнаружение серверов OPC UA с помощью Akri
Akri — это интерфейс ресурсов Kubernetes, который позволяет легко предоставлять разнородные конечные устройства (например, IP-камеры и USB-устройства) в качестве ресурсов в кластере Kubernetes. Akri постоянно обнаруживает узлы, имеющие доступ к этим устройствам, для планирования рабочих нагрузок на их основе. Akri — это проект песочницы CNCF, сделанный для ребра, обрабатывающий динамический внешний вид и исчезновение конечных устройств. В настоящее время она поддерживает протоколы OPC UA, ONVIF и udev, но вы также можете реализовать пользовательские обработчики протоколов, предоставляемые шаблоном. Дополнительные сведения об Акри см. здесь.
В этой статье описывается, как развернуть примеры контейнеров серверов OPC PLC в Azure и обнаружить их, развернув Akri в кластере AKS Edge Essentials. OPC UA — это протокол связи для промышленной автоматизации. Это клиент-серверная технология, которая поставляется с платформой безопасности и коммуникации. Если в какой-либо момент демонстрации вы хотите углубиться в OPC UA или уточнить термин, ознакомьтесь со спецификациями OPC UA в Интернете.
Эта демонстрация поможет вам приступить к работе с Akri для обнаружения серверов OPC UA и использования их через брокер, содержащий клиент OPC UA. В частности, для этого сценария была создана конфигурация Akri с именем OPC UA Monitoring . В этой конфигурации показано, как использовать Akri для обнаружения значений аномалий определенной переменной OPC UA. Для этого клиенты OPC UA в брокерах подписываются на переменную и передают ее значение более gRPC для использования веб-приложением обнаружения аномалий. Эту конфигурацию можно использовать для мониторинга барометра, детектора CO и многого другого. Однако в этом примере переменная OPC UA представляет значения PLC (программируемый логический контроллер) для температуры термостата. Любое значение за пределами диапазона 70–80 градусов является аномалией. Кроме того, если вы хотите использовать сертификаты для обеспечения безопасности, перейдите к разделу в конце.
Предварительные требования
- Кластер AKS Edge Essentials запущен и запущен.
- Подписка Azure и группа ресурсов для развертывания серверов OPC PLC.
- Akri работает только в Linux: в этом упражнении используйте узлы Linux.
Создание серверов OPC UA
Теперь создайте несколько серверов OPC UA PLC для обнаружения. Вместо того чтобы начинать с нуля, развертывайте контейнеры серверов OPC PLC. Дополнительные сведения о контейнерах и их параметрах см. здесь. В этой демонстрации используется шаблон, предоставленный для развертывания экземпляров контейнеров сервера OPC PLC в Azure.
Перейдите к файлу сведений примера OPC PLC для Azure IoT Edge и выберите Развернуть в Azure.
Выберите Изменить шаблон и перейдите к строке 172. Замените всю строку следующим кодом, чтобы добавить необходимые флаги для развертывания нужных серверов OPC PLC:
"[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True --ut', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
Сохраните шаблон и заполните сведения о проекте и экземпляре. Для
Number of Simulations
укажите2
, чтобы запустить два сервера OPC PLC.Выберите Просмотр и создание, а затем Создать , чтобы развернуть серверы в Azure.
Теперь вы успешно создали два сервера OPC UA PLC, каждый из которых имеет один быстрый узел PLC, который создает целое число без знака с нижней границей = 65 и верхней границей = 85 со скоростью 1.
Запуск Akri
Убедитесь, что серверы OPC UA запущены, проверьте, запущены ли экземпляры контейнеров на портал Azure.
Чтобы Akri правильно обнаруживать серверы, укажите правильные URL-адреса обнаружения при установке Akri.
URL-адреса обнаружения отображаются как
opc.tcp://<FQDN>:50000/
. Чтобы получить полные доменные имена серверов OPC PLC, перейдите к развертываниям в Azure, и вы увидите полное доменное имя. Скопируйте полное доменное имя и вставьте его в URL-адреса обнаружения для каждого сервера.Добавьте диаграммы Akri Helm, если вы еще этого не сделали:
helm repo add akri-helm-charts https://project-akri.github.io/akri/
Если вы уже добавили диаграмму Akri helm ранее, обновите репозиторий для последней сборки:
helm repo update
Установите Akri с помощью Helm. При установке Akri укажите, что требуется развернуть обработчики обнаружения OPC UA, задав значение
opcua.discovery.enabled=true
helm .В этом сценарии укажите
Identifier
иNamespaceIndex
NodeID, которые должны отслеживать брокеры. В этом случае это созданная ранее переменная температуры, которая имеет значениеIdentifier
FastUInt1
иNamespaceIndex
.2
Обязательно замените
opcua.configuration.discoveryDetails.discoveryUrls
на URL-адреса, полученные на предыдущем шаге:helm install akri akri-helm-charts/akri ` --set opcua.discovery.enabled=true ` --set opcua.configuration.enabled=true ` --set opcua.configuration.name=akri-opcua-monitoring ` --set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" ` --set opcua.configuration.brokerPod.image.tag="latest-dev" ` --set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' ` --set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' ` --set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" ` --set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
Примечание
FastUInt1
— это идентификатор быстро изменяющегося узла , предоставляемый сервером OPC PLC.Дополнительные сведения о параметрах конфигурации OPC UA см. здесь.
После установки Akri агент Akri обнаруживает два сервера и создает экземпляр для каждого сервера. Наблюдайте за запуском двух модулей pod брокера, по одному для каждого сервера:
kubectl get pods -o wide --watch
Вы также можете убедиться, что модуль мониторинга Akri успешно подключен к серверу OPC UA:
kubectl logs <name of OPC UA monitoring pod>
Чтобы проверить больше элементов Akri, выполните следующие действия:
- Запустите
kubectl get crd
, и вы увидите список crDs. - Запустите
kubectl get akric
, и вы увидитеakri-opcua-monitoring
. - Если серверы OPC PLC были обнаружены и модули pod закручены, вы можете увидеть экземпляры, запустив
kubectl get akrii
, а затем выполнить дальнейшую проверку, выполнив командуkubectl get akrii akri-opcua-monitoring-<ID> -o yaml
.
- Запустите
Развертывание веб-приложения обнаружения аномалий в качестве конечного потребителя брокеров
Для этой комплексной демонстрации был создан пример веб-приложения для обнаружения аномалий. Он имеет заглушку gRPC, которая вызывает службы gRPC брокеров, получая последнее значение температуры. Затем он определяет, является ли это значение выбросом в набор данных, используя стратегию локального коэффициента выброса. Набор данных — это просто CSV-файл с числами от 70 до 80, повторяемых несколько раз; Поэтому любое значение, значительно превышающее этот диапазон, будет рассматриваться как выброс. Веб-приложение служит в качестве журнала, отображающего все значения температуры и адрес сервера OPC UA, который отправил эти значения. В нем показаны значения аномалий красным цветом. Аномалии всегда имеют значение 120 из-за DoSimulation
настройки функции на серверах OPC UA.
Разверните приложение обнаружения аномалий и watch для этого приложения.
kubectl apply -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
kubectl get pods -o wide --watch
После запуска модулей pod получите IP-адрес узла и номер порта службы приложения:
Get-AKSEdgeNodeAddr
kubectl get svc
Перейдите к
http://<NODE IP>:<SERVICE PORT NUM>/
. Загрузка сайта занимает несколько секунд, после чего вы увидите журнал значений температуры, который обновляется каждые несколько секунд. Обратите внимание, что значения поступают из двух разных URL-адресов обнаружения, в частности для каждого из двух серверов OPC UA.
Необязательно: сертификаты для сервера и брокера OPC UA
Это необязательная процедура, с помощью этой процедуры можно опробовать Akri с сертификатами для дополнительной безопасности. Выполните следующие действия, чтобы развернуть серверы OPC PLC с безопасностью и создать секрет Kubernetes, который можно использовать для проверки подлинности сервера и брокера.
Создание серверов OPC UA с безопасностью
Перейдите к файлу сведений примера OPC PLC для Azure IoT Edge и выберите Развернуть в Azure.
Выберите Изменить шаблон и перейдите к строке 172. Замените всю строку следующим кодом, чтобы добавить необходимые флаги для развертывания нужных серверов OPC PLC:
"[concat('./opcplc --pn=50000 --sph --fn=1 --fr=1 --ft=uint --ftl=65 --ftu=85 --ftr=True --aa --sph --ftl=65 --ftu=85 --ftr=True', ' --ph=', variables('aciPlc'), add(copyIndex(), 1), '.', resourceGroup().location, '.azurecontainer.io')]"
resources
В разделе добавьте следующий код в третийproperties
раздел (строка 167) (тот же уровень, чтоimage
и ,command
,ports
и т. д.):"volumeMounts": [ { "name": "filesharevolume", "mountPath": "/app/pki" } ],
Затем добавьте следующий код во второй раздел properties (строка 163) (тот же уровень, что и
containers
):"volumes": [ { "name": "filesharevolume", "azureFile": { "shareName": "acishare", "storageAccountName": "<storageAccName>", "storageAccountKey": "<storageAccKey>" } } ]
Сохраните шаблон и заполните сведения о проекте и экземпляре. Для
Number of Simulations
укажите2
, чтобы запустить два сервера OPC PLC.Выберите Просмотр и создание, а затем щелкните Создать , чтобы развернуть серверы в Azure.
Теперь вы успешно создали два сервера OPC UA PLC, каждый из которых имеет один быстрый узел PLC, который создает целое число без знака с нижней границей = 65 и верхней границей = 85 со скоростью 1.
Создание сертификатов X.509 версии 3
Создайте три сертификата X.509v3, совместимых с OPC UA (по одному для брокера и по одному для каждого сервера), гарантируя, что сертификат содержит необходимые компоненты, такие как URI приложения.
Требования к сертификатам:
- Все они должны быть подписаны общим центром сертификации (ЦС), а алгоритмы подписывания для всех сертификатов должны иметь значение
SHA256
. - Размер ключа также должен быть больше или равен битам
2048
. - DNS сертификатов сервера и AkriBroker должны содержать полное доменное имя созданного экземпляра контейнера сервера OPC UA (см. шаг 3 статьи Запуск Akri , чтобы узнать, как получить полное доменное имя).
- Сертификат сервера OPC UA должен иметь имя
OpcPlc
(в терминах создания сертификатов,CN=OpcPlc
), а сертификат брокера Akri —AkriBroker
() (CN=AkriBroker
требования к имени ЦС отсутствуют).
Существует множество средств для создания соответствующих сертификатов для OPC UA, таких как генератор сертификатов OPC Foundation или OpenSSL. Генератор сертификатов OPC Foundation может быть более удобным вариантом, тогда как OpenSSL предоставляет больше места для настройки.
Если вы решили использовать генератор сертификатов OPC Foundation, выполните следующие действия для сборки:
Установите Perl.
Скачайте файл .zip или клонируйте репозиторий генератора сертификатов OPC Foundation (Misc-Tools).
Запустите
build_certificate-generator.bat
из командной строки разработчика Visual Studio (рекомендуется Visual Studio 2022).Сборка
Opc.Ua.CertificateGenerator
решения из Visual Studio 2022.Проверьте, успешно ли
Opc.Ua.CertificateGenerator.exe
выполнена сборка в каталогеbuild/Debug/Opc.Ua.CertificateGenerator
.Используйте следующие примеры команд для создания сертификатов. Дополнительные параметры см. в разделе Misc-Tools :
- Self-Signed ЦС:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -sn CN=<CA name e.g. MyCA> -ca true -pw <password>
- Сертификат сервера OPC UA:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an OpcPlc -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
- Сертификат брокера Akri:
.\Opc.Ua.CertificateGenerator.exe -cmd issue -sp . -an AkriBroker -ikf '.\private\MyCA [hash].pfx' -ikp <password>-dn <DNS separated by commas>
Создайте
.crl
файл для ЦС с помощью OpenSSL (только если вы создали ЦС из генератора, в котором будет отсутствовать.crl
файл).
Если вы решили использовать OpenSSL, вот список ссылок:
- Проект OpenSSL
- Поваренная книга OpenSSL
- Руководство. Создание тестовых сертификатов с помощью OpenSSL
Создание секрета Kubernetes opcua-broker-credentials
Сертификат клиента OPC UA передается брокеру мониторинга OPC UA в виде секрета Kubernetes, подключенного в виде тома.
Создайте секрет Kubernetes, проецируя каждый сертификат,crl/закрытый ключ с ожидаемым именем ключа (client_certificate
, client_key
, ca_certificate
и ca_crl
). Укажите пути к файлам, чтобы они указывали на учетные данные, созданные в предыдущем разделе:
kubectl create secret generic opcua-broker-credentials `
--from-file=client_certificate=/path/to/AkriBroker/own/certs/AkriBroker\ \[<hash>\].der `
--from-file=client_key=/path/to/AkriBroker/own/private/AkriBroker\ \[<hash>\].pfx `
--from-file=ca_certificate=/path/to/ca/certs/SomeCA\ \[<hash>\].der `
--from-file=ca_crl=/path/to/ca/crl/SomeCA\ \[<hash>\].crl
Сертификат подключается к тому credentials
в mountPath
/etc/opcua-certs/client-pki, как показано в шаблоне конфигурации OPC UA helm. По этому пути брокеры должны найти сертификаты.
Подключение папки сертификатов к ACI
Следуйте этим инструкциям, чтобы создать общую папку Azure.
После создания общей папки Azure и сертификатов отправьте сертификаты сервера ЦС и OPC UA в общую папку, как описано.
├── own
│ ├── certs
│ │ └── OpcPlc [hash].der
│ └── private
│ └── OpcPlc [hash].pfx
└── trusted
├── certs
│ └── CA.der
└── crl
└── CA.crl
Примечание
Так как мы добавили флаг безопасности в шаблон, это приводит к созданию произвольного сертификата в общей папке. Вы можете удалить все неопознанные сертификаты в общей папке (пути к папкам должны выглядеть точно так же, как на предыдущей схеме).
Выполнив эти действия по обеспечению безопасности, щелкните Перезапустить в экземпляре контейнера, чтобы обновить его и запустить с подключенными сертификатами.
Запуск Akri и развертывание веб-приложения
Выполните предыдущий раздел, чтобы запустить Akri и обнаружить серверы, но теперь добавьте строку --set opcua.configuration.mountCertificates='true'
в конец команды. Обязательно замените opcua.configuration.discoveryDetails.discoveryUrls
URL-адресами, найденными из портал Azure:
helm install akri akri-helm-charts/akri `
--set opcua.discovery.enabled=true `
--set opcua.configuration.enabled=true `
--set opcua.configuration.name=akri-opcua-monitoring `
--set opcua.configuration.brokerPod.image.repository="ghcr.io/project-akri/akri/opcua-monitoring-broker" `
--set opcua.configuration.brokerPod.image.tag="latest-dev" `
--set opcua.configuration.brokerProperties.IDENTIFIER='FastUInt1' `
--set opcua.configuration.brokerProperties.NAMESPACE_INDEX='2' `
--set opcua.configuration.discoveryDetails.discoveryUrls[0]="opc.tcp://<FQDN of 1st container instance>:50000/" `
--set opcua.configuration.discoveryDetails.discoveryUrls[1]="opc.tcp://<FQDN of 2nd container instance>:50000/" `
--set opcua.configuration.mountCertificates='true'
Здесь вы можете следовать разделу о развертывании веб-приложения обнаружения аномалий в качестве конечного потребителя брокеров, чтобы просмотреть значения OPC PLC на веб-странице.
Очистка
Удалите приложение обнаружения аномалий:
kubectl delete -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
Удалите Akri из кластера.
helm delete akri
Удалите развертывание сервера OPC UA, перейдя к экземпляру контейнера, а затем выберите Удалить в портал Azure.