Incus 가상화 매니저 앱

Posted by Lee Yunjin on April 13, 2025 · 9 mins read

Linux 가상화 관리 시스템: Incus 기반 컨테이너 관리 플랫폼

개요

이 문서는 Linux 가상화 환경을 구축하고 관리하기 위한 혁신적인 플랫폼에 대해 소개합니다. 이 시스템은 Incus를 기반으로 하며, 사용자 친화적인 프론트엔드와 강력한 백엔드 구조를 통해 효율적인 컨테이너 관리를 제공합니다. 이 플랫폼은 보안, 확장성, 그리고 사용자 경험 측면에서 뛰어난 성능을 자랑합니다.

요구사항

Go로 작성된 프로그램을 빌드하기 위한 기본적인 준비가 필요합니다.

핵심 구성 요소

백엔드 (Go 언어)

  • 기능 및 역할:
    • 컨테이너 관리: Incus 컨테이너의 생성, 삭제, 시작/중지 등의 기본적인 관리 작업을 REST API를 통해 수행합니다.
    • SSH 프록시: 사용자들이 안전하게 컨테이너에 접근할 수 있도록 Nginx를 통한 SSH 프록시 설정을 제공합니다.
    • 사용자 인증: 사용자 정보와 인증을 안전하게 처리하여 보안을 강화합니다. MongoDB 데이터베이스를 통해 사용자 데이터와 설정 정보를 영구적으로 저장 합니다.
    • 디렉토리 구조:
      • linux_virt_unit: 특정 기능 구현을 위한 코드와 모듈이 포함된 하위 디렉토리입니다. 예를 들어, 컨테이너 상태 모니터링 및 로그 관리 등 다양한 관리 기능을 포함합니다.

프론트엔드 (KivyMD)

  • 사용자 인터페이스:
    • 직관적 디자인: 사용자 친화적인 인터페이스를 통해 복잡한 컨테이너 관리 작업을 쉽게 수행할 수 있습니다.
    • 실시간 모니터링: 컨테이너 상태, 리소스 사용률, 로그 등을 실시간으로 확인할 수 있는 기능 제공.
    • 설정 및 관리: 사용자 정의 설정, 컨테이너 생성 및 삭제, 리소스 할당 등 다양한 관리 작업을 쉽게 수행할 수 있는 인터페이스 제공.

기술 아키텍처

시스템 아키텍처 다이어그램

주요 구성 요소 설명

  • 클라이언트 (KivyMD): 사용자와 직접 상호작용하는 프론트엔드 역할을 합니다. 사용자 친화적인 인터페이스를 통해 사용자들이 복잡한 작업을 쉽게 수행할 수 있도록 설계되었습니다.
  • REST API (Go): 백엔드와 프론트엔드 간의 통신을 담당하며, 컨테이너 관리 작업을 안전하게 처리합니다.
  • Incus / Incus API: 컨테이너 관리의 핵심 역할을 수행하며, 실제 컨테이너 생성, 삭제, 상태 확인 등의 작업을 Incus와 Incus를 통해 실행합니다.
  • MongoDB: 사용자 인증 데이터, 컨테이너 정보를 영구적으로 저장하여 시스템의 안정성과 확장성을 보장합니다.

주요 기능

컨테이너 관리

  • 생성 및 삭제: 사용자 정의 컨테이너를 쉽게 생성하고 삭제할 수 있습니다.
  • 상태 모니터링: 컨테이너 상태를 간단하게 모니터링하여 Running, Stopped, Frozen 등의 상탤르 알 수 있습니다.
  • sudo, SSH 자동 설정: 컨테이너를 상세하고 자유롭게 모니터링하고 사용할 수 있도록 sudo 권한, SSH를 자동 설정하고 여분 포트를 할당합니다.
  • 사용자 별로 분리된 권한: 모든 사용자는 자신이 생성한 컨테이너에만 접근 가능하며, Incus 서버에서 수동으로 제어하지 않는 이상 사실상의 마스터 유저가 없습니다.

보안 및 인증

  • 사용자 인증: 강력한 인증 메커니즘(TLS/SSL+AES256, 동적 키)을 통해 시스템에 대한 접근을 안전하게 관리합니다.
  • 데이터 보호: MongoDB를 통한 데이터 암호화 및 접근 제어로 보안을 강화합니다.

맞춤 설정 및 확장성

  • 초기 설정 스크립트: 배포를 위한 초기 설정 스크립트 (initial_setup.sh, install_svc.sh) 제공으로 간편한 설치 및 구성이 가능합니다.
  • 확장성: 다양한 Linux 배포판을 지원하여 사용자 환경에 맞춘 유연한 배포가 가능합니다.

향후 개선 방향

  • 다양한 배포 지원: 현재 Ubuntu 기반 배포를 넘어 다양한 Linux 배포판에 대한 지원을 확장합니다.
  • Incus 통합 향상: Incus와 Incus API 간의 통합을 더욱 강화하여 사용자 경험을 개선합니다.
  • 기능 추가: 자동 스케일링, 고급 모니터링 도구, 파일 업로드, 대시보드, 더 많은 사용자 정의 설정 옵션 등을 추가하여 플랫폼의 기능을 확장합니다.
  • 관리자용 모니터링 스택 추가: Prometheus나 Grafana 등 대중적인 모니터링 솔루션에 등록하기 위한 스크립트를 자동 생성합니다.

