Поделиться через


Обнаружение камер ONVIF с помощью Akri

Akri — это интерфейс ресурсов Kubernetes, который позволяет легко предоставлять разнородные конечные устройства (например, IP-камеры и USB-устройства) в качестве ресурсов в кластере Kubernetes и постоянно обнаруживает узлы, имеющие доступ к этим устройствам, для планирования рабочих нагрузок на их основе. Akri — это проект песочницы CNCF для ребра, обрабатывающий динамический внешний вид и исчезновение конечных устройств. В настоящее время она поддерживает протоколы OPC UA, ONVIF и udev, но вы также можете реализовать пользовательские обработчики протоколов, предоставляемые шаблоном. Дополнительные сведения об Akri см. здесь.

В этой статье описывается, как обнаружить камеры ONVIF, подключенные к той же сети, что и кластер AKS Edge Essentials. ONVIF — это открытый отраслевой стандарт для устройств безопасности IP, который обычно используется для видеонаблюдения. Дополнительные сведения о профилях ONVIF см. здесь. Эта демонстрация поможет вам приступить к работе с Akri для обнаружения IP-камер с помощью протокола ONVIF и использовать их через видео-брокер, который позволяет использовать кадры с камеры и отображать их в веб-приложении.

Схема, показывющая поток демонстрации Akri ONVIF.

Предварительные требования

  • Развертывание на одном компьютере или полное развертывание AKS Edge Essentials (если вы используете реальную IP-камеру ONVIF, необходимо создать полное развертывание с внешним коммутатором).
  • Akri работает только в Linux: в этом упражнении используйте узлы Linux.
  • IP-камера ONVIF, подключенная к той же сети, что и кластер внешнего коммутатора, или макет контейнера ONVIF под управлением (действия по развертыванию приведены ниже).

Примечание

Этот пример брокера ONVIF в настоящее время не поддерживает подключение к камерам, для которых требуется проверка подлинности. Чтобы запустить эту демонстрацию, отключите проверку подлинности на камере ONVIF.

Макет контейнера ONVIF

Если у вас нет IP-камеры ONVIF, вы можете использовать наш макет контейнера ONVIF для этого упражнения. Макет контейнера работает как на одном компьютере, так и на полном развертывании.

  1. (Необязательно) Если вы хотите настроить пользовательский видеопоток RTSP для контейнера ONVIF, сохраните видео mp4 (лучше всего работает, если качество — SD, а не HD) и скопируйте файл из каталога хост-компьютера в узел 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 и убедитесь, что модуль pod запущен:

    kubectl apply -f onvif-mock.yaml
    kubectl get pods
    
  4. Чтобы включить правила IP для обнаружения этой макетной камеры ONVIF, выполните указанные ниже действия.

    • Если CNI имеет значение Flannel, выполните приведенные ниже действия.

      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
      
    • Если ваш CNI — Calico:

      1. Найдите IP-адрес макетного контейнера ONVIF:

        kubectl get pods -o wide
        
      2. Найдите имя сетевого интерфейса, соответствующее IP-адресу объекта pod ONVIF (т. е. 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. Установите Akri с помощью Helm. При установке Akri укажите, что требуется развернуть обработчики обнаружения ONVIF, задав значение onvif.discovery.enabled=truehelm . Кроме того, укажите, что вы хотите развернуть видео broker 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 (динамическое обнаружение веб-служб), который представляет собой протокол многоадресного обнаружения, работающий через ПОРТ 3702TCP и UDP.

  1. Выполните следующую команду, чтобы открыть sport 3702 в узле Linux и сохранить 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 теперь может обнаружить вашу камеру. Вы должны увидеть один экземпляр Akri для камеры ONVIF:

    kubectl get akrii
    

    Снимок экрана: экземпляр Akri для обнаруженной камеры ONVIF.

Развертывание веб-приложения потоковой передачи видео

  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 запущены и работают:

    Снимок экрана, показывающий, что модули pod Akri и видео-приложение pod запущены.

  5. Найдите IP-адрес узла Linux и порт службы веб-приложений:

    Get-AksEdgeNodeAddr
    
    kubectl get svc
    

    Снимок экрана: адрес узла и порт службы веб-приложения.

  6. Теперь вы можете просмотреть видеоматериалы, перейдя к веб-приложению, то есть <NODE IP>:<PORT OF SERVICE>:

    Снимок экрана: кадры из прямой трансляции с IP-камеры, отображаемые в веб-приложении.

Очистка

  1. Удалите веб-приложение потоковой передачи видео:

    kubectl delete -f akri-video-streaming-app.yaml
    
  2. Удалите Akri из кластера:

    helm delete akri
    
  3. (Необязательно) Если вы использовали макет камеры ONVIF, удалите развертывание:

    kubectl delete -f onvif-mock.yaml
    

Дальнейшие действия

Обзор AKS Edge Essentials