Akri を使用して OPC UA サーバーを検出する

Akri は Kubernetes リソース インターフェイスです。これにより、異種リーフ デバイス (IP カメラや USB デバイスなど) を Kubernetes クラスター内のリソースとして簡単に公開できます。 Akri は、それらに基づいてワークロードをスケジュールするために、これらのデバイスにアクセスできるノードを継続的に検出します。 Akri は、リーフ デバイスの動的な外観と消失を処理する、エッジ用に作成された CNCF サンドボックス プロジェクトです。 現在、OPC UA、ONVIF、udev プロトコルがサポートされていますが、テンプレートによって提供されるカスタム プロトコル ハンドラーを実装することもできます。 Akri の詳細については、こちらを参照してください

この記事では、サンプル OPC PLC サーバー コンテナーを Azure にデプロイし、AKS Edge Essentials クラスターに Akri をデプロイして検出する方法について説明します。 OPC UA は、産業用オートメーション用の通信プロトコルです。 これは、セキュリティと通信フレームワークに付属するクライアント/サーバー テクノロジです。 デモの任意の時点で、OPC UA について詳しく説明するか、用語を明確にする場合は、 オンライン OPC UA の仕様を参照してください。

このデモは、Akri を使用して OPC UA サーバーを検出し、OPC UA クライアントを含むブローカー経由でそれらを使用する際に役立ちます。 具体的には、このシナリオ用に OPC UA Monitoring と呼ばれる Akri 構成が作成されました。 この構成では、Akri を使用して特定の OPC UA 変数の異常値を検出する方法を示します。 これを行うには、ブローカー内の OPC UA クライアントがその変数をサブスクライブし、異常検出 Web アプリケーションが使用するために gRPC 上でその値を提供します。 この構成を使用して、バロメーター、CO 検出器などを監視できます。 ただし、この例では、OPC UA 変数はサーモスタットの温度の PLC (プログラマブル ロジック コントローラー) 値を表します。 70 ~ 80 度の範囲外の値は異常です。 さらに、セキュリティのために証明書を使用する場合は、最後のセクションに進んでください。

Akri OPC UA デモのフローを示す図。

前提条件

  • AKS Edge Essentials クラスターの稼働中。
  • OPC PLC サーバーをデプロイする Azure サブスクリプションとリソース グループ。
  • Akri は Linux でのみ機能します。この演習では Linux ノードを使用します。

OPC UA サーバーを作成する

次に、検出する OPC UA PLC サーバーをいくつか作成します。 最初から始める代わりに、OPC PLC サーバー コンテナーをデプロイします。 コンテナーとそのパラメーターの詳細については、こちらを参照してください。 このデモでは、提供されているテンプレートを使用して、OPC PLC サーバー コンテナー インスタンスを Azure にデプロイします。

  1. Azure IoT Edge OPC PLC サンプルの readme に移動し、[Azure にデプロイ] を選択します。

  2. [ テンプレートの編集] を選択 し、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')]"
    

    パラメーターの詳細については、readme ファイルを参照してください。

  3. テンプレートを保存し、プロジェクトとインスタンスの詳細を入力します。 では Number of Simulations、2 つの OPC PLC サーバーを実行するために を指定 2 します。

  4. [ 確認と作成] を選択し、[作成] を 選択 して、サーバーを Azure にデプロイします。

これで、2 つの OPC UA PLC サーバーが正常に作成されました。それぞれに高速 PLC ノードが 1 つあり、下限が 65上限が 85符号なし整数1 の割合で生成されます。

