프로젝트

Kubevirt를 활용한 VM 및 컨테이너 통합 관리 프로젝트 5 / Kubevirt를 사용하여 VM 생성하기

두뚜 2021. 11. 4. 11:48

'kubevirt'는 쿠버네티스로 컨테이너 뿐 아니라 가상머신까지 관리할 수 있는 virtual machine management 애드온이다.

KubeVirt 기술은 Kubernetes 를 채택했거나 채택하고자 하지만 쉽게 컨테이너화 할 수 없는 기존 가상 머신 기반 워크로드를 보유 하고 있는 개발 팀의 요구 사항을 해결한다 . 보다 구체적으로, 이 기술은 개발자가 공통의 공유 환경에서 가상 머신과 애플리케이션 컨테이너에 있는 애플리케이션을 구축, 수정 및 배포할 수 있는 통합 개발 플랫폼을 제공한다.

이점은 광범위하지만 중요하다. 기존 가상 머신 기반 워크로드에 의존하는 팀은 애플리케이션을 신속하게 컨테이너화할 수 있다. 개발 워크플로에 직접 배치된 가상화된 워크로드를 사용하여, 개발팀은 원하는 대로 특정 가상화서버를 지속적으로 유지하면서 워크로드를 기능 별로 분해할 수 있다.

여기서 기능별로 분해할 수 있다는 것은 MSA를 사용한다는 것이다. MSA는 상호 독립적으로 배포되어 개별 프로세스로 구동되기 때문에 전체 서비스의 중단 없이 배포할 수 있고, 각 서비스에 따라 개별적으로 서버를 나눌 수 있어 메모리 및 CPU 관리에 효율적이다. 또한 분리된 서비스별로 가장 적합한 기술을 선택하여 개발할 수 있다는 장점이 있다. 따라서 Kubevirt는 MSA에 적합한 기술이다.

 

1) Kubevirt 장점

Kubevirt를 사용하면 우선 서비스를 Host OS와 독립적으로 운용할 수 있다는 장점이 있다. 컨테이너는 Host OS에 의존적인 반면 VM은 Host OS와 독립적으로 운영되므로 쿠버네티스 환경에서 서비스를 더 안전하게 사용할 수 있다.

두번째로는 컨테이너와 VM을 하나의 플랫폼에서 통합 관리할 수 있다는 점이다. 관리 플랫폼이 2개 이상이 된다면 네트워크 및 리소스 관리가 복잡해지는 상황이 발생하는데, kubevirt를 이용하면 컨테이너와 VM 모두 통합 관리할 수 있다.

마지막으로 쿠버네티스의 장점을 사용할 수 있다는 것이다. K8S와 같이 Scheduling이 가능하여 확장성이 좋고, VM에 문제가 생기면 Self-healing을 사용하여 자동으로 재생성 시켜줄 수 있다.

 

2) Kubevirt 동작 원리

Kubevirt가 VM을 띄우는 동작은 다음의 그림과 같다. 사용자가 원하는 cpu, memory, NIC 등 VM의 하드웨어 구성을 요청하면 Master의 virt-controller가 적합한 Worker 노드를 고른다. 그러면 virt-handler가 하드웨어 구성을 참조하고 VM Pod 내의 libvirtd 인스턴스를 사용하여 virt-launcher에게 VM 생성을 알린다. libvirtd는 vmware, xen, kvm-qemu와 같은 가상화 플랫폼을 지원하는 API로, 하이퍼바이저의 종류와 상관 없이 동작한다. VM Pod 안에 존재하여 VM의 생명주기를 관리하는 역할을 하는데, Kubevirt에서 동작하는 libvirt의 경우 kvm-qemu만을 지원한다. 이러한 libvirtd를 통해 virt-launcher가 VM을 시작하고 모니터링한다.

 

3) Kubevirt를 사용하여 VM 생성

이제 Kubevirt로 VM을 생성하는 과정이다. OS는 우분투를 이용하였으며 쿠버네티스 구성은 canonical에서 지원하는 microk8s를 사용했다.

 

먼저 snap을 통해서 단일 노드에서 microk8s 손쉽게 설치하여 쿠버네티스 환경을 구성한 후, 프록시를 통해서 대쉬보드에 접속한다.

다음으로 쿠버네티스 상에서 vm을 구동하도록 Kubevirt를 yaml을 통해서 설치한다.

 

vm 이미지를 가져오기 위한 cdi와 vm을 관리하기 위한 virtctl도 설치해준다.

  • CDI

  • Virtctl

CDI는 KubeVirt에서 VM을 구동시키기 위해 디스크 이미지를 데이터 볼륨이라 하는 PVC의 추상화된 형태에 import하는 서비스이다. CDI가 Kubernetes PVC를 데이터볼륨 방식으로 추가하면 CDI 컨트롤러가 이를 감지하고 Import 포드를 시작한다. 즉, Kubernetes 클러스터로 VM의 디스크 이미지를 업로드하는 프로세스와 VM에 대한 스토리지를 제공하는 프로세스를 용이하게 하는 기능을 한다.

virtctl은 가상머신을 관리하기 위한 명령어 유틸리티로, 가상머신의 시작 및 중지, 라이브 마이그레이션, 가상머신 디스크 이미지 업로드를 커맨드 창을 이용해서 쉽게 동작시키도록 한다.

 

그 후 vm으로 생성하고자 하는 이미지를 업로드하면 되는데, 저희는 윈도우 VM을 띄우기 위해 Windows 2012 이미지를 사용했다. 윈도우 이미지 ISO 파일을 다운로드 받는다.

 

virtctl image-upload 명령어를 사용하여 win2012라는 이름의 pvc와 image 경로, 그리고 cdi-uploadproxy node의 IP 주소를 지정하여 cdi 컨트롤러가 pvc를 감지하게 한다.

 

다음으로 VM을 생성하는 yaml 파일을 작성하는데, Volume 필드에 윈도우 이미지가 업로드 된 win2012 pvc를 지정해주어 vm생성시 설치디스크를 읽을 수 있도록 해준다.

 

yaml 파일의 spec으로 cpu core 개수와 디스크, cdrom, 메모리 등을 설정할 수 있어, 기존의 vm 생성 방식과 동일하게 하드웨어를 구성할 수 있다.

 

virtctl start 명령어로 VM을 시작하고 virt-viewer를 통해 VNC로 접속한다.

 

다음과 같이 윈도우 OS로의 VNC 접속을 확인할 수 있다.

 

4) Kubevirt 기능적 한계

Kubevirt는 웹을 통한 콘솔환경이 지원되지 않고 CLI 환경에서만 사용 가능하기 때문에 VM 생성, 배포, 관리 등이 직관적으로 파악하기 어렵다는 단점이 있다. 또 쿠버네티스에서 Kubevirt를 사용하는 것은 VM 의 하드웨어 구성을 수정하는 것도 어렵고, 자원 상황이나 vm이 실행되는 POD의 모니터링도 지원하지 않기 때문에 여러모로 불편한 점이 많다. 이러한 기능적 한계를 해결하기 위해 kubevirt를 OKD에서 설치, 구성했다.