使用 Akri 探索 OPC UA 伺服器
Akri 是 Kubernetes 資源介面,可讓您輕鬆地公開異質分葉裝置, (例如 IP 相機和 USB 裝置,) 作為 Kubernetes 叢集中的資源。 Akri 會持續偵測可存取這些裝置的節點,以根據其排程工作負載。 Akri 是一個針對邊緣建立的一個特定沙箱專案,可處理分葉裝置的動態外觀和分葉設備。 它目前支援 OPC UA、ONVIF 和 udev 通訊協定,但您也可以實作範本所提供的自訂通訊協定處理常式。 在這裡深入瞭解 Akri。
本文說明如何在 Azure 中部署範例 OPC LINUX 伺服器容器,並在 AKS Edge Essentials 叢集上部署 Akri 來探索這些容器。 OPC UA 是產業自動化的通訊協定。 這是安全性與通訊架構隨附的用戶端/伺服器技術。 如果示範中的任何時間點,您想要深入瞭解 OPC UA 或厘清字詞,請參閱 線上 OPC UA 規格。
此示範可協助您開始使用 Akri 來探索 OPC UA 伺服器,並透過包含 OPC UA 用戶端的訊息代理程式使用這些伺服器。 具體而言,已為此案例建立名為 OPC UA 監視 的 Akri 組態。 此設定示範如何使用 Akri 來偵測特定 OPC UA 變數的異常值。 若要這樣做,訊息代理程式中的 OPC UA 用戶端會訂閱該變數,並透過 gRPC 提供其值,讓異常偵測 Web 應用程式取用。 您可以使用此設定來監視條形計、CO 偵測器等等。 不過,在此範例中,OPC UA 變數代表控溫器溫度的 (可程式化邏輯控制器) 值。 超出 70-80 度範圍的任何值都是異常的。 此外,如果您想要使用憑證進行安全性,請跳至結尾的 區段。
必要條件
- AKS Edge Essentials 叢集啟動並執行。
- Azure 訂用帳戶和資源群組,要在其中部署 OPC SQL 伺服器。
- Akri 僅適用于 Linux:使用此練習的 Linux 節點。
建立 OPC UA 伺服器
現在,建立一些要探索的 OPC UA 才能找到的伺服器。 不要從頭開始,而是部署 OPC SQL 伺服器容器。 您可以 在這裡深入瞭解容器及其參數。 此示範會使用提供的範本,將 OPC SQL 伺服器容器實例部署至 Azure。
移至Azure IoT Edge OPC SSD 範例的讀我檔案,然後選取 [部署至 Azure]。
選取 [編輯範本 ],然後流覽至第 172 行。 將整行取代為下列程式碼,以新增部署所需 OPC SQL 伺服器的必要旗標:
"[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 SQL 伺服器。選取 [檢閱並建立],然後選取 [ 建立 ] 以在 Azure 上部署您的伺服器。
您現在已成功建立兩個 OPC UA HTTP 伺服器,每部伺服器都有一個快速的 HTTP 節點,其會產生具有下限 = 65且上限 = 85且速率為 1的不帶正負號整數。
執行 Akri
確認您的 OPC UA 伺服器正在執行,方法是檢查是否已在您的Azure 入口網站上啟動容器實例。
若要讓 Akri 正確探索伺服器,請在安裝 Akri 時指定正確的探索 URL。
探索 URL 會顯示為
opc.tcp://<FQDN>:50000/
。 若要取得 OPC VPN 伺服器的 FQDN,請流覽至 Azure 中的部署,您會看到 FQDN。 複製 FQDN 並貼到每個伺服器的探索 URL 中。如果您還沒有下列專案,請新增 Akri helm 圖表:
helm repo add akri-helm-charts https://project-akri.github.io/akri/
如果您先前已新增 Akri helm 圖表,請更新存放庫以取得最新的組建:
helm repo update
使用 Helm 安裝 Akri。 當您安裝 Akri 時,請指定您想要藉由設定 helm 值
opcua.discovery.enabled=true
來部署 OPC UA 探索處理常式。在此案例中,指定
Identifier
您想要代理程式監視的 和NamespaceIndex
。 在此情況下,這是先前建立的溫度變數,其具有Identifier
和NamespaceIndex
的FastUInt1
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 其所提供 之快速變更節點 的識別碼。在這裡深入瞭解 OPC UA 組態設定。
安裝 Akri 之後,Akri 代理程式會探索這兩部伺服器,並為每個伺服器建立實例。 觀看兩個代理程式 Pod 啟動,每個伺服器各有一個:
kubectl get pods -o wide --watch
您也可以確保 Akri 的監視 Pod 已成功連線到 OPC UA 伺服器:
kubectl logs <name of OPC UA monitoring pod>
若要檢查 Akri 的更多元素:
- 執行
kubectl get crd
,您應該會看到列出的 CRD。 - 執行
kubectl get akric
,您應該會看到akri-opcua-monitoring
。 - 如果探索到 OPC POS 伺服器並啟動 Pod,您可以藉由執行
kubectl get akrii
來查看實例,而且您可以執行kubectl get akrii akri-opcua-monitoring-<ID> -o yaml
來進一步檢查。
- 執行
將異常偵測 Web 應用程式部署為訊息代理程式的終端使用者
已為此端對端示範建立範例異常偵測 Web 應用程式。 它有一個 gRPC 存根,可呼叫訊息代理程式 gRPC 服務,並取得最新的溫度值。 然後,它會使用本機極端值因數策略來判斷此值是否為資料集的極端值。 資料集只是 CSV 檔案,其數位重複數次介於 70-80 之間;因此,此範圍以外的任何值都會被視為極端值。 Web 應用程式可作為記錄檔,其中顯示傳送值的 OPC UA 伺服器的所有溫度值和位址。 它會以紅色顯示異常值。 異常一律有 120 的值,因為函式在 OPC UA 伺服器中的設定方式 DoSimulation
。
部署異常偵測應用程式,並watch啟動應用程式的 Pod:
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 IDE 伺服器,並建立可用來驗證服務器和訊息代理程式的 Kubernetes 秘密。
建立具有安全性的 OPC UA 伺服器
移至Azure IoT Edge OPC SSD 範例的讀我檔案,然後選取 [部署至 Azure]。
選取 [編輯範本 ],然後流覽至第 172 行。 將整行取代為下列程式碼,以新增部署所需 OPC SQL 伺服器的必要旗標:
"[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 SQL 伺服器。選取 [檢閱並建立],然後選取 [ 建立 ] 以在 Azure 上部署您的伺服器。
您現在已成功建立兩個 OPC UA HTTP 伺服器,每部伺服器都有一個快速的 HTTP 節點,其會產生具有下限 = 65且上限 = 85且速率為 1的不帶正負號整數。
建立 X.509 v3 憑證
建立三個符合 OPC UA 標準的 X.509v3 憑證, (一個用於訊息代理程式,並為每個伺服器建立一個憑證) ,確保憑證包含 必要的元件,例如應用程式 URI。
憑證的需求:
- 它們應該全都由通用憑證授權單位單位 (CA) 簽署,所有憑證的簽署演算法應該是
SHA256
。 - 索引鍵大小也必須大於或等於
2048
位。 - 伺服器憑證和 AkriBroker 憑證的 DNS 應該包含 (所建立 OPC UA 伺服器容器實例的 FQDN,請移至 執行 Akri 的步驟 3,以瞭解如何取得 FQDN) 。
- OPC UA 伺服器憑證應該以憑證產生詞彙 (命名
OpcPlc
,CN=OpcPlc
) 和 Akri 訊息代理程式憑證應該命名AkriBroker
為 (CN=AkriBroker
) (CA 名稱) 沒有需求。
有許多工具可用來為 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 執行) 。從 Visual Studio 2022 建置
Opc.Ua.CertificateGenerator
方案。檢查是否已
Opc.Ua.CertificateGenerator.exe
成功在build/Debug/Opc.Ua.CertificateGenerator
目錄中建置。使用下列範例命令來建立憑證。 如需其他選項 ,請參閱 Misc-Tools :
- Self-Signed CA:
.\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
只有在您從產生器建立 CA 時,才使用 OpenSSL 建立 CA 的檔案 (,這會遺失.crl
檔案) 。
如果您選擇使用 OpenSSL,以下是參考清單:
建立 opcua-broker-credentials Kubernetes 秘密
OPC UA 用戶端憑證會以掛接為磁片區的 Kubernetes 秘密的形式傳遞至 OPC UA 監視代理程式。
建立 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
憑證會掛接至位於 /etc/opcua-certs/client-pki 的 mountPath
磁片 credentials
區,如OPC UA 設定 helm 範本所示。 此路徑是訊息代理程式預期會尋找憑證的位置。
將憑證的資料夾掛接至 ACI
請遵循這些指示 來建立 Azure 檔案共用。
建立 Azure 檔案共用和憑證之後,請如所述,將 CA 和 OPC UA 伺服器憑證上傳至檔案共用。
├── own
│ ├── certs
│ │ └── OpcPlc [hash].der
│ └── private
│ └── OpcPlc [hash].pfx
└── trusted
├── certs
│ └── CA.der
└── crl
└── CA.crl
注意
因為我們在範本中新增了安全性旗標,這會導致在檔案共用中產生任意憑證。 您可以在檔案共用中刪除任何未識別的憑證, (資料夾路徑看起來應該與上圖完全相同) 。
遵循這些步驟以取得安全性之後,請按一下容器實例上的 [重新開機 ] 以更新它,並使用掛接的憑證執行。
執行 Akri 並部署 Web 應用程式
遵循上一節來執行 Akri 並探索您的伺服器,但現在在命令結尾新增一行 --set opcua.configuration.mountCertificates='true'
。 請務必將 取代 opcua.configuration.discoveryDetails.discoveryUrls
為從 Azure 入口網站找到的 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/" `
--set opcua.configuration.mountCertificates='true'
從這裡開始,您可以遵循將異常偵測 Web 應用程式部署為訊息代理程式的取用者一節,以查看您網頁上的 OPC URL 值。
清理
刪除異常偵測應用程式:
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 入口網站中選取 [刪除]。