Akri を実行する

  1. AZURE PORTALでコンテナー インスタンスが開始されていることを確認して、OPC UA サーバーが実行されていることを確認します。

  2. Akri がサーバーを正しく検出するには、Akri のインストール時に正しい検出 URL を指定します。

    検出 URL は として opc.tcp://<FQDN>:50000/表示されます。 OPC PLC サーバーの FQDN を取得するには、Azure でのデプロイに移動すると、FQDN が表示されます。 FQDN をコピーして、各サーバーの検出 URL に貼り付けます。

    Azure portal のコンテナー インスタンス FQDN を示すスクリーンショット。

  3. まだ行っていない場合は、Akri Helm チャートを追加します。

    helm repo add akri-helm-charts https://project-akri.github.io/akri/
    

    Akri Helm Chart を既に追加している場合は、最新のビルド用にリポジトリを更新します。

    helm repo update
    
  4. Helm を使用して Akri をインストールします。 Akri をインストールするときに、Helm 値 opcua.discovery.enabled=trueを設定して OPC UA 検出ハンドラーをデプロイするように指定します。

    このシナリオでは、ブローカーがIdentifierNamespaceIndex監視する NodeID の と を指定します。 この場合、これは以前に作成された温度変数です。これは、 と の を持ちますIdentifierFastUInt12NamespaceIndex

    を前の手順で取得した URL に置き換えてください opcua.configuration.discoveryDetails.discoveryUrls

    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 構成設定の詳細については、こちらを参照してください

  5. Akri がインストールされると、Akri エージェントは 2 つのサーバーを検出し、各サーバーのインスタンスを作成します。 2 つのブローカー ポッドが起動するのを監視します。サーバーごとに 1 つ。

    kubectl get pods -o wide --watch
    

    Akri の監視ポッドが OPC UA サーバーに正常に接続されていることを確認することもできます。

    kubectl logs <name of OPC UA monitoring pod>
    

    Akri の要素をさらに調べるには、次の手順を実行します。

    • を実行 kubectl get crdすると、CRD が一覧表示されます。
    • を実行 kubectl get akricすると、 が表示 akri-opcua-monitoringされます。
    • OPC PLC サーバーが検出され、ポッドがスピンアップした場合は、 を実行してインスタンスを表示し、 を実行kubectl get akriikubectl get akrii akri-opcua-monitoring-<ID> -o yamlしてさらに検査できます。

ブローカーのエンド コンシューマーとして異常検出 Web アプリケーションをデプロイする

このエンドツーエンドのデモ用に、異常検出 Web アプリケーションのサンプルが作成されました。 ブローカーの gRPC サービスを呼び出し、最新の温度値を取得する gRPC スタブがあります。 次に、ローカル外れ値係数戦略を使用して、この値がデータセットの外れ値であるかどうかを判断します。 データセットは単に CSV ファイルであり、70 から 80 までの数値が複数回繰り返されます。したがって、この範囲外の値は外れ値と見なされます。 Web アプリケーションはログとして機能し、値を送信したすべての温度値と OPC UA サーバーのアドレスを表示します。 異常値が赤で表示されます。 OPC UA サーバーでの関数の設定方法により DoSimulation 、異常の値は常に 120 です。

  1. 異常検出アプリをデプロイし、アプリのポッドスピンアップを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
    
  2. ポッドが実行されたら、ノード IP とアプリのサービス ポート番号を取得します。

    Get-AKSEdgeNodeAddr
    
    kubectl get svc
    
  3. http://<NODE IP>:<SERVICE PORT NUM>/ に移動します。 サイトが読み込まれるのに数秒かかります。その後、数秒ごとに更新される温度値のログが表示されます。 値が 2 つの異なる検出 URL (具体的には 2 つの OPC UA サーバーのそれぞれに対応するもの) から取得される点に注意してください。

    ブラウザーの異常検出アプリを示すスクリーンショット。

省略可能: OPC UA サーバーとブローカーの証明書

これは、セキュリティを強化するために証明書を使用して Akri を試すために使用できる省略可能な手順です。 セキュリティを備えた OPC PLC サーバーを展開し、サーバーとブローカーの認証に使用できる Kubernetes シークレットを作成するには、次の手順に従います。

セキュリティを使用して OPC UA サーバーを作成する

  1. Azure IoT Edge OPC PLC サンプルの readme に移動し、[Azure にデプロイ] を選択します。

  2. [ テンプレートの編集] を選択 し、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')]"
    
  3. セクションの下でresources、3 番目propertiesの (167 行目) セクション (、commandports、などとimage同じレベル) 内に次のコードを追加します。

    "volumeMounts": [
                      {
                      "name": "filesharevolume",
                      "mountPath": "/app/pki"
                      }
                    ],
    

    次に、2 番目の "properties" (163 行目) セクション (と同じレベル) 内に次のコードを containers追加します。

    "volumes": [
                   {
                      "name": "filesharevolume",
                      "azureFile": {
                            "shareName": "acishare",
                            "storageAccountName": "<storageAccName>",
                            "storageAccountKey": "<storageAccKey>"
                      }
                   }
               ]
    
  4. テンプレートを保存し、プロジェクトとインスタンスの詳細を入力します。 では Number of Simulations、2 つの OPC PLC サーバーを実行するために を指定 2 します。

  5. [ 確認と作成] を選択し、[ 作成 ] を選択してサーバーを Azure にデプロイします。

これで、2 つの OPC UA PLC サーバーが正常に作成されました。それぞれに高速 PLC ノードが 1 つあり、下限が 65上限が 85符号なし整数1 の割合で生成されます。

X.509 v3 証明書を作成する

OPC UA 準拠の X.509v3 証明書 (ブローカー用とサーバーごとに 1 つ) を 3 つ作成し、証明書にアプリケーション URI などの 必要なコンポーネントが含まれていることを確認します。

証明書の要件:

  • これらはすべて共通の証明機関 (CA) によって署名され、すべての証明書の署名アルゴリズムは である SHA256必要があります。
  • また、キー サイズはビット以上 2048 である必要があります。
  • サーバー証明書と AkriBroker 証明書の DNS には、作成された OPC UA サーバー コンテナー インスタンスの FQDN が含まれている必要があります (FQDN を取得する方法については、「 Akri を実行 する」の手順 3 を参照してください)。
  • OPC UA サーバー証明書には (証明書生成用語で) という名前 OpcPlc を付け、 CN=OpcPlcAkri ブローカー証明書に () という名前 AkriBroker を付ける必要があります (CN=AkriBrokerCA 名の要件はありません)。

OPC Foundation の証明書ジェネレーターや OpenSSL など、OPC UA 用の適切な証明書を生成するためのツールは多数あります。 OPC Foundation の証明書ジェネレーターは、より便利なオプションですが、OpenSSL ではカスタマイズの余地が増えます。

OPC Foundation の証明書ジェネレーターを使用する場合は、次の手順に従ってビルドします。

  1. Perl をインストールします。

  2. .zip ファイルをダウンロードするか、 OPC Foundation の Certificate Generator リポジトリ (Misc-Tools) を複製します。

  3. Visual Studio 開発者コマンド プロンプトから を実行 build_certificate-generator.bat します (Visual Studio 2022 をお勧めします)。

  4. Visual Studio 2022 からソリューションをビルド Opc.Ua.CertificateGenerator します。

  5. Opc.Ua.CertificateGenerator.exeディレクトリにbuild/Debug/Opc.Ua.CertificateGenerator正常にビルドされているかどうかを確認します。

  6. 証明書を作成するには、次のコマンド例を使用します。 その他のオプションについては、「 その他のツール 」を参照してください。

    • 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>
    
  7. OpenSSL を .crl 使用して CA 用のファイルを作成します (ジェネレーターから CA を作成した場合にのみ、ファイルが .crl 見つかりません)。

OpenSSL を使用する場合は、参照の一覧を次に示します。

opcua-broker-credentials Kubernetes シークレットを作成する

OPC UA クライアント証明書は、ボリュームとしてマウントされた Kubernetes シークレットとして OPC UA 監視ブローカーに渡されます。

Kubernetes シークレットを作成し、予想されるキー名 (client_certificateclient_keyca_certificateおよび) を使用して各証明書/crl/秘密キーを投影します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

OPC UA 構成 helm テンプレートに示されているように、証明書は /etc/opcua-certs/client-pki のボリュームcredentialsmountPath にマウントされます。 このパスは、ブローカーが証明書を見つけることを期待する場所です。

証明書のフォルダーを 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' を追加します。 は、必ず、Azure portalから見つかった URL に置き換えてくださいopcua.configuration.discoveryDetails.discoveryUrls

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 PLC の値を Web ページに表示できます。

クリーンアップ

  1. 異常検出アプリケーションを削除します。

    kubectl delete -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
    
  2. クラスターから Akri をアンインストールします。

    helm delete akri
    
  3. コンテナー インスタンスに移動して OPC UA サーバーのデプロイを削除し、Azure portalで [削除] を選択します。

次の手順

AKS Edge Essentials の概要