다음을 통해 공유


Akri를 사용하여 ONVIF 카메라 검색

Akri는 다른 유형의 리프 디바이스(예: IP 카메라 및 USB 디바이스)를 Kubernetes 클러스터의 리소스로 쉽게 노출할 수 있는 Kubernetes 리소스 인터페이스이며, 이러한 디바이스에 대한 액세스 권한이 있는 노드를 지속적으로 검색하여 워크로드를 예약합니다. Akri는 리프 디바이스의 동적 모양과 실종을 처리하는 에지를 위해 만들어진 CNCF 샌드박스 프로젝트입니다. 현재 OPC UA, ONVIF 및 udev 프로토콜을 지원하지만 템플릿에서 제공하는 사용자 지정 프로토콜 처리기를 구현할 수도 있습니다. Akri에 대한 자세한 내용은 여기를 참조하세요.

이 문서에서는 AKS Edge Essentials 클러스터와 동일한 네트워크에 연결된 ONVIF 카메라를 검색하는 방법을 설명합니다. ONVIF는 일반적으로 비디오 감시에 사용되는 IP 보안 디바이스에 대한 개방형 업계 표준입니다. ONVIF 프로필에 대한 자세한 내용은 여기를 참조하세요. 이 데모를 통해 Akri를 사용하여 ONVIF 프로토콜을 통해 IP 카메라를 검색하고 카메라의 영상을 사용하고 웹 애플리케이션에 표시할 수 있는 비디오 브로커를 통해 사용할 수 있습니다.

Akri ONVIF 데모의 흐름을 보여 주는 다이어그램

필수 구성 요소

  • 단일 머신 배포 또는 AKS Edge Essentials의 전체 배포가 실행되고 있습니다(실제 ONVIF IP 카메라를 사용하는 경우 외부 스위치를 사용하여 전체 배포를 만들어야 합니다).
  • Akri는 Linux에서만 작동합니다. 이 연습에서는 Linux 노드를 사용합니다.
  • 외부 스위치 클러스터와 동일한 네트워크에 연결된 ONVIF IP 카메라 또는 실행 중인 모의 ONVIF 컨테이너(다음과 같은 배포 단계).

참고

이 샘플 ONVIF 브로커는 현재 인증이 필요한 카메라에 대한 연결을 지원하지 않습니다. 이 데모를 실행하려면 ONVIF 카메라에서 인증을 사용하지 않도록 설정합니다.

Mock ONVIF 컨테이너

ONVIF IP 카메라가 없는 경우 이 연습에 모의 ONVIF 컨테이너를 사용할 수 있습니다. 모의 컨테이너는 단일 컴퓨터 또는 전체 배포 모두에서 작동합니다.

  1. (선택 사항) ONVIF 컨테이너에 대한 사용자 지정 RTSP 비디오 피드를 설정하려면 mp4 비디오를 저장하고(품질이 HD가 아닌 SD인 경우 가장 잘 작동함) 다음 명령을 사용하여 호스트 컴퓨터 디렉터리에서 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. 이 모의 ONVIF 카메라에 대한 IP 규칙을 검색할 수 있도록 설정하려면 다음을 수행합니다.

    • CNI가 Flannel인 경우:

      Invoke-AksEdgeNodeCommand -NodeType "Linux" -command "sudo ip route add 239.255.255.250/32 dev cni0"
      
    • CNI가 Calico인 경우:

      1. 모의 ONVIF 컨테이너의 IP를 찾습니다.

        kubectl get pods -o wide
        
      2. ONVIF Pod의 IP와 일치하는 네트워크 인터페이스 이름(예: )을 찾습니다. 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. 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를 엽니다.

  1. 다음 명령을 실행하여 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"
    
  2. Akri가 이제 카메라를 검색할 수 있는지 확인합니다. ONVIF 카메라에 대한 하나의 Akri instance 표시됩니다.

    kubectl get akrii
    

    검색된 ONVIF 카메라의 Akri instance 보여 주는 스크린샷

비디오 스트리밍 웹 애플리케이션 배포

  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가 실행 중인지 확인합니다.

    Akri Pod 및 비디오 앱 Pod가 실행 중임을 보여 주는 스크린샷

  5. Linux 노드 IP 및 웹앱 서비스의 포트를 찾습니다.

    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 개요