보람찬 코기의 개발자 블로그
article thumbnail
반응형

과목 프로젝트 설계 중, 감사하게도 나의 지도교수님께서 연구실 소속 학부생 산학연구 참여제도(UROP)를 제안해주셨다.
좋은 기회를 얻어 지난 한 학기동안 'UROP'에 선정 되어 프로젝트를 진행하였다.

 

이번 블로그는 결과보고서 기반하여 포스팅을 진행하고, 문제 해결하기 위해 노력했던 과정들을 기록 하려고 한다.


기간 별 수행 절차

구 분 기 간 내 용
학습 1 주차 Raspberry Pi 4 기능 학습 및
운영체제(OS) 포팅(Porting)
학습 및 구현 2~3 주차 구동을 위한 Kubernetes 학습 및
3대의 Raspberry Pi 4를 통한 Cluster 구축
학습 3~4 주차 Messeage Queue, RTSP 프로토콜 학습
구현 5~6 주차  Telegraf , InfluxDB 학습
구현 7~8 주차 엣지 디바이스의 실시간 데이터 발행 기능,
Client에서 실시간 데이터 수신 기능 GUI 구현
구현 9~10 주차 구축된 클러스터에 배포를 위한 파일 작성 및 테스트
구현 11~12 주차 고찰 및 향후 연구 방향 설정 및 대한전자공학회 발표준비

 


1주차

Raspberry PI 4의 운영체제 설치

  • Raspberry Pi를 클러스터 구축을 위해 운영체제 설치 필요
  • 프로젝트에 사용 할 Kubernets 경량 배포판(이하 K3s)는 공식적으로 64bit 운영체제를 권장

결과 : 64bit ‘Raspbian’를 프로젝트의 Raspberry Pi에 설치하여 포팅(Porting)을 진행

[참조 문서] : https://docs.k3s.io/kr/installation/requirements


Raspberry PI 4의 64bit 운영체제에서 카메라 사용하기

  • 64bit의 운영체제에서는 기존 임베디드로 제공되었던 32bit의 카메라 관련 라이브러리 사용 불가 확인
  • 64비트 환경에서 기존 32bit 라이브러리 사용 시 메모리 활용 및 성능 향상의 이점을 놓치게 되는 상황이 발생
  • 패키지 매니저 apt를 통해 libcamera 관련 패키지를 설치
  • Python의 라이브러리 ‘OpenCV’를 통해 문제를 해결

결과 : apt를 통한 libcamera 설치 후, 작동에 대한 커맨드를 Sell 프로그래밍을 통해 ‘camera.sh’ 작성

 [참조 문서] : https://www.raspberrypi.com/documentation/accessories/camera.html#libcamera-jpeg

부착 된 카메라 구동을 위한 Shell Script


2~3 주차 [학습 및 구축]

왜 Kubernetes를 써야하는가?

  • Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리, 확장, 그리고 운영을 자동화하는 오픈 소스 플랫폼
  • Kubernetes는 애플리케이션의 배포와 확장을 자동화하여 인프라 관리의 복잡성을 감소
  • 사용할 Kubernetes는 경량 배포판 이며 IoT 및 저전력 디바이스에 최적화된 성능을 제공
  • 기존 Kubernetes(K8s) 보다 K3s는 권장 사양이 낮은 장점 (프로젝트 선정의 주된 이유)

