이 문서는 Linux 가상화 환경을 구축하고 관리하기 위한 혁신적인 플랫폼에 대해 소개합니다. 이 시스템은 Incus를 기반으로 하며, 사용자 친화적인 프론트엔드와 강력한 백엔드 구조를 통해 효율적인 컨테이너 관리를 제공합니다. 이 플랫폼은 보안, 확장성, 그리고 사용자 경험 측면에서 뛰어난 성능을 자랑합니다.
Go로 작성된 프로그램을 빌드하기 위한 기본적인 준비가 필요합니다.
linux_virt_unit
: 특정 기능 구현을 위한 코드와 모듈이 포함된 하위 디렉토리입니다. 예를 들어, 컨테이너 상태 모니터링 및 로그 관리 등 다양한 관리
기능을 포함합니다.
initial_setup.sh
, install_svc.sh
) 제공으로 간편한 설치 및 구성이 가능합니다.이 플랫폼을 활용하거나 기여하려면 다음 단계를 따르세요:
git clone https://github.com/gg582/linuxVirtualization.git
cd linuxVirtualization
./initial_setup.sh
sudo systemctl start mongodb
make
./initial_setup.sh
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를 이용하지 않고 직접 검증하는 것을 권장합니다.
이 플랫폼은 복잡한 컨테이너 관리 작업을 단순화하고, 사용자 친화적인 인터페이스를 통해 효율적인 시스템 관리를 가능하게 합니다. 다양한 기능과 확장성으로 인해 다양한 환경에서 유용하게 활용될 수 있습니다.