Detección de cámaras ONVIF con Akri
Akri es una interfaz de recursos de Kubernetes que permite exponer fácilmente dispositivos hoja heterogéneos (como cámaras IP y dispositivos USB) como recursos en un clúster de Kubernetes y detecta continuamente nodos que tienen acceso a estos dispositivos para programar cargas de trabajo basadas en ellos. Akri es un proyecto de espacio aislado CNCF realizado para el borde, controlando la apariencia dinámica y la desaparición de los dispositivos hoja. Actualmente admite protocolos OPC UA, ONVIF y udev, pero también puede implementar controladores de protocolo personalizados proporcionados por la plantilla. Obtenga más información sobre Akri aquí.
En este artículo se describe cómo puede detectar cámaras ONVIF conectadas a la misma red que el clúster de AKS Edge Essentials. ONVIF es un estándar abierto del sector para dispositivos de seguridad IP, que se suelen usar para la vigilancia de vídeo. Obtenga más información sobre los perfiles ONVIF aquí. Esta demostración le ayuda a empezar a usar Akri para detectar cámaras IP a través del protocolo ONVIF y usarlas a través de un agente de vídeo que le permite consumir las imágenes de la cámara y mostrarlas en una aplicación web.
Requisitos previos
- Una implementación de una sola máquina o una implementación completa de AKS Edge Essentials en funcionamiento (si usa una cámara IP ONVIF real, debe crear una implementación completa con un conmutador externo).
- Akri solo funciona en Linux: use nodos de Linux para este ejercicio.
- Una cámara IP ONVIF conectada a la misma red que el clúster de conmutadores externos o un contenedor ONVIF ficticio que se ejecuta (pasos de implementación como se indica a continuación).
Nota
Actualmente, este agente ONVIF de ejemplo no admite la conexión a cámaras que requieren autenticación. Para ejecutar esta demostración, deshabilite la autenticación en la cámara ONVIF.
Simulación de contenedor ONVIF
Si no tiene una cámara IP ONVIF, puede usar nuestro contenedor ONVIF ficticio para este ejercicio. El contenedor ficticio funciona en una sola máquina o en una implementación completa.
(Opcional) Si desea configurar una fuente de vídeo RTSP personalizada para el contenedor ONVIF, guarde el vídeo mp4 (funciona mejor si la calidad es SD en lugar de HD) y copie el archivo del directorio del equipo host en el nodo de Linux mediante el siguiente comando (asegúrese de reemplazar el directorio de la máquina host y el nombre de archivo de vídeo adecuado):
Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
Abra un archivo YAML vacío y copie o pegue el contenido siguiente. Asegúrese de reemplazar el valor después
/mnt/
por el nombre del archivo de vídeo enMP4FILE
. Guarde el archivo como 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
Aplique YAML y asegúrese de que el pod se está ejecutando:
kubectl apply -f onvif-mock.yaml kubectl get pods
Para habilitar las reglas IP de esta cámara ONVIF ficticia que se va a detectar:
Si su CNI es Flannel:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
Si su CNI es Calico:
Busque la dirección IP del contenedor ONVIF ficticio:
kubectl get pods -o wide
Busque el nombre de la interfaz de red que coincida con la dirección IP del pod ONVIF (es decir
cali909b8c65537
, ):Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "route"
Ahora habilite la detección de ONVIF:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev <insert interface name>"
Además, si ejecuta una implementación completa con un conmutador externo, habilite
dport 3702
y guarde las tablas 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"
Ahora ya está listo para ejecutar Akri y descubrir la cámara ONVIF simulada.
Ejecución de Akri
Agregue los gráficos de Helm de Akri si aún no lo ha hecho:
helm repo add akri-helm-charts https://project-akri.github.io/akri/
Si ya ha agregado el gráfico de Helm de Akri anteriormente, actualice el repositorio para la compilación más reciente:
helm repo update
Instale Akri mediante Helm. Al instalar Akri, especifique que desea implementar los controladores de detección de ONVIF estableciendo el valor
onvif.discovery.enabled=true
de Helm . Además, especifique que desea implementar el agente de vídeo 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'
Obtenga más información sobre los valores de configuración de ONVIF aquí.
Abra el puerto de WS-Discovery
Para que el clúster de AKS Edge Essentials detecte la cámara, abra el puerto para WS-Discovery (detección dinámica de servicios web), que es un protocolo de detección de multidifusión que funciona a través del puerto 3702
TCP y UDP.
Ejecute el siguiente comando para abrir
sport 3702
en el nodo de Linux y guardar las tablas 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"
Compruebe que Akri ahora puede detectar la cámara. Debería ver una instancia de Akri para la cámara ONVIF:
kubectl get akrii
Implementación de una aplicación web de streaming de vídeo
Abra un archivo YAML en blanco y copie o pegue el siguiente contenido en el archivo:
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
Guarde el archivo como akri-video-streaming-app.yaml.
En la ventana de PowerShell, cambie el directorio a la ubicación del archivo akri-video-straming-app.yaml e impleméntelo en el clúster:
kubectl apply -f akri-video-streaming-app.yaml
Asegúrese de que todos los pods están en funcionamiento:
Busque la dirección IP del nodo de Linux y el puerto del servicio de aplicaciones web:
Get-AksEdgeNodeAddr
kubectl get svc
Ahora puede ver el vídeo navegando a la aplicación web, que es
<NODE IP>:<PORT OF SERVICE>
:
Limpieza
Elimine la aplicación web de streaming de vídeo:
kubectl delete -f akri-video-streaming-app.yaml
Desinstale Akri del clúster:
helm delete akri
(Opcional) Si usó la cámara ONVIF simulada, elimine la implementación:
kubectl delete -f onvif-mock.yaml