과목 프로젝트 설계 중, 감사하게도 나의 지도교수님께서 연구실 소속 학부생 산학연구 참여제도(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
2~3 주차 [학습 및 구축]
왜 Kubernetes를 써야하는가?
- Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리, 확장, 그리고 운영을 자동화하는 오픈 소스 플랫폼
- Kubernetes는 애플리케이션의 배포와 확장을 자동화하여 인프라 관리의 복잡성을 감소
- 사용할 Kubernetes는 경량 배포판 이며 IoT 및 저전력 디바이스에 최적화된 성능을 제공
- 기존 Kubernetes(K8s) 보다 K3s는 권장 사양이 낮은 장점 (프로젝트 선정의 주된 이유)
Kubernetes의 일부 기능
1. 자동화된 배포와 관리
⚬ 자동 배포 및 롤백: 버전을 통해 애플리케이션을 손쉽게 배포할 수 있으며, 문제 발생 시 자동으로 롤백(재시작) 가능
⚬ 수평적 확장: 수요에 따라 애플리케이션을 자동으로 확장하거나 축소가 가능
2. 높은 가용성과 자가 치유 기능
⚬ 자동 재시작: 실패한 컨테이너를 자동으로 재시작
⚬ 자동 재배치: 노드에 문제가 발생하면 컨테이너를 다른 노드로 자동으로 이동
⚬ 컨테이너 상태 체크 및 자동 복구: 애플리케이션의 상태를 지속적으로 모니터링하고, 비정상적인 상태가 감지되면 자동으로 복구 조치
3. 유연한 리소스 관리
⚬ 리소스 스케줄링: 클러스터 내의 모든 리소스를 고려하여 최적의 위치에 컨테이너를 배치
⚬ 리소스 할당: CPU와 메모리 같은 리소스를 할당하고, 이를 기반으로 애플리케이션을 행.
⚬ 네임 스페이스(NameSpace): 여러 팀이 동일한 클러스터를 사용할 수 있도록 논리적으로 격리된 네임스페이스를 제공
[구현] Raspberry Pi에 K3s 설치 순서 과정
- Linux Container 기능 활성화를 통한 K3s가 자원 제어를 할 수 있도록 한다.
- K3s를 설치하기 위해서 Docker가 설치 되어야한다. (명심하자 쿠버네티스는 컨테이너 오케스트레이션 이니까...)
- $ curl -sfL https://get.k3s.io | sh -s - --docker 를 통하여 Master node 구축
- $ sudo cat /var/lib/rancher/k3s/server/node-token 를 통하여 Master node Hash 값 출력
- Master node Hash 값을 통해 Worker 노드 설치 진행
[구현] 3대의 Raspberry Pi를 통한 클러스터 구축
- 1개의 Master (Server) – 2개의 Worker (agent)의 역할에 맞게 옵션을 두어 설치 과정에서 Master에 연결
- $ sudo kubectl get nodes 를 통해 연결된 노드 상태 조회
자세한 Raspberry Pi에서 K3s 구축 방법에 대해서는 이전 포스팅을 참조 부탁드립니다.
https://boramchan-corgi.tistory.com/42
4~5 주차 [학습 , 구축]
RTSP (Real-Time Streaming Protocol) 프로토콜 이란?
- 정의
- RTSP는 인터넷을 통해 실시간 미디어 스트리밍을 제어하기 위한 네트워크 프로토콜
- RTSP는 클라이언트-서버 모델을 기반으로 하며, 스트리밍 서버에서 클라이언트로 비디오와 오디오 데이터를 전송
- RFC 2326에 의해 정의, 세션을 설정하고 제어
- 특징점
- 실시간 스트리밍 송출 : RTSP는 실시간 스트리밍 데이터를 효율적으로 제어
- 다양한 미디어 형식 지원 : RTSP는 비디오, 오디오, 텍스트 등 다양한 미디어 형식을 지원
- 세션 관리 기능 : RTSP는 세션을 생성하고 관리하는 기능을 제공하여, 안정적인 스트리밍 서비스를 지원
RTSP를 프로젝트에 적용
- 프로젝트 내부 변경점
- 기존 libcamera에서 libcamera-vid 사용으로 Shell Script 변경
- RTSP 프로토콜을 활용하여 제어가 가능하게 변경
- 추가 옵션을 통해 port 번호 지정 및 코덱 설정
메시지큐 (Message Queue) 이란?
- 정의
- 메시지 큐는 메시지를 큐 형태로 저장하고 전달하는 시스템
- 발행(Publish)자가 큐에 메시지를 추가하면, 소비(Consume)자는 큐에서 메시지를 읽고 삭제 처리
- 시스템 간의 비동기 데이터 통신이 가능.
- 기능
- 비동기 데이터 통신: 발행자와 소비자가 동시에 동작하지 않아도 데이터를 교환
- 데이터 완전성 보장: 메시지를 안전하게 저장하고 전달하여 데이터 손실을 방지
- 확장성 제공: 시스템의 확장성을 높여 다수의 클라이언트와 서버 간의 통신을 효율적으로 관리
프로젝트에 적용 하고자 하는 이유
- 엣지 디바이스의 갑작스러운 중단 및 고장에 대비
- Queue를 통하여 다양한 종단점(Endpoint) 형식에 대응
프로젝트에 적용할 메시지큐 RabbitMQ란?
- 정의
- 오픈 소스로 이루어진 메시지 브로커
- AMQP (Advanced Message Queuing Protocol)를 기반으로 동작
- 메시지 큐이며, 다양한 시스템 간에 메시지를 안전하고 신뢰성 있게 전달
- 주요 기능 특징 (노랑색 : 사용하게된 주된 이유)
- 메시지 브로커링: 발행자와 구독자 간의 메시지를 중계하고, 메시지를 큐에 저장 및 전달
- 라우팅: 메시지를 여러 큐로 라우팅할 수 있는 기능.
- 고가용성: 클러스터링을 통해 시스템의 가용성 향상, 데이터 손실을 방지
- 플러그인 지원: 인증, 인증서 관리, 모니터링 위한 매니저 기능 다양한 플러그인을 제공
로컬 환경 구동을 위한 docker-compose 작성
- RabbitMQ 운영에 대한 이미지 설정값 및 Port 지정
- 환경변수를 통해 생성 시 기본 관리자 설정
- 무중단 서비스 구현
Docker compose 실행방법: docker-compose.yaml이 존재하는 디렉토리에서 ‘docker-compose up –d’ 실행
로컬 환경에서 작동
- 컨테이너 생성 후 접속 사진
- 접속방법 : 작동 후, localhost:15672 접속
6~7 주차 [학습 , 구축]
Telegraf 이란?
- 정의
- 오픈 소스 서버 에이전트로, 다양한 시스템과 애플리케이션의 메트릭 데이터를 수집하고 전송
- InfluxData 사에서 개발한 TICK 스택의 일부이다
- 기능
- 데이터 수집: 다양한 애플리케이션에서 메트릭 데이터를 수집할 수 있는 플러그인 제공
- 데이터 처리: 수집된 데이터를 변환하거나 필터링하는 기능
- 데이터 버퍼링: 데이터를 설정된 기간을 집계하여 전송하는 기능
- 데이터 출력: 수집된 메트릭 데이터를 다양한 데이터베이스와 서비스로 전송
프로젝트에 적용 하고자 하는 이유
- RabbitMQ에서 Consumer를 통하여 Telegraf의 데이터 수집
- Telegraf의 데이터 처리를 통해 InfluxDB에 데이터 삽입에 맞게 변환
- Telegraf의 데이터 출력을 통해 InfluxDB에 데이터 삽입
Docker로 Telegraf 구동 및 구현
Dockerfile 설명
- Telegraf의 이미지와 버전을 선정
- Telegraf 생성에 참조하는 Config(설정값) 로컬에서 컨테이너 환경으로 복사
- 이미지 기반 컨테이너 상에서 플러그인 설치
- 구동 명령어 실행
로컬 환경에서 작동 및 구성 파일 설명
- Telegraf 운영에 대한 세팅값
- 작동을 위한 inputs.amqp_consumer를 통해 데이터 수집
- 작동을 위한 outputs.influxdb_v2를 통해 데이터 출력
InfluxDB란?
- 정의
- InfluxDB는 오픈 소스 시계열 데이터베이스 시스템
- 시계열 데이터베이스는 시간 기반의 데이터 수집, 저장, 조회를 위해 설계
- InfluxDB는 특히 높은 쓰기 및 읽기 성능을 제공
- 기능 및 설명 [노란색 : 적용하고자 하는 이유]
- 타임스탬프 기반 데이터: 각 데이터 포인트는 타임스탬프와 함께 저장되며, 시간 기반의 쿼리를 효율적으로 처리
- 내장 대시보드 및 시각화 : Chronograf와 같은 도구와 통합하여 데이터 시각화 및 대시보드를 제공
- RabbitMQ 운영에 대한 최신 이미지 설정 및 Port 지정
- 환경변수를 통해 생성 시 기본 관리자 설정 및 버킷 이름 설정
- 무중단 서비스 구현
로컬 환경에서 작동
8~9 주차 [구축]
엣지 디바이스의 실시간 데이터 발행(Publisher) 코드 구현
- 구현 언어 : Python
- 라이브러리 : pika, psutil, json, time
엣지 디바이스의 CPU 및 Ram 정보를 수집
- psutil 라이브러리를 사용하여 CPU 사용률과 메모리 정보를 수집
- endpoint 매개변수에 따라 반환되는 데이터 형식 결정
- 수집된 데이터를 Influx Line Protocol 형식 또는 JSON 형식으로 변환
엣지 디바이스에서 RabbitMQ를 연결
- pika 라이브러리를 사용하여 RabbitMQ 서버에 연결
- RabbitMQ 서버의 IP, 포트 설정
엣지 디바이스에서 RabbitMQ로 데이터 전송
- [프로젝트 특징] Rabbit MQ 특성인 교환기(exchange)와 라우팅 키(routing_key)만 사용하여 전송
- 전송 결과 터미널 출력
Client에서 실시간 데이터 수신 기능 GUI 구현
- 구현 언어 : Python
- 라이브러리 : tkinter, cv2, json, pika, PIL, threading
GUI 설정
- RTSP URL을 입력할 수 있는 텍스트 필드와 시작/중지 버튼을 배치
- 비디오 스트림을 표시할 레이블과 시스템 리소스 정보를 표시할 레이블을 배치
송출되는 비디오 영상 스트리밍 시작
- 사용자가 입력한 RTSP URL을 사용하여 비디오 스트림을 시작
- 스트리밍이 이미 진행 중일 경우 에러 처리
- 스트리밍이 성공적으로 시작되면 update_video_stream 을 호출하여 프레임을 지속적으로 갱신
송출되는 비디오 영상 스트리밍 (업데이트)
- 비디오 스트림에서 프레임을 읽고, 이를 Tkinter 레이블에 표시
- 스트리밍이 중지되거나 오류가 발생하면 이를 처리하고 스트리밍을 중지
수신을 위한 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 구조
infoModel.js에서 RabbitMQ를 연결 후 데이터 수신
MVC 패턴에 맞게 데이터 처리후 EJS에 표시 구현
- infocontroller.js
- infoRoutes.js
- server.js를 통해 수신받은 값을 views 로 전달
로컬환경 구동
간단한 고찰 : 당시 Node.js에 대한 이해가 깊지 않았고 추가 기능 구현을 하다보니 코드가 간결하지 않았다. 이 부분은 참고만 해주세요!
제작 클러스터 내 배포
클러스터 배포를 위한 YAML 작성
- 기존 Docker-compose 기반 파일을 YAML 로 재작성 진행
- 기존 작성되었던 파일의 환경변수 또한 동일 하게 작성
클러스터 배포 순서 [kubectl apply –f ‘파일명’]
- namespace.yaml
- influxdb-deployment.yaml
- rabbitmq-deployment.yaml
- telegraf-configmap.yaml
- telegerf-deployment.yaml
제작 클러스터 내 배포 이후 정상 작동 테스트
⚬ 카메라 작동을 위한 stream.sh 를 실행
⚬ monitor_GUI.py를 실행
⚬ producer_app.py를 실행
⚬ GUI를 통한 영상, 데이터 정보 실시간 출력 결과 & InfluxDB에 실시간으로 들어오는 데이터 정보 조회
⚬ 클러스터 내부 저장소에 주기적으로 사진 저장 시작 & 클러스터 내부 저장소에 주기적으로 사진 저장 확인
고찰 및 향후 연구 방향
고찰
프로젝트 수행 과정에서는 RTSP 프로토콜이 보안에 취약하다는 점을 발견하였다.
카메라를 통한 영상 송출 과정에서 IP 주소와 포트 번호를 통해 쉽게 수신할 수 있다는 문제가 있었다.
이를 해결하기 위해 추후 RTSP 프로토콜을 활용한 사용자 인증 기반 플랫폼이 대안이 될 수 있다고 생각했다.
향후 연구 방향
- 위에서 고찰한 바와 같이 보안성이 보장된 RTSP 기반 프로토콜 영상 송출 플랫폼을 개발한다.
- 엣지 디바이스에서 추가적인 정보(온도, 습도 등)를 수집하고, 이를 기반으로 엣지 디바이스 또는 클러스터의 이상 상태를 예측하는 기계학습 모델을 구현한다.
좋은 기회로 프로젝트를 마무리 할 수 있었고, 설계하고 구축하는 좋은 경험이 될 수 있었다.
다음 포스팅은 대한전자공학회 하계 학술대회에서 참석하여 피드백 받은 부분을 포스팅하며 참석 후기를 작성할 계획이다.
< 포스팅 내부의 오개념이 있을 수 있습니다. 피드백은 언제나 환영합니다. 발견 시 댓글 남겨주세요!>
'Kubernetes_쿠버네티스' 카테고리의 다른 글
[K3s] Raspberry PI 4 에 K3s 설치하여 클러스터 구축하기 (0) | 2024.04.11 |
---|---|
[Kubetnetes/K8s] 쿠버네티스 Service(Cluster IP, NodePort, LoadBalancer) 개념 잡기 (0) | 2023.07.27 |
[Kubernetes/K8s] 쿠버네티스란? (0) | 2023.07.25 |
[K8S] 쿠버네티스 특정 노드에 배포하기 (0) | 2023.07.21 |
[K8S] deployment 롤링 업데이트 하기 (0) | 2023.07.19 |