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 アプリケーションに表示できるビデオ ブローカーを介して使用するのに役立ちます。
前提条件
- AKS Edge Essentials の 単一マシン デプロイまたは 完全デプロイ (実際の ONVIF IP カメラを使用している場合は、外部スイッチを使用して完全なデプロイを作成する必要があります)。
- Akri は Linux でのみ機能します。この演習では Linux ノードを使用します。
- 外部スイッチ クラスターと同じネットワークに接続されている ONVIF IP カメラ、または実行されているモック ONVIF コンテナー (デプロイ手順は次のとおりです)。
Note
このサンプル ONVIF ブローカーでは、現在、認証を必要とするカメラへの接続はサポートされていません。 このデモを実行するには、ONVIF カメラで認証を無効にします。
ONVIF コンテナーをモックする
ONVIF IP カメラがない場合は、この演習にモック ONVIF コンテナーを使用できます。 モック コンテナーは、1 台のマシンまたは完全なデプロイの両方で動作します。
(省略可能)ONVIF コンテナー用にカスタム RTSP ビデオ フィードを設定する場合は、 mp4 ビデオを保存し (HD ではなく SD の場合は最適です)、次のコマンドを使用してホスト マシン ディレクトリから Linux ノードにファイルをコピーします (ホスト マシン ディレクトリと適切なビデオ ファイル名を必ず置き換えてください)。
Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
空の 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
YAML を適用し、ポッドが実行されていることを確認します。
kubectl apply -f onvif-mock.yaml kubectl get pods
このモック ONVIF カメラの IP 規則を検出できるようにするには、次のようにします。
CNI が Flannel の場合:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
CNI が Calico の場合:
モック ONVIF コンテナーの IP を見つけます。
kubectl get pods -o wide
ONVIF ポッドの IP (つまり) に一致するネットワーク インターフェイス名を見つけます。
cali909b8c65537
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "route"
次に、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 を実行する
Akri Helm グラフをまだ追加していない場合は、追加します。
helm repo add akri-helm-charts https://project-akri.github.io/akri/
Akri Helm Chart を既に追加している場合は、最新のビルド用にリポジトリを更新します。
helm repo update
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'
WS-Discovery ポートを開く
AKS Edge Essentials クラスターでカメラを検出するには、TCP ポートと UDP ポート を介して動作するマルチキャスト検出プロトコルである WS-Discovery (Web サービス動的検出) のポート 3702
を開きます。
次のコマンドを実行して 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"
Akri がカメラを検出できることを確認します。 ONVIF カメラ用の Akri インスタンスが 1 つ表示されます。
kubectl get akrii
ビデオ ストリーミング Web アプリケーションをデプロイする
空の 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
ファイルを akri-video-streaming-app.yaml として保存します。
PowerShell ウィンドウで、ディレクトリを akri-video-straming-app.yaml ファイルの場所に変更し、クラスターにデプロイします。
kubectl apply -f akri-video-streaming-app.yaml
すべてのポッドが稼働していることを確認します。
Linux ノード IP と Web アプリ サービスのポートを見つけます。
Get-AksEdgeNodeAddr
kubectl get svc
これで、Web アプリケーション
<NODE IP>:<PORT OF SERVICE>
() に移動してビデオの映像を表示できるようになりました。
クリーンアップ
ビデオ ストリーミング Web アプリケーションを削除します。
kubectl delete -f akri-video-streaming-app.yaml
クラスターから Akri をアンインストールします。
helm delete akri
(省略可能)モック ONVIF カメラを使用した場合は、デプロイを削除します。
kubectl delete -f onvif-mock.yaml