Akri で ONVIF カメラを検出する

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

この記事では、AKS Edge Essentials クラスターと同じネットワークに接続されている ONVIF カメラを検出する方法について説明します。 ONVIF は、IP セキュリティ デバイスのオープンな業界標準であり、ビデオ監視でよく使用されます。 ONVIF プロファイルの詳細については、こちらを参照してください。 このデモは、Akri を使用して ONVIF プロトコルを介して IP カメラを検出し、カメラからの映像を使用して Web アプリケーションに表示できるビデオ ブローカーを介して使用するのに役立ちます。

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

前提条件

  • AKS Edge Essentials の 単一マシン デプロイまたは 完全デプロイ (実際の ONVIF IP カメラを使用している場合は、外部スイッチを使用して完全なデプロイを作成する必要があります)。
  • Akri は Linux でのみ機能します。この演習では Linux ノードを使用します。
  • 外部スイッチ クラスターと同じネットワークに接続されている ONVIF IP カメラ、または実行されているモック ONVIF コンテナー (デプロイ手順は次のとおりです)。

Note

このサンプル ONVIF ブローカーでは、現在、認証を必要とするカメラへの接続はサポートされていません。 このデモを実行するには、ONVIF カメラで認証を無効にします。

ONVIF コンテナーをモックする

ONVIF IP カメラがない場合は、この演習にモック ONVIF コンテナーを使用できます。 モック コンテナーは、1 台のマシンまたは完全なデプロイの両方で動作します。

  1. (省略可能)ONVIF コンテナー用にカスタム RTSP ビデオ フィードを設定する場合は、 mp4 ビデオを保存し (HD ではなく SD の場合は最適です)、次のコマンドを使用してホスト マシン ディレクトリから Linux ノードにファイルをコピーします (ホスト マシン ディレクトリと適切なビデオ ファイル名を必ず置き換えてください)。

    Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
    
  2. 空の YAML ファイルを開き、次の内容をコピー/貼り付けます。 の後 /mnt/ の値を、 の下のビデオ ファイル名 MP4FILEに置き換えてください。 ファイルを onvif-mock.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: onvif-camera-mocking
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: onvif-camera-mocking
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
      minReadySeconds: 5    
      template:
        metadata:
          labels:
            app: onvif-camera-mocking
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: azure-vote-front
            image: winiotsaleskit.azurecr.io/onvif-camera-mocking:latest
            ports:
            - containerPort: 8554
            - containerPort: 1000
            - containerPort: 3702
            env:
            - name: INTERFACE
              value: "eth0"
            - name: DIRECTORY
              value: "/onvif-camera-mock"
            - name: MP4FILE
              value: /mnt/sample.mp4 
            volumeMounts:
            - name: sample-volume
              mountPath: /mnt
          volumes:
          - name: sample-volume
            hostPath:
              path: /home/aksedge-user
              type: Directory
    
  3. YAML を適用し、ポッドが実行されていることを確認します。

    kubectl apply -f onvif-mock.yaml
    kubectl get pods
    
  4. このモック ONVIF カメラの IP 規則を検出できるようにするには、次のようにします。

    • CNI が Flannel の場合:

      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
      
    • CNI が Calico の場合:

      1. モック ONVIF コンテナーの IP を見つけます。

        kubectl get pods -o wide
        
      2. ONVIF ポッドの IP (つまり) に一致するネットワーク インターフェイス名を見つけます。 cali909b8c65537

        Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "route"
        
      3. 次に、ONVIF 検出を有効にします。

        Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev <insert interface name>"
        
    • さらに、外部スイッチを使用して完全デプロイを実行している場合は、 を有効に dport 3702 して、IP テーブルを保存します。

      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo iptables -A INPUT -p udp --dport 3702 -j ACCEPT"
      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo sed -i '/-A OUTPUT -j ACCEPT/i-A INPUT -p udp -m udp --dport 3702 -j ACCEPT' /etc/systemd/scripts/ip4save"
      

これで、Akri を実行し、モック ONVIF カメラを検出する準備ができました。

Akri を実行する

  1. Akri Helm グラフをまだ追加していない場合は、追加します。

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

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

    helm repo update
    
  2. Helm を使用して Akri をインストールします。 Akri をインストールするときに、Helm 値 onvif.discovery.enabled=trueを設定して ONVIF 検出ハンドラーをデプロイするように指定します。 また、ONVIF ビデオ ブローカーをデプロイするように指定します。

    helm install akri akri-helm-charts/akri `
     --set onvif.discovery.enabled=true `
     --set onvif.configuration.enabled=true `
     --set onvif.configuration.capacity=2 `
     --set onvif.configuration.brokerPod.image.repository='ghcr.io/project-akri/akri/onvif-video-broker' `
     --set onvif.configuration.brokerPod.image.tag='latest'
    

    ONVIF 構成設定の詳細については、こちらを参照してください

WS-Discovery ポートを開く

AKS Edge Essentials クラスターでカメラを検出するには、TCP ポートと UDP ポート を介して動作するマルチキャスト検出プロトコルである WS-Discovery (Web サービス動的検出) のポート 3702を開きます。

  1. 次のコマンドを実行して Linux ノード内を開 sport 3702 き、IP テーブルを保存します。

    Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo iptables -A INPUT -p udp --sport 3702 -j ACCEPT"
    Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo sed -i '/-A OUTPUT -j ACCEPT/i-A INPUT -p udp -m udp --sport 3702 -j ACCEPT' /etc/systemd/scripts/ip4save"
    
  2. Akri がカメラを検出できることを確認します。 ONVIF カメラ用の Akri インスタンスが 1 つ表示されます。

    kubectl get akrii
    

    検出された ONVIF カメラの Akri インスタンスを示すスクリーンショット。

ビデオ ストリーミング Web アプリケーションをデプロイする

  1. 空の YAML ファイルを開き、次の内容をコピーしてファイルに貼り付けます。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: akri-video-streaming-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: akri-video-streaming-app
      template:
        metadata:
          labels:
            app: akri-video-streaming-app
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          serviceAccountName: akri-video-streaming-app-sa
          containers:
          - name: akri-video-streaming-app
            image: ghcr.io/project-akri/akri/video-streaming-app:latest-dev
            imagePullPolicy: Always
            env:
            - name: CONFIGURATION_NAME
              value: akri-onvif
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: akri-video-streaming-app
      namespace: default
      labels:
        app: akri-video-streaming-app
    spec:
      selector:
        app: akri-video-streaming-app
      ports:
      - name: http
        port: 80
        targetPort: 5000
      type: NodePort
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: akri-video-streaming-app-sa
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: akri-video-streaming-app-role
    rules:
    - apiGroups: [""]
      resources: ["services"]
      verbs: ["list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: akri-video-streaming-app-binding
    roleRef:
      apiGroup: ""
      kind: ClusterRole
      name: akri-video-streaming-app-role
    subjects:
      - kind: ServiceAccount
        name: akri-video-streaming-app-sa
        namespace: default
    
  2. ファイルを akri-video-streaming-app.yaml として保存します。

  3. PowerShell ウィンドウで、ディレクトリを akri-video-straming-app.yaml ファイルの場所に変更し、クラスターにデプロイします。

    kubectl apply -f akri-video-streaming-app.yaml
    
  4. すべてのポッドが稼働していることを確認します。

    Akri ポッドとビデオ アプリ ポッドが実行されていることを示すスクリーンショット。

  5. Linux ノード IP と Web アプリ サービスのポートを見つけます。

    Get-AksEdgeNodeAddr
    
    kubectl get svc
    

    Web アプリ サービスのノード アドレスとポートを示すスクリーンショット。

  6. これで、Web アプリケーション <NODE IP>:<PORT OF SERVICE>() に移動してビデオの映像を表示できるようになりました。

    Web アプリケーションに表示されている IP カメラからのライブストリーム映像を示すスクリーンショット。

クリーンアップ

  1. ビデオ ストリーミング Web アプリケーションを削除します。

    kubectl delete -f akri-video-streaming-app.yaml
    
  2. クラスターから Akri をアンインストールします。

    helm delete akri
    
  3. (省略可能)モック ONVIF カメラを使用した場合は、デプロイを削除します。

    kubectl delete -f onvif-mock.yaml
    

次の手順

AKS Edge Essentials の概要