Sdílet prostřednictvím


Objevte kamery ONVIF s Akri

Akri je rozhraní prostředků Kubernetes, které umožňuje snadno vystavit heterogenní listová zařízení (jako jsou IP kamery a zařízení USB) jako prostředky v clusteru Kubernetes a průběžně detekuje uzly, které mají k těmto zařízením přístup, a na jejich základě plánovat úlohy. Akri je CNCF sandboxový projekt vytvořený pro hranu, který zpracovává dynamický vzhled a zmizení listových zařízení. V současné době podporuje protokoly OPC UA, ONVIF a udev, ale můžete také implementovat vlastní obslužné rutiny protokolu poskytované šablonou. Další informace o Akri najdete tady.

Tento článek popisuje, jak můžete zjistit kamery ONVIF připojené ke stejné síti jako cluster AKS Edge Essentials. ONVIF je otevřený oborový standard pro ip bezpečnostní zařízení, který se běžně používá pro video dohled. Další informace o profilech ONVIF najdete tady. Tato ukázka vám pomůže začít používat Akri ke zjišťování IP kamer prostřednictvím protokolu ONVIF a jejich použití prostřednictvím zprostředkovatele videa, který vám umožní využívat záběry z kamery a zobrazit je ve webové aplikaci.

Diagram znázorňující tok ukázky Akri ONVIF

Požadavky

  • Nasazení AKS Edge Essentials na jeden počítač nebo úplné nasazení (pokud používáte skutečnou IP kameru ONVIF, musíte vytvořit úplné nasazení s externím přepínačem).
  • Akri funguje jenom v Linuxu: v tomto cvičení použijte uzly Linuxu.
  • IP kamera ONVIF připojená ke stejné síti jako cluster externích přepínačů nebo napodobený spuštěný kontejner ONVIF (postup nasazení je následující).

Poznámka

Tento ukázkový zprostředkovatel ONVIF v současné době nepodporuje připojení ke kamerám, které vyžadují ověřování. Pokud chcete spustit tuto ukázku, zakažte ověřování u kamery ONVIF.

Napodobení kontejneru ONVIF

Pokud nemáte IP kameru ONVIF, můžete pro toto cvičení použít náš napodobení kontejneru ONVIF. Kontejner napodobení funguje na jednom počítači i v úplném nasazení.

  1. (Volitelné) Pokud chcete pro kontejner ONVIF nastavit vlastní kanál videa RTSP, uložte video mp4 (funguje nejlépe, pokud je kvalita SD místo HD) a zkopírujte soubor z adresáře hostitelského počítače do linuxového uzlu pomocí následujícího příkazu (nezapomeňte nahradit adresář hostitelského počítače a příslušný název videosouboru):

    Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
    
  2. Otevřete prázdný soubor YAML a zkopírujte nebo vložte následující obsah. Nezapomeňte nahradit hodnotu za /mnt/ názvem videosouboru v části MP4FILE. Uložte soubor jako 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. Použijte YAML a ujistěte se, že je pod spuštěný:

    kubectl apply -f onvif-mock.yaml
    kubectl get pods
    
  4. Povolení zjištění pravidel IP pro tuto napodobenou kameru ONVIF:

    • Pokud je vaše CNI Flannel:

      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
      
    • Pokud je vaše CNI Calico:

      1. Vyhledejte IP adresu kontejneru ONVIF napodobení:

        kubectl get pods -o wide
        
      2. Vyhledejte název síťového rozhraní, který odpovídá IP adrese podu ONVIF (tj. cali909b8c65537):

        Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "route"
        
      3. Teď povolte zjišťování ONVIF:

        Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev <insert interface name>"
        
    • Pokud navíc spouštíte úplné nasazení s externím přepínačem, povolte dport 3702 a uložte tabulky IP adres:

      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"
      

Teď můžete spustit Akri a objevit napodobenou kameru ONVIF.

Spuštění Akri

  1. Pokud jste to ještě neudělali, přidejte grafy Akri Helm:

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

    Pokud jste už dříve přidali chart helmu Akri, aktualizujte úložiště pro nejnovější build:

    helm repo update
    
  2. Nainstalujte Akri pomocí Helmu. Při instalaci Akri určete, že chcete nasadit obslužné rutiny zjišťování ONVIF nastavením hodnoty onvif.discovery.enabled=truehelm . Také určete, že chcete nasadit zprostředkovatele videa 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'
    

    Další informace o nastavení konfigurace ONVIF najdete tady.

Otevření portu WS-Discovery

Pokud chcete, aby cluster AKS Edge Essentials zjistil vaši kameru, otevřete port pro WS-Discovery (Dynamické zjišťování webových služeb), což je protokol vícesměrového zjišťování, který funguje přes porty 3702TCP a UDP .

  1. Spuštěním následujícího příkazu otevřete sport 3702 v linuxovém uzlu a uložte tabulky IP adres:

    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. Ověřte, že Akri teď může objevit vaši kameru. Měli byste vidět jednu instanci Akri pro kameru ONVIF:

    kubectl get akrii
    

    Snímek obrazovky znázorňující instanci Akri pro zjištěnou kameru ONVIF

Nasazení webové aplikace pro streamování videa

  1. Otevřete prázdný soubor YAML a zkopírujte nebo vložte do něj následující obsah:

    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. Uložte soubor jako akri-video-streaming-app.yaml.

  3. V okně PowerShellu změňte adresář na umístění souboru akri-video-straming-app.yaml a nasaďte ho do clusteru:

    kubectl apply -f akri-video-streaming-app.yaml
    
  4. Ujistěte se, že jsou všechny pody v provozu:

    Snímek obrazovky se spuštěnými pody Akri a pody video aplikací

  5. Vyhledejte IP adresu linuxového uzlu a port služby webové aplikace:

    Get-AksEdgeNodeAddr
    
    kubectl get svc
    

    Snímek obrazovky s adresou uzlu a portem služby webové aplikace

  6. Teď si můžete prohlédnout videozáběr tak, že přejdete do webové aplikace, což je <NODE IP>:<PORT OF SERVICE>:

    Snímek obrazovky zobrazující živé záznamy z IP kamery, které se zobrazují ve webové aplikaci

Vyčištění

  1. Odstraňte webovou aplikaci pro streamování videa:

    kubectl delete -f akri-video-streaming-app.yaml
    
  2. Odinstalujte Akri z clusteru:

    helm delete akri
    
  3. (Volitelné) Pokud jste použili napodobenou kameru ONVIF, odstraňte nasazení:

    kubectl delete -f onvif-mock.yaml
    

Další kroky

Přehled AKS Edge Essentials