본문 바로가기
프로젝트

Kubernetes 기반 동적 코드 실행 엔진 - 프로젝트 개요

by Antraxmin 2025. 1. 8.

학기 마무리와 함께 졸업작품과 졸업논문을 모두 통과한 후 지난 개발 여정을 되돌아보게 되었다. 졸업작품인 생성형 AI 기반 문제 생성 시스템 자체보다 이 시스템에 탑재하기 위한 쿠버네티스 기반의 동적 코드 실행 엔진 개발이 훨씬 더 복잡하고 어려웠다. 실제 완성된 논문에서도 이 부분이 거의 절반 이상을 차지할 만큼 중요한 비중을 차지했다. 

 

특히 이번 학기 후반부에는 거의 모든 시간을 코드 실행 엔진 개발에 쏟아부었다. 하루종일 쿠버네티스 문서를 읽고 밤늦게까지 SSH 프로토콜 스펙을 연구했다. 주말에도 코드를 작성하고 실험과 테스트를 반복하며 버그와 며칠을 씨름하기도 했다. 처음 접하는 기술도 많아 어려웠지만 동시에 매 순간이 배움의 연속이었다. 

 

개발 과정에서 마주친 문제들이 워낙 많았기에 그때그때 문서화해두었는데, 특히 쿠버네티스와 SSH 프로토콜 관련 이슈들은 나중에 다시 참고할 수 있도록 꼼꼼히 기록해두었다. 이런 문서들을 정리하다 보니 프로젝트를 통해 얻은 기술적 인사이트를 나만 알고 있기에는 너무 아까웠고, 어떻게든 블로그 시리즈로 작성해서 공유하고 싶었다. 첫 글에서는 프로젝트의 시작점이 된 기술적 결정들과 그 배경에 대해 이야기해보려 한다. 


 

졸업작품 주제는 생성형 AI 기반의 개인 맞춤형 알고리즘 학습 시스템이었다. 이 시스템은 Chat GPT API와 연동하여 사용자 수준에 맞는 알고리즘 문제를 자동으로 생성하고, 코드 실행 및 피드백을 제공하여 학습 성과를 향상시키는 것을 목표로 했다. GPT API를 연동하여 맞춤형 문제를 생성하는 것은 프롬프트를 얼마나 잘 설계하느냐에 달렸기에 체감상 기술적 난이도는 크게 어렵지 않았다. 지도교수님께 1차 구현 피드백을 부탁드렸을 때 이미 문제 자동 제작 기능은 모두 완성되어 있었지만 코드 실행 엔진의 설계와 구현 방향성에 대해서는 고민의 연속이었다. 

 

이 시스템의 핵심 기능 중 하나는 사용자가 제출한 코드가 언어나 버전에 상관없이 실행될 수 있는 환경을 제공하는 것이었다. 기존 상용 코딩 테스트 플랫폼처럼 정적이고 제한적인 실행 환경을 제공하는 것은 프로젝트의 목표와 맞지 않았다. 따라서 다중 사용자 환경을 지원하면서 언어와 실행 버전의 제약을 없애고 자원을 동적으로 관리하며, 문제별 실행 환경을 자동으로 생성 및 회수하는 시스템을 구축해야 했다. 이러한 요구사항은 단순히 기능을 구현하는 것을 넘어서 성능과 안정성까지 고려해야 하는 새로운 도전이었다.

 

기술적 의사결정 과정  

시스템의 핵심 기능인 유연한 코드 실행 환경을 구현하기 위해 초기에는 여러 가지 접근 방식을 고민했다. 가장 먼저 떠올린 것은 많은 개발자들이 선택하는 Docker 기반의 실행 환경이었다. Docker를 사용하면 격리된 환경에서 코드를 실행할 수 있고, 이미지만 잘 관리하면 다양한 언어와 버전을 지원할 수 있을 것 같았기 때문이다. 

 

하지만 실제로 설계를 시작하면서 여러 한계점들이 드러났다. 컨테이너를 동적으로 생성하고 관리하는 로직을 직접 구현해야 했고, 다중 사용자 환경에서 자원 관리와 스케줄링을 처리하는 것이 생각보다 복잡했다. 특히 동시에 여러 사용자의 코드가 실행될 때 자원 할당과 회수를 효율적으로 관리하는 것이 큰 과제였다.

 

그러던 중 최근 관심 있게 보던 기술인 쿠버네티스의 Pod 생명주기 관리 방식에서 영감을 얻었다. 쿠버네티스가 Pod 동적으로 생성하고 관리하는 방식을 보면서 이것을 코드 실행 환경에 적용할 있지 않을까 하는 아이디어가 떠올랐다. 코드 실행 요청을 하나의 Pod 만들고, 실행이 끝나면 자동으로 정리되는 방식이다.

 

예를 들어, 사용자가 Python 코드를 실행하고 싶다면

  1. Python 실행 환경이 구성된 Pod를 동적으로 생성
  2. 해당 Pod에서 코드를 실행
  3. 실행이 완료되면 Pod를 자동으로 정리

이러한 방식으로 각 코드 실행 요청을 독립된 Pod로 처리하면 좋을 것 같았다. 하지만 Pod 내부에서 실행되는 코드를 어떻게 제어하고 모니터링할 것인지에 대한 해결책이 필요했다. 특히 실행 중인 프로세스의 표준 입출력을 실시간으로 처리하고 필요한 경우 즉시 중단할 수 있는 기능이 필요했다.

 

이 문제를 고민하던 중 평소 서버 관리에 사용하던 SSH 프로토콜에서 해답을 발견했다. SSH는 보안 연결을 통해 원격 시스템을 제어할 수 있는 프로토콜로, 실시간 입출력 처리와 프로세스 제어가 가능하다. 여기서 한 걸음 더 나아가 SSH 프로토콜을 직접 구현하면 실행 환경에 대한 더 세밀한 제어가 가능할 것이라는 생각이 들었다. (사실 OpenSSH 같은 검증된 솔루션을 사용하는 것이 더 안전하고 빠른 선택이었겠지만... SSH 서버를 직접 구현하겠다고 결정한 것은 개발자로서의 순수한 지적 호기심이 더 크게 작용하지 않았나 싶다. 네트워크 프로토콜을 직접 구현해보면서 깊이 있게 이해하고 싶었고, 동시에 시스템의 동작을 완벽하게 제어하고 싶다는 욕심도 컸다..)

 

이렇게 Kubernetes의 동적 Pod 관리와 SSH 프로토콜 기반 실행 제어를 결합한 코드 실행 엔진이자 클라우드 네이티브 애플리케이션을 개발하겠다는 아이디어가 탄생했다. 사용자의 코드 실행 요청이 들어오면 전용 Pod가 생성되고 SSH 연결을 통해 코드가 실행되며, 실행이 완료되면 자동으로 정리되는 방식이다.

 

실제 수업시간에 진행했던 프로젝트 발표자료 일부

 

아이디어의 실현 가능성을 검증하기 위해 코드 실행 엔진을 독립된 프로젝트로 분리하여 2024년도 2학기 '클라우드 컴퓨팅' 과목의 기말고사 대체 프로젝트로 진행하기로 결정했다. 다음 글부터는 이 아키텍처를 실제로 어떻게 구현했는지, 그리고 그 과정에서 마주한 기술적 과제들을 어떻게 해결했는지 자세하게 정리해보려고 한다.