Akri를 사용하여 ONVIF 카메라 검색
Akri는 다른 유형의 리프 디바이스(예: IP 카메라 및 USB 디바이스)를 Kubernetes 클러스터의 리소스로 쉽게 노출할 수 있는 Kubernetes 리소스 인터페이스이며, 이러한 디바이스에 대한 액세스 권한이 있는 노드를 지속적으로 검색하여 워크로드를 예약합니다. Akri는 리프 디바이스의 동적 모양과 실종을 처리하는 에지를 위해 만들어진 CNCF 샌드박스 프로젝트입니다. 현재 OPC UA, ONVIF 및 udev 프로토콜을 지원하지만 템플릿에서 제공하는 사용자 지정 프로토콜 처리기를 구현할 수도 있습니다. Akri에 대한 자세한 내용은 여기를 참조하세요.
이 문서에서는 AKS Edge Essentials 클러스터와 동일한 네트워크에 연결된 ONVIF 카메라를 검색하는 방법을 설명합니다. ONVIF는 일반적으로 비디오 감시에 사용되는 IP 보안 디바이스에 대한 개방형 업계 표준입니다. ONVIF 프로필에 대한 자세한 내용은 여기를 참조하세요. 이 데모를 통해 Akri를 사용하여 ONVIF 프로토콜을 통해 IP 카메라를 검색하고 카메라의 영상을 사용하고 웹 애플리케이션에 표시할 수 있는 비디오 브로커를 통해 사용할 수 있습니다.
필수 구성 요소
- 단일 머신 배포 또는 AKS Edge Essentials의 전체 배포가 실행되고 있습니다(실제 ONVIF IP 카메라를 사용하는 경우 외부 스위치를 사용하여 전체 배포를 만들어야 합니다).
- Akri는 Linux에서만 작동합니다. 이 연습에서는 Linux 노드를 사용합니다.
- 외부 스위치 클러스터와 동일한 네트워크에 연결된 ONVIF IP 카메라 또는 실행 중인 모의 ONVIF 컨테이너(다음과 같은 배포 단계).
참고
이 샘플 ONVIF 브로커는 현재 인증이 필요한 카메라에 대한 연결을 지원하지 않습니다. 이 데모를 실행하려면 ONVIF 카메라에서 인증을 사용하지 않도록 설정합니다.
Mock ONVIF 컨테이너
ONVIF IP 카메라가 없는 경우 이 연습에 모의 ONVIF 컨테이너를 사용할 수 있습니다. 모의 컨테이너는 단일 컴퓨터 또는 전체 배포 모두에서 작동합니다.
(선택 사항) ONVIF 컨테이너에 대한 사용자 지정 RTSP 비디오 피드를 설정하려면 mp4 비디오를 저장하고(품질이 HD가 아닌 SD인 경우 가장 잘 작동함) 다음 명령을 사용하여 호스트 컴퓨터 디렉터리에서 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
이 모의 ONVIF 카메라에 대한 IP 규칙을 검색할 수 있도록 설정하려면 다음을 수행합니다.
CNI가 Flannel인 경우:
Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
CNI가 Calico인 경우:
모의 ONVIF 컨테이너의 IP를 찾습니다.
kubectl get pods -o wide
ONVIF Pod의 IP와 일치하는 네트워크 인터페이스 이름(예: )을 찾습니다.
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
Helm을 사용하여 Akri를 설치합니다. Akri를 설치할 때 helm 값을
onvif.discovery.enabled=true
설정하여 ONVIF 검색 처리기를 배포하도록 지정합니다. 또한 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 클러스터가 카메라를 검색하려면 TCP 및 UDP 포트를 통해 작동하는 멀티캐스트 검색 프로토콜인 WS-Discovery(Web Services Dynamic Discovery)에 대한 포트 3702
를 엽니다.
다음 명령을 실행하여 Linux 노드 내에서 열고
sport 3702
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가 이제 카메라를 검색할 수 있는지 확인합니다. ONVIF 카메라에 대한 하나의 Akri instance 표시됩니다.
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가 실행 중인지 확인합니다.
Linux 노드 IP 및 웹앱 서비스의 포트를 찾습니다.
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