K3s 시스템 아키텍쳐 (https://docs.k3s.io/kr/)

 

 

Kubernetes의 일부 기능

1. 자동화된 배포와 관리

  ⚬ 자동 배포 및 롤백: 버전을 통해 애플리케이션을 손쉽게 배포할 수 있으며, 문제 발생 시 자동으로 롤백(재시작) 가능

  ⚬ 수평적 확장: 수요에 따라 애플리케이션을 자동으로 확장하거나 축소가 가능

 

2. 높은 가용성과 자가 치유 기능

  ⚬ 자동 재시작: 실패한 컨테이너를 자동으로 재시작

  ⚬ 자동 재배치: 노드에 문제가 발생하면 컨테이너를 다른 노드로 자동으로 이동

  ⚬ 컨테이너 상태 체크 및 자동 복구: 애플리케이션의 상태를 지속적으로 모니터링하고, 비정상적인 상태가 감지되면 자동으로 복구 조치

 

3. 유연한 리소스 관리

  ⚬ 리소스 스케줄링: 클러스터 내의 모든 리소스를 고려하여 최적의 위치에 컨테이너를 배치

  ⚬ 리소스 할당: CPU와 메모리 같은 리소스를 할당하고, 이를 기반으로 애플리케이션을 행.

  ⚬ 네임 스페이스(NameSpace): 여러 팀이 동일한 클러스터를 사용할 수 있도록 논리적으로 격리된 네임스페이스를 제공

 

[구현] Raspberry Pi에 K3s 설치 순서 과정

 

 

  1. Linux Container 기능 활성화를 통한 K3s가 자원 제어를 할 수 있도록 한다.
  2. K3s를 설치하기 위해서 Docker가 설치 되어야한다. (명심하자 쿠버네티스는 컨테이너 오케스트레이션 이니까...)
  3. $ curl -sfL https://get.k3s.io | sh -s - --docker 를 통하여 Master node 구축
  4. $ sudo cat /var/lib/rancher/k3s/server/node-token 를 통하여 Master node Hash 값 출력
  5. Master node Hash 값을 통해 Worker 노드 설치 진행

프로젝트를 위해 설계한 K3s 클러스터 아키텍쳐

 

 

[구현] 3대의 Raspberry Pi를 통한 클러스터 구축

구축 진행 중인 K3s 기반 클러스터

 

 

- 1개의 Master (Server) – 2개의 Worker (agent)의 역할에 맞게 옵션을 두어 설치 과정에서 Master에 연결

- $ sudo kubectl get nodes 를 통해 연결된 노드 상태 조회

 

Master에서 노드 조회 결과

 

자세한 Raspberry Pi에서 K3s 구축 방법에 대해서는 이전 포스팅을 참조 부탁드립니다.

https://boramchan-corgi.tistory.com/42

 

[K3s] Raspberry PI 4 에 K3s 설치하여 클러스터 구축하기

이번에 RaspberryPI를 통한 클라우드 환경 구축 및 이 가이드에서는 Raspberry Pi 4 클러스터에 K3를 원활하게 설치하는 데 도움이 되는 커맨드 라인과 유용한 팁을 공유합니다. 본격적으로 설치 과정을

boramchan-corgi.tistory.com


4~5 주차 [학습 , 구축]

 

RTSP (Real-Time Streaming Protocol) 프로토콜 이란?

[참조 문서] : https://ko.wikipedia.org/wiki/%EC%8B%A4%EC%8B%9C%EA%B0%84_%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

- 정의

  • RTSP는 인터넷을 통해 실시간 미디어 스트리밍을 제어하기 위한 네트워크 프로토콜
  • RTSP는 클라이언트-서버 모델을 기반으로 하며, 스트리밍 서버에서 클라이언트로 비디오와 오디오 데이터를 전송
  • RFC 2326에 의해 정의, 세션을 설정하고 제어

인터넷 웹을 통한 프로토콜 작동 과정 예시

 

 

- 특징점

  • 실시간 스트리밍 송출 : RTSP는 실시간 스트리밍 데이터를 효율적으로 제어
  • 다양한 미디어 형식 지원 : RTSP는 비디오, 오디오, 텍스트 등 다양한 미디어 형식을 지원
  • 세션 관리 기능 : RTSP는 세션을 생성하고 관리하는 기능을 제공하여, 안정적인 스트리밍 서비스를 지원

 

RTSP를 프로젝트에 적용

- 프로젝트 내부 변경점

  • 기존 libcamera에서 libcamera-vid 사용으로 Shell Script 변경
  • RTSP 프로토콜을 활용하여 제어가 가능하게 변경
  • 추가 옵션을 통해 port 번호 지정 및 코덱 설정

기존에서 변경된 shell script

 

 

메시지큐 (Message Queue) 이란?

- 정의

  • 메시지 큐는 메시지를 큐 형태로 저장하고 전달하는 시스템
  • 발행(Publish)자가 큐에 메시지를 추가하면, 소비(Consume)자는 큐에서 메시지를 읽고 삭제 처리
  • 시스템 간의 비동기 데이터 통신이 가능.

 

메시지큐 작동 흐름

 

 

- 기능

  • 비동기 데이터 통신: 발행자와 소비자가 동시에 동작하지 않아도 데이터를 교환
  • 데이터 완전성 보장: 메시지를 안전하게 저장하고 전달하여 데이터 손실을 방지
  • 확장성 제공: 시스템의 확장성을 높여 다수의 클라이언트와 서버 간의 통신을 효율적으로 관리

 

프로젝트에 적용 하고자 하는 이유

  •  엣지 디바이스의 갑작스러운 중단 및 고장에 대비
  • Queue를 통하여 다양한 종단점(Endpoint) 형식에 대응

 

프로젝트에 적용할 메시지큐 RabbitMQ란?

- 정의

  • 오픈 소스로 이루어진 메시지 브로커
  • AMQP (Advanced Message Queuing Protocol)를 기반으로 동작
  • 메시지 큐이며, 다양한 시스템 간에 메시지를 안전하고 신뢰성 있게 전달

- 주요 기능 특징 (노랑색 : 사용하게된 주된 이유)

  • 메시지 브로커링: 발행자와 구독자 간의 메시지를 중계하고, 메시지를 큐에 저장 및 전달
  • 라우팅: 메시지를 여러 큐로 라우팅할 수 있는 기능.
  • 고가용성: 클러스터링을 통해 시스템의 가용성 향상, 데이터 손실을 방지
  • 플러그인 지원: 인증, 인증서 관리, 모니터링 위한 매니저 기능 다양한 플러그인을 제공

 

 

로컬 환경 구동을 위한 docker-compose 작성

Rabbitmq 구동을 위한 Yaml 파일 일부

 

 

  1. RabbitMQ 운영에 대한 이미지 설정값 및 Port 지정
  2. 환경변수를 통해 생성 시 기본 관리자 설정
  3. 무중단 서비스 구현

 

Docker compose 실행방법: docker-compose.yaml이 존재하는 디렉토리에서 ‘docker-compose up –d’ 실행

 

로컬 환경에서 작동

  • 컨테이너 생성 후 접속 사진
  • 접속방법 : 작동 후, localhost:15672 접속

rabbitmq 컨테이너 정상 생성 결과 (이미 작성완료된 yaml이라 전체 배포)

 

 

rabbitmq 웹을 통한 모니터링 Management 대시보드 접속


6~7 주차 [학습 , 구축]

Telegraf 이란?

- 정의

  • 오픈 소스 서버 에이전트로, 다양한 시스템과 애플리케이션의 메트릭 데이터를 수집하고 전송
  • InfluxData 사에서 개발한 TICK 스택의 일부이다

 

- 기능

  • 데이터 수집: 다양한 애플리케이션에서 메트릭 데이터를 수집할 수 있는 플러그인 제공
  • 데이터 처리: 수집된 데이터를 변환하거나 필터링하는 기능
  • 데이터 버퍼링: 데이터를 설정된 기간을 집계하여 전송하는 기능
  • 데이터 출력: 수집된 메트릭 데이터를 다양한 데이터베이스와 서비스로 전송

 

프로젝트에 적용 하고자 하는 이유

  • RabbitMQ에서 Consumer를 통하여 Telegraf의 데이터 수집
  • Telegraf의 데이터 처리를 통해 InfluxDB에 데이터 삽입에 맞게 변환
  • Telegraf의 데이터 출력을 통해 InfluxDB에 데이터 삽입

 

Docker로 Telegraf 구동 및 구현

Telegraf 구동을 위한 Dockefile

 

 

Dockerfile 설명

  1. Telegraf의 이미지와 버전을 선정
  2. Telegraf 생성에 참조하는 Config(설정값) 로컬에서 컨테이너 환경으로 복사
  3. 이미지 기반 컨테이너 상에서 플러그인 설치
  4. 구동 명령어 실행

 

로컬 환경에서 작동 및 구성 파일 설명

Telegraf 컨테이너 정상 생성 결과

 

Telegraf Config 설정값 (telegraf.conf)

 

 

  1. Telegraf 운영에 대한 세팅값
  2. 작동을 위한 inputs.amqp_consumer를 통해 데이터 수집
  3. 작동을 위한 outputs.influxdb_v2를 통해 데이터 출력

InfluxDB란?

- 정의

  • InfluxDB는 오픈 소스 시계열 데이터베이스 시스템
  • 시계열 데이터베이스는 시간 기반의 데이터 수집, 저장, 조회를 위해 설계
  • InfluxDB는 특히 높은 쓰기 및 읽기 성능을 제공

 

- 기능 및 설명 [노란색 : 적용하고자 하는 이유]

  • 타임스탬프 기반 데이터: 각 데이터 포인트는 타임스탬프와 함께 저장되며, 시간 기반의 쿼리를 효율적으로 처리
  • 내장 대시보드 및 시각화 : Chronograf와 같은 도구와 통합하여 데이터 시각화 및 대시보드를 제공

 

InfluxDB 구동을 위한 Yaml 파일

 

 

  1. RabbitMQ 운영에 대한 최신 이미지 설정 및 Port 지정
  2. 환경변수를 통해 생성 시 기본 관리자 설정 및 버킷 이름 설정
  3. 무중단 서비스 구현

 

로컬 환경에서 작동

[좌] InfluxDB 컨테이너 정상 생성 작동 결과  [우]InfluxDB 구동 이후 관리 페이지 접속 결과

 


8~9 주차 [구축]

엣지 디바이스의 실시간 데이터 발행(Publisher) 코드 구현

  • 구현 언어 : Python
  • 라이브러리 : pika, psutil, json, time

엣지 디바이스의 CPU 및 Ram 정보를 수집

Publisher - get_system_info 함수

  1. psutil 라이브러리를 사용하여 CPU 사용률과 메모리 정보를 수집
  2. endpoint 매개변수에 따라 반환되는 데이터 형식 결정
  3. 수집된 데이터를 Influx Line Protocol 형식 또는 JSON 형식으로 변환

 

엣지 디바이스에서 RabbitMQ를 연결

connect_rabbitmq 함수

  • pika 라이브러리를 사용하여 RabbitMQ 서버에 연결
  • RabbitMQ 서버의 IP, 포트 설정

 

엣지 디바이스에서 RabbitMQ로 데이터 전송

'send_data' 데이터 전송 함수

  • [프로젝트 특징] Rabbit MQ 특성인 교환기(exchange)와 라우팅 키(routing_key)만 사용하여 전송
  • 전송 결과 터미널 출력

 

 

Client에서 실시간 데이터 수신 기능 GUI 구현

  • 구현 언어 : Python
  • 라이브러리 : tkinter, cv2, json, pika, PIL, threading

 

GUI 설정

  • RTSP URL을 입력할 수 있는 텍스트 필드와 시작/중지 버튼을 배치
  • 비디오 스트림을 표시할 레이블과 시스템 리소스 정보를 표시할 레이블을 배치

 

송출되는 비디오 영상 스트리밍 시작

송출되는 영상 수신후 스트리밍 함수

 

  1. 사용자가 입력한 RTSP URL을 사용하여 비디오 스트림을 시작
  2. 스트리밍이 이미 진행 중일 경우 에러 처리
  3. 스트리밍이 성공적으로 시작되면 update_video_stream 을 호출하여 프레임을 지속적으로 갱신

 

송출되는 비디오 영상 스트리밍 (업데이트)

  1. 비디오 스트림에서 프레임을 읽고, 이를 Tkinter 레이블에 표시
  2. 스트리밍이 중지되거나 오류가 발생하면 이를 처리하고 스트리밍을 중지

 

수신을 위한 RabbitMQ 설정

  • RabbitMQ 서버에 연결하고 교환기 및 큐를 설정
  • 메시지를 수신하기 위해 RabbitMQ 소비자 병렬 스레드를 시작

 

메시지 처리 설정

큐의 데이터 소비하는 함수

  • RabbitMQ 큐에서 메시지를 소비하여 on_message 콜백을 호출
  • 수신한 메시지를 디코딩하고 JSON 형식으로 파싱하여 GUI 갱신

 

수신 후 메시지 레이블 업데이트 함수

  • 파싱된 JSON 데이터를 사용하여 CPU 및 RAM 정보 갱신
  • 잘못된 JSON 형식의 메시지에 대해 예외처리

 


10~11 주차 [구축]

Client에서 실시간 데이터 수신 기능 웹 구현 (추가 기능 구현)

  • 구현 언어 : javascript (Node.js)
  • 파일경로 : node 디렉토리
  • 구조 : MVC 패턴을 적용
  • 작동 커맨드 : node server.js

node.js 구조

Node 경로 구조(MVC 패턴)

 

infoModel.js에서 RabbitMQ를 연결 후 데이터 수신

MVC 패턴에 맞게 데이터 처리후 EJS에 표시 구현

  • infocontroller.js
  • infoRoutes.js
  • server.js를 통해 수신받은 값을 views 로 전달

 

로컬환경 구동

서버 실행 후 접속 결과

 

 

간단한 고찰 : 당시 Node.js에 대한 이해가 깊지 않았고 추가 기능 구현을 하다보니 코드가 간결하지 않았다. 이 부분은 참고만 해주세요!

 


 

 

 

제작 클러스터 내 배포

클러스터 배포를 위한 YAML 작성

  • 기존 Docker-compose 기반 파일을 YAML 로 재작성 진행
  • 기존 작성되었던 파일의 환경변수 또한 동일 하게 작성

클러스터 배포를 위한 YAML 파일 작성 목록

 

 

클러스터 배포 순서 [kubectl apply –f ‘파일명’]

  1. namespace.yaml
  2. influxdb-deployment.yaml
  3. rabbitmq-deployment.yaml
  4. telegraf-configmap.yaml
  5. telegerf-deployment.yaml

 

클러스터 배포 이후 Pod를 조회한 결과

 

 

 

제작 클러스터 내 배포 이후 정상 작동 테스트

⚬ 카메라 작동을 위한 stream.sh 를 실행

stream.sh를 실행한 이후 터미널 출력값

 

 

⚬ monitor_GUI.py를 실행

monitor_GUI.py를 실행한 이후 GUI

 

 

⚬ producer_app.py를 실행

producer_app.py를 실행한 이후 터미널 출력값

 

 

⚬ GUI를 통한 영상, 데이터 정보 실시간 출력 결과 & InfluxDB에 실시간으로 들어오는 데이터 정보 조회

[좌] producer_app.py를 실행한 이후 터미널 출력값 [우] 실시간으로 influxDB에 저장

 

 

 

 

⚬ 클러스터 내부 저장소에 주기적으로 사진 저장 시작 &  클러스터 내부 저장소에 주기적으로 사진 저장 확인

[좌] 캡쳐 스크립트 실행 [우] 클러스터 내부 지정 디렉토리에 주기적 사진 저장

 

 


고찰  및 향후 연구 방향

고찰

프로젝트 수행 과정에서는 RTSP 프로토콜이 보안에 취약하다는 점을 발견하였다.

카메라를 통한 영상 송출 과정에서 IP 주소와 포트 번호를 통해 쉽게 수신할 수 있다는 문제가 있었다.

이를 해결하기 위해 추후 RTSP 프로토콜을 활용한 사용자 인증 기반 플랫폼이 대안이 될 수 있다고 생각했다.

 

향후 연구 방향

  1. 위에서 고찰한 바와 같이 보안성이 보장된 RTSP 기반 프로토콜 영상 송출 플랫폼을 개발한다.
  2. 엣지 디바이스에서 추가적인 정보(온도, 습도 등)를 수집하고, 이를 기반으로 엣지 디바이스 또는 클러스터의 이상 상태를 예측하는 기계학습 모델을 구현한다.

좋은 기회로 프로젝트를 마무리 할 수 있었고, 설계하고 구축하는 좋은 경험이 될 수 있었다.

다음 포스팅은 대한전자공학회 하계 학술대회에서 참석하여 피드백 받은 부분을 포스팅하며 참석 후기를 작성할 계획이다.

 

< 포스팅 내부의 오개념이 있을 수 있습니다. 피드백은 언제나 환영합니다. 발견 시 댓글 남겨주세요!> 

 

반응형
profile

보람찬 코기의 개발자 블로그

@BoChan

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!