본문 바로가기
클라우드/쿠버네티스

KubeVirt: 쿠버네티스에서 가상머신(VM)을 다루는 가장 현대적인 방법 🚀

by gasbugs 2025. 8. 3.

컨테이너 오케스트레이션의 왕, 쿠버네티스(Kubernetes). 이제는 컨테이너뿐만 아니라 가상머신(VM)까지 품에 안으려는 야심찬 프로젝트가 있습니다. 바로 KubeVirt입니다. 이 글에서는 쿠버네티스 위에서 VM을 네이티브하게 실행하고 관리할 수 있게 해주는 KubeVirt에 대해 자세히 알아보겠습니다.

 

https://www.redhat.com/ko/blog/kubevirt-joins-cloud-native-computing-foundation


KubeVirt란 무엇인가? 🤔

KubeVirt는 쿠버네티스를 위한 가상머신 관리 애드온(add-on)입니다. 쉽게 말해, 컨테이너를 관리하듯이 쿠버네티스 환경에서 가상머신을 생성, 실행, 관리할 수 있도록 해주는 오픈소스 프로젝트입니다.

전통적으로 VM은 하이퍼바이저(Hypervisor) 위에서, 컨테이너는 컨테이너 런타임 위에서 별도로 관리되었습니다. 이로 인해 개발팀과 운영팀은 두 개의 다른 기술 스택과 워크플로우를 유지해야 하는 부담이 있었습니다. KubeVirt는 이러한 이질적인 환경을 하나로 통합하여 VM 워크로드를 현대적인 컨테이너 플랫폼인 쿠버네티스로 가져오는 것을 목표로 합니다.

KubeVirt를 사용하면, VM은 쿠버네티스가 이해할 수 있는 특별한 종류의 파드(Pod) 안에서 실행됩니다. 덕분에 우리는 kubectl과 같은 익숙한 쿠버네티스 도구와 API를 사용하여 VM의 생명주기를 완벽하게 제어할 수 있게 됩니다.


왜 KubeVirt를 사용해야 할까? ✨

KubeVirt가 제공하는 핵심적인 이점은 다음과 같습니다.

1. 단일 플랫폼으로의 인프라 통합

가장 큰 장점은 컨테이너와 VM을 동일한 플랫폼에서 관리할 수 있다는 것입니다. 이는 인프라의 복잡성을 크게 줄여주고, 운영팀의 관리 부담을 덜어줍니다. 더 이상 VM 관리 시스템과 컨테이너 관리 시스템을 별도로 운영할 필요가 없습니다.

2. 기존 VM 워크로드의 현대화

모든 애플리케이션을 단번에 컨테이너로 전환하기는 어렵습니다. 특히 레거시 시스템이나 특정 OS 환경에 종속된 애플리케이션은 VM 형태로 유지해야 하는 경우가 많습니다. KubeVirt는 이러한 기존 VM 자산을 그대로 유지하면서 쿠버네티스의 강력한 기능(네트워킹, 스토리지, 스케줄링 등)을 활용할 수 있는 다리를 놓아줍니다.

3. 개발 워크플로우의 통일

개발자들은 VM이든 컨테이너든 상관없이 동일한 YAML 매니페스트 파일과 kubectl 명령어를 사용하여 애플리케이션을 배포하고 관리할 수 있습니다. 이는 개발 생산성을 높이고, 데브옵스(DevOps) 문화를 가속화하는 데 큰 도움이 됩니다.


KubeVirt의 아키텍처와 작동 원리 ⚙️

KubeVirt는 쿠버네티스의 사용자 정의 리소스 정의(CRD, Custom Resource Definition)를 활용하여 작동합니다. VirtualMachineInstance(VMI)라는 새로운 리소스 타입을 쿠버네티스에 추가합니다.

주요 구성 요소는 다음과 같습니다.

  • virt-controller: 클러스터 전반의 VM 관련 작업을 모니터링하고 관리하는 핵심 컨트롤러입니다. VMI 객체가 생성되면, 이와 연관된 파드(Pod)를 생성하는 역할을 합니다.
  • virt-handler: 각 쿠버네티스 노드에서 데몬셋(DaemonSet) 형태로 실행되며, 해당 노드의 VMI 파드를 관리하고 VM 프로세스가 정상적으로 실행되도록 보장합니다. 호스트의 libvirt 데몬과 통신하여 실제 VM을 구동시킵니다.
  • virt-launcher: KubeVirt가 생성하는 모든 VMI 파드 안에 존재하는 기본 컨테이너입니다. 이 컨테이너는 상위 libvirt 프로세스를 포함하고 있으며, 실제 가상머신 프로세스를 시작하고 관리하는 역할을 합니다.
  • virt-api: 쿠버네티스 API를 확장하여 VM 관련 모든 기능(예: 콘솔 접속, 시작, 중지)을 처리할 수 있는 진입점을 제공합니다.

사용자가 YAML 파일을 통해 VMI 생성을 요청하면, virt-controller가 이를 감지하고 VM을 실행할 파드를 생성합니다. 그러면 스케줄러에 의해 적절한 노드에 파드가 배치되고, 해당 노드의 virt-handler가 virt-launcher 파드를 통해 QEMU/KVM을 사용하여 실제 VM을 실행하는 흐름입니다.


주요 사용 사례 🎯

KubeVirt는 다음과 같은 시나리오에서 특히 유용합니다.

  • 레거시 애플리케이션 마이그레이션: 컨테이너화가 어려운 윈도우 기반 애플리케이션이나 특정 커널 의존성을 가진 리눅스 애플리케이션을 쿠버네티스 클러스터로 이전할 때.
  • 네트워크 기능 가상화 (NFV): 통신 분야에서 사용되는 VNF(Virtual Network Function)처럼 VM 형태로 패키징된 네트워크 장비를 쿠버네티스 위에서 실행할 때.
  • 개발 및 테스트 환경: VM과 컨테이너가 혼합된 복잡한 애플리케이션 스택을 단일 쿠버네티스 클러스터에서 쉽게 구축하고 테스트할 때.

결론

KubeVirt는 "VM vs 컨테이너" 라는 오랜 논쟁을 끝낼 수 있는 강력한 솔루션입니다. 두 기술의 장점을 모두 포용하여, 기존의 안정적인 VM 워크로드를 현대적인 클라우드 네이티브 생태계로 자연스럽게 통합할 수 있게 해줍니다. 인프라를 단순화하고 개발 생산성을 높이고 싶다면, KubeVirt는 반드시 주목해야 할 기술입니다.