개발 및 커뮤니티 참여

  • 기여 촉진: 버그 수정 및 기능 개선을 위한 풀 리퀘스트와 이슈 제안을 환영합니다. 오픈 소스 커뮤니티의 참여를 통해 지속적인 발전이 이루어집니다.
  • 라이선스: MIT 라이선스 하에 오픈 소스이므로 커뮤니티의 기여와 수정을 적극 권장합니다.

시작하기

이 플랫폼을 활용하거나 기여하려면 다음 단계를 따르세요:

  1. 리포지토리 포크 및 클론: GitHub 리포지토리를 포크하고 로컬로 클론합니다.
    git clone https://github.com/gg582/linuxVirtualization.git
    cd linuxVirtualization
    
  2. 환경 설정: 필요한 소프트웨어와 의존성 설치
    ./initial_setup.sh
    
  3. 데이터베이스 설정: MongoDB를 설정하고 초기 데이터베이스를 생성합니다.
    sudo systemctl start mongodb
    
  4. 초기 설정 스크립트 실행: 배포를 위한 초기 설정 스크립트 실행
    make
    ./initial_setup.sh
    
  5. 클라이언트 실행: 프론트엔드 애플리케이션 실행
    python3 app/main.py
    

    혹은 Releases에서 apk 다운로드

이제 사용자 친화적인 인터페이스를 통해 컨테이너 관리 작업을 쉽게 수행할 수 있습니다. 커뮤니티의 지속적인 기여와 피드백을 통해 플랫폼은 더욱 발전할 것입 니다.

동시 작업 처리

이 REST API 서버는 각각의 요청에 대한 동시 작업 처리를 워커 풀을 만들어서 진행합니다.

// Start starts the worker goroutines for the container queue.
func (q *ContainerQueue) Start(numWorkers int) {
    log.Printf("Start: Starting %d worker goroutines.", numWorkers)
    for i := 0; i < numWorkers; i++ {
        q.wg.Add(1)
        go q.ContainerCreationWorker()
        q.wg.Add(1)
        go q.StateChangeWorker()
        q.wg.Add(1)
        go q.NginxSyncWorker()
    }
}

위 코드와 같이, 이 프로젝트는 각각의 동시성이 필요한 작업들에 대해 고루틴을 생성해 줍니다. 그리고, 각각의 작업들은 동시적으로 이전 작업에 대한 순차 대기 없이 처리됩니다.

func (q *ContainerQueue) StateChangeWorker() {
    defer q.wg.Done()
    for target := range q.StateTasks {
        if target.Status == "delete" {
            nginxDeletionMutex.Lock()
            DeleteContainerByName(target.Tag)
            nginxDeletionMutex.Unlock()

        } else {
            go ChangeState(target.Tag, target.Status)
        }
    }
}

이것은 특별히 대기해서 순차 처리할 필요없는 작업과 그렇지 않은 작업 모두를 잘 처리하는 고루틴입니다. 채널로 들어온 요청들을 일괄로 고루틴 처리하게끔 작성하였습니다. DeleteContainerByName의 경우 리버스 프록시의 설정 파일 역시 수정해야 하므로 파일의 동시 접근을 막기 위해 속도를 희생하고, 혹시 모를 워커 풀의 함수 중복 호출을 막기 위해 뮤텍스를 통해 순차 처리해야 합니다.

그러나 컨테이너 단순 상태 변화를 위한 메서드들은 병렬 처리하는 것이 이롭습니다.

또한, http_request 모듈의 경우, ChangeState를 호출하기 위한 함수를 적절한 상태에 맞게 매치시키게 되어있습니다. 마치 붕어빵의 소를 다르케 채워 굽는 것처럼 다른 호출을 전달해 주면 그만입니다. 해당 호출을 전달받은 HTTP Handler는 호출 유형을 ChangeState의 target.Status로 전달하여 작업을 수행합니다.

        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/register", incus_unit.Register).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/create", incus_unit.CreateContainer).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/request", incus_unit.GetContainers).Methods("POST")
        //from here to 
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/delete", incus_unit.DeleteByTag).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/stop", incus_unit.ChangeStateHandler("stop")).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/start", incus_unit.ChangeStateHandler("start")).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/pause", incus_unit.ChangeStateHandler("freeze")).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/resume", incus_unit.ChangeStateHandler("unfreeze")).Methods("POST")
        linux_virt_unit.LinuxVirtualizationAPIRouter.HandleFunc("/restart", incus_unit.ChangeStateHandler("restart")).Methods("POST")
        //here

빌드 검증

빌드 검증은 GitHub Action으로 자동 테스트됩니다. 그러나 서버에서 이루어지는 포트 포워딩 등의 작업 때문에 실행 여부에 대해서는 CI/CD를 이용하지 않고 직접 검증하는 것을 권장합니다.


이 플랫폼은 복잡한 컨테이너 관리 작업을 단순화하고, 사용자 친화적인 인터페이스를 통해 효율적인 시스템 관리를 가능하게 합니다. 다양한 기능과 확장성으로 인해 다양한 환경에서 유용하게 활용될 수 있습니다.