Обнаружение камер ONVIF с помощью Akri
Akri — это интерфейс ресурсов Kubernetes, который позволяет легко предоставлять разнородные конечные устройства (например, IP-камеры и USB-устройства) в качестве ресурсов в кластере Kubernetes и постоянно обнаруживает узлы, имеющие доступ к этим устройствам, для планирования рабочих нагрузок на их основе. Akri — это проект песочницы CNCF для ребра, обрабатывающий динамический внешний вид и исчезновение конечных устройств. В настоящее время она поддерживает протоколы OPC UA, ONVIF и udev, но вы также можете реализовать пользовательские обработчики протоколов, предоставляемые шаблоном. Дополнительные сведения об Akri см. здесь.
В этой статье описывается, как обнаружить камеры ONVIF, подключенные к той же сети, что и кластер AKS Edge Essentials. ONVIF — это открытый отраслевой стандарт для устройств безопасности IP, который обычно используется для видеонаблюдения. Дополнительные сведения о профилях ONVIF см. здесь. Эта демонстрация поможет вам приступить к работе с Akri для обнаружения IP-камер с помощью протокола ONVIF и использовать их через видео-брокер, который позволяет использовать кадры с камеры и отображать их в веб-приложении.
Предварительные требования
- Развертывание на одном компьютере или полное развертывание AKS Edge Essentials (если вы используете реальную IP-камеру ONVIF, необходимо создать полное развертывание с внешним коммутатором).
- Akri работает только в Linux: в этом упражнении используйте узлы Linux.
- IP-камера ONVIF, подключенная к той же сети, что и кластер внешнего коммутатора, или макет контейнера ONVIF под управлением (действия по развертыванию приведены ниже).
Примечание
Этот пример брокера ONVIF в настоящее время не поддерживает подключение к камерам, для которых требуется проверка подлинности. Чтобы запустить эту демонстрацию, отключите проверку подлинности на камере ONVIF.
Макет контейнера ONVIF
Если у вас нет IP-камеры ONVIF, вы можете использовать наш макет контейнера ONVIF для этого упражнения. Макет контейнера работает как на одном компьютере, так и на полном развертывании.
(Необязательно) Если вы хотите настроить пользовательский видеопоток RTSP для контейнера ONVIF, сохраните видео mp4 (лучше всего работает, если качество — SD, а не HD) и скопируйте файл из каталога хост-компьютера в узел 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 и убедитесь, что модуль pod запущен:
kubectl apply -f onvif-mock.yaml kubectl get pods
Чтобы включить правила IP для обнаружения этой макетной камеры ONVIF, выполните указанные ниже действия.
Если CNI имеет значение Flannel, выполните приведенные ниже действия.
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
Если ваш CNI — Calico:
Найдите IP-адрес макетного контейнера ONVIF:
kubectl get pods -o wide
Найдите имя сетевого интерфейса, соответствующее IP-адресу объекта pod ONVIF (т. е.
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
Установите Akri с помощью Helm. При установке Akri укажите, что требуется развернуть обработчики обнаружения ONVIF, задав значение
onvif.discovery.enabled=true
helm . Кроме того, укажите, что вы хотите развернуть видео 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 (динамическое обнаружение веб-служб), который представляет собой протокол многоадресного обнаружения, работающий через ПОРТ 3702
TCP и UDP.
Выполните следующую команду, чтобы открыть
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"
Убедитесь, что Akri теперь может обнаружить вашу камеру. Вы должны увидеть один экземпляр Akri для камеры ONVIF:
kubectl get akrii
Развертывание веб-приложения потоковой передачи видео
Откройте пустой ФАЙЛ 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 запущены и работают:
Найдите IP-адрес узла Linux и порт службы веб-приложений:
Get-AksEdgeNodeAddr
kubectl get svc
Теперь вы можете просмотреть видеоматериалы, перейдя к веб-приложению, то есть
<NODE IP>:<PORT OF SERVICE>
:
Очистка
Удалите веб-приложение потоковой передачи видео:
kubectl delete -f akri-video-streaming-app.yaml
Удалите Akri из кластера:
helm delete akri
(Необязательно) Если вы использовали макет камеры ONVIF, удалите развертывание:
kubectl delete -f onvif-mock.yaml