Descobrir câmeras ONVIF com a Akri
O Akri é uma interface de recurso do Kubernetes que permite expor facilmente dispositivos folha heterogêneos (como câmeras IP e dispositivos USB) como recursos em um cluster do Kubernetes e detecta continuamente nós que têm acesso a esses dispositivos para agendar cargas de trabalho com base neles. Akri é um projeto de área restrita CNCF feito para a borda, manipulando a aparência dinâmica e o desaparecimento de dispositivos folha. Atualmente, ele dá suporte a protocolos OPC UA, ONVIF e udev, mas você também pode implementar manipuladores de protocolo personalizados fornecidos pelo modelo. Leia mais sobre Akri aqui.
Este artigo descreve como você pode descobrir câmeras ONVIF conectadas à mesma rede que o cluster do AKS Edge Essentials. O ONVIF é um padrão aberto do setor para dispositivos de segurança IP, comumente usado para vigilância por vídeo. Leia mais sobre perfis ONVIF aqui. Essa demonstração ajuda você a começar a usar o Akri para descobrir câmeras IP por meio do protocolo ONVIF e usá-las por meio de um agente de vídeo que permite consumir as imagens da câmera e exibi-las em um aplicativo Web.
Pré-requisitos
- Uma implantação de computador único ou uma implantação completa do AKS Edge Essentials em funcionamento (se você estiver usando uma câmera IP ONVIF real, deverá criar uma implantação completa com um comutador externo).
- O Akri só funciona no Linux: use nós do Linux para este exercício.
- Uma câmera IP ONVIF conectada à mesma rede que o cluster do comutador externo ou um contêiner ONVIF fictício em execução (etapas de implantação da seguinte maneira).
Observação
Este agente ONVIF de exemplo atualmente não dá suporte à conexão com câmeras que exigem autenticação. Para executar essa demonstração, desabilite a autenticação em sua câmera ONVIF.
Simular contêiner ONVIF
Se você não tiver uma câmera IP ONVIF, poderá usar nosso contêiner ONVIF fictício para este exercício. O contêiner fictício funciona em um único computador ou em uma implantação completa.
(Opcional) Se você quiser configurar um feed de vídeo RTSP personalizado para seu contêiner ONVIF, salve o vídeo mp4 (funciona melhor se a qualidade for SD em vez de HD) e copie o arquivo do diretório do computador host para o nó do Linux usando o seguinte comando (substitua o diretório do computador host e o nome do arquivo de vídeo apropriado):
Copy-AksEdgeNodeFile -FromFile C:\Users\WinIotUser\Downloads\sample.mp4 -toFile /home/aksedge-user/sample.mp4 -PushFile
Abra um arquivo YAML vazio e copie/cole o conteúdo a seguir. Substitua o valor depois
/mnt/
pelo nome do arquivo de vídeo emMP4FILE
. Salve o arquivo 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 o YAML e verifique se o pod está em execução:
kubectl apply -f onvif-mock.yaml kubectl get pods
Para habilitar as regras de IP para que essa câmera ONVIF fictícia seja descoberta:
Se sua CNI for Flannel:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
Se sua CNI for Calico:
Localize o IP do contêiner ONVIF fictício:
kubectl get pods -o wide
Localize o nome do adaptador de rede que corresponde ao IP do pod ONVIF (ou seja,
cali909b8c65537
):Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "route"
Agora, habilite a descoberta de ONVIF:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev <insert interface name>"
Além disso, se você estiver executando uma implantação completa com um comutador externo, habilite e
dport 3702
salve as tabelas de 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"
Agora você está pronto para executar a Akri e descobrir a câmera ONVIF fictícia.
Executar o Akri
Adicione os gráficos do Akri Helm se você ainda não tiver:
helm repo add akri-helm-charts https://project-akri.github.io/akri/
Se você já adicionou o gráfico do Helm do Akri anteriormente, atualize seu repositório para a compilação mais recente:
helm repo update
Instale o Akri usando o Helm. Ao instalar o Akri, especifique que você deseja implantar os manipuladores de descoberta ONVIF definindo o valor
onvif.discovery.enabled=true
helm . Além disso, especifique que você deseja implantar o 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'
Saiba mais sobre as definições de configuração do ONVIF aqui.
Abrir a porta WS-Discovery
Para que o cluster do AKS Edge Essentials descubra sua câmera, abra a porta para WS-Discovery (Descoberta Dinâmica de Serviços Web), que é um protocolo de descoberta multicast que opera pela porta 3702
TCP e UDP.
Execute o seguinte comando para abrir
sport 3702
dentro do nó do Linux e salvar as tabelas de 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"
Verifique se o Akri agora pode descobrir sua câmera. Você deverá ver uma instância do Akri para sua câmera ONVIF:
kubectl get akrii
Implantar aplicativo Web de streaming de vídeo
Abra um arquivo YAML em branco e copie/cole o seguinte conteúdo no arquivo:
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
Salve o arquivo como akri-video-streaming-app.yaml.
Na janela do PowerShell, altere o diretório para o local do arquivo akri-video-straming-app.yaml e implante-o no cluster:
kubectl apply -f akri-video-streaming-app.yaml
Verifique se todos os pods estão em execução:
Localize o IP do nó do Linux e a porta do serviço de aplicativo Web:
Get-AksEdgeNodeAddr
kubectl get svc
Agora você pode exibir as imagens de vídeo navegando até seu aplicativo Web, que é
<NODE IP>:<PORT OF SERVICE>
:
Limpar
Exclua o aplicativo Web de streaming de vídeo:
kubectl delete -f akri-video-streaming-app.yaml
Desinstale o Akri do cluster:
helm delete akri
(Opcional) Se você usou a câmera ONVIF fictícia, exclua a implantação:
kubectl delete -f onvif-mock.yaml