共用方式為


使用 Akri 探索 ONVIF 相機

Akri 是 Kubernetes 資源介面,可讓您輕鬆地公開異質分葉裝置 (,例如 IP 相機和 USB 裝置) 作為 Kubernetes 叢集中的資源,並持續偵測可存取這些裝置的節點,以根據這些裝置排程工作負載。 Akri 是一個針對邊緣建立的一個特定沙箱專案,可處理分葉裝置的動態外觀和分葉設備。 它目前支援 OPC UA、ONVIF 和 udev 通訊協定,但您也可以實作範本所提供的自訂通訊協定處理常式。 在這裡深入瞭解 Akri

本文說明如何探索連線到與 AKS Edge Essentials 叢集相同網路的 ONVIF 相機。 ONVIF 是 IP 安全性裝置的開放業界標準,通常用於視訊監視。 在這裡深入瞭解 ONVIF 設定檔。 此示範可協助您開始使用 Akri 透過 ONVIF 通訊協定探索 IP 相機,並透過影片代理程式使用這些攝影機,讓您從相機取用影片,並將其顯示在 Web 應用程式中。

顯示 Akri ONVIF 示範流程的圖表。

必要條件

  • 如果您使用實際的 ONVIF IP 相機,則 AKS Edge Essentials 的單一 電腦部署完整部署 會啟動並執行 (,您必須使用外部交換器建立完整部署) 。
  • Akri 僅適用于 Linux:使用此練習的 Linux 節點。
  • 連線到與外部交換器叢集相同網路的 ONVIF IP 相機,或執行 (部署步驟的模擬 ONVIF 容器,如下所示) 。

注意

此範例 ONVIF 訊息代理程式目前不支援連線到需要驗證的相機。 若要執行此示範,請在 ONVIF 相機上停用驗證。

模擬 ONVIF 容器

如果您沒有 ONVIF IP 相機,您可以使用我們的模擬 ONVIF 容器進行此練習。 模擬容器適用于單一電腦或完整部署。

  1. (選擇性) 如果您想要為 ONVIF 容器設定自訂 RTSP 視訊摘要,請儲存 您的 mp4 視訊 (如果品質是 SD 而非 HD) ,並使用下列命令將檔案從主機電腦目錄複寫到 Linux 節點, (請務必取代主機電腦目錄和適當的視訊檔案名) :

    Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
    
  2. 開啟空的 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
    
  3. 套用 YAML,並確定 Pod 正在執行:

    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 Pod 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 圖表,請更新存放庫以取得最新的組建:

    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 叢集探索您的相機,請開啟 WS-Discovery (Web 服務動態探索) 的埠,這是透過 TCP 和 UDP 埠 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 實例:

    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. 請確定您的所有 Pod 都已啟動並執行:

    顯示 Akri Pod 和影片應用程式 Pod 正在執行的螢幕擷取畫面。

  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 概觀