使用 Akri 探索 ONVIF 相機
Akri 是 Kubernetes 資源介面,可讓您輕鬆地公開異質分葉裝置 (,例如 IP 相機和 USB 裝置) 作為 Kubernetes 叢集中的資源,並持續偵測可存取這些裝置的節點,以根據這些裝置排程工作負載。 Akri 是一個針對邊緣建立的一個特定沙箱專案,可處理分葉裝置的動態外觀和分葉設備。 它目前支援 OPC UA、ONVIF 和 udev 通訊協定,但您也可以實作範本所提供的自訂通訊協定處理常式。 在這裡深入瞭解 Akri。
本文說明如何探索連線到與 AKS Edge Essentials 叢集相同網路的 ONVIF 相機。 ONVIF 是 IP 安全性裝置的開放業界標準,通常用於視訊監視。 在這裡深入瞭解 ONVIF 設定檔。 此示範可協助您開始使用 Akri 透過 ONVIF 通訊協定探索 IP 相機,並透過影片代理程式使用這些攝影機,讓您從相機取用影片,並將其顯示在 Web 應用程式中。
必要條件
- 如果您使用實際的 ONVIF IP 相機,則 AKS Edge Essentials 的單一 電腦部署 或 完整部署 會啟動並執行 (,您必須使用外部交換器建立完整部署) 。
- Akri 僅適用于 Linux:使用此練習的 Linux 節點。
- 連線到與外部交換器叢集相同網路的 ONVIF IP 相機,或執行 (部署步驟的模擬 ONVIF 容器,如下所示) 。
注意
此範例 ONVIF 訊息代理程式目前不支援連線到需要驗證的相機。 若要執行此示範,請在 ONVIF 相機上停用驗證。
模擬 ONVIF 容器
如果您沒有 ONVIF IP 相機,您可以使用我們的模擬 ONVIF 容器進行此練習。 模擬容器適用于單一電腦或完整部署。
(選擇性) 如果您想要為 ONVIF 容器設定自訂 RTSP 視訊摘要,請儲存 您的 mp4 視訊 (如果品質是 SD 而非 HD) ,並使用下列命令將檔案從主機電腦目錄複寫到 Linux 節點, (請務必取代主機電腦目錄和適當的視訊檔案名) :
Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
開啟空的 YAML 檔案,並複製/貼上下列內容。 請務必在 底下
MP4FILE
以您的視訊檔案名取代 之後/mnt/
的值。 將檔案儲存為 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,並確定 Pod 正在執行:
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 Pod 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 圖表,請更新存放庫以取得最新的組建:
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'
在這裡深入瞭解 ONVIF 組態設定。
開啟 WS-Discovery 埠
為了讓 AKS Edge Essentials 叢集探索您的相機,請開啟 WS-Discovery (Web 服務動態探索) 的埠,這是透過 TCP 和 UDP 埠 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 實例:
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
請確定您的所有 Pod 都已啟動並執行:
尋找您的 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