본문 바로가기

Cloud/Kubernetes

Kubernetes의 Virtualisation Operator인 KubeVirt 소개 (따단)

개인적인 공부를 위하여 해당 문서를 번역한 포스팅입니다. 정확한 정보가 아닐 수 있습니다.


Kubervirt는 libvirt virtual machine의 관리가 가능한 Kubernetes add-on이다. 이 add-on은 Kubernetes 환경에서 Virtaul machine(이하 VM)의 스케줄링을 관리하는데 사용된다.

 배포 방식에서 Container 방식의 채택이 증가하게 되자 어플리케이션의 이식성이 중요하게 되었다. Kubernetes는 Kubernetes의 기능과 뛰어난 커뮤니티 지원을 통해 배포 프레임워크의 선두 주자가 되고 있다. 어플리케이션을 Container로 만들 수 없을 때에도 공통 프레임워크를 사용하여 다른 워크로드를 관리할 수 있어야 한다. Operator는 Kubernetes 응용 어플리케이션을 패키지, 배포 및 관리하는 방법으로 Kubernetes 환경에 배포하고 어플리케이션은 Kubernetes API와 Kubectl 도구를 사용하여 관리된다. You can think of an operator as the runtime that manages this type of application on Kubernetes.

 Operator Framework는 개발자 및 런타임 Kubernetes 도구를 제공하는 오픈소스프로젝트로 Operator의 개발을 가속화 시킬 수 있다. 이 프레임워크는 다음 요소를 가지고 있다.

The Operator SDK : Kubernetes API에 대한 지식을 필요로하지 않고 전문 지식을 바탕으로 Operator를 구축함. Operator 구축, 테스트, 패키징 도구를 제공한다. SDK는 어플리케이션 비즈니스 로직으로 Kubernetes API를 사용하여 확장, 업그레이드, 백업 작업을 수행하는데 도움이 된다.

The Operator Lifecycle Manager : 설치 및 업데이트를 감독하고 Kubernetes에서 실행되는 서비스의 수명 주기를 관리한다. Operator Lifecycle Manager는 Kubernetes에서 operator의 관리를 용이하게하는 백플레인(기기의 뒤쪽에 위치한 거라구 함)이다. 관리자는 특정 네임스페이스에서 사용 가능한 operator와 실행중인 operator의 상호작용이 가능한 operator를 제어할 수 있다.

Operator metering : Operator에 대한 사용량의 리포트가 가능하다.

Introducing Kubevirt

 Kubevirt는 Kubernetes의 VM 관리 add-on으로 개발되어 컨테이너로 변환이 쉽지 않은 기존 VM 기반 워크로드의 환경을 가진 개발 팀의 요구를 해결한다. 개발자가 공통 환경에서 VM이외의 컨테이너에 있는 응용 프로그램을 빌드, 수정, 배포 할 수 있는 통합 개발 플랫폼을 제공한다.

 Kubevirt는 Kubernetes Custom Resource Definitions API를 통해 virtualisation resource types(ex : VM)을 추가하여 Kubernetes를 확장한다. 기본적으로 Kubernetes에서 제공하는 리소스 이외에 추가 리소스를 관리하는 기능을 제공한다. 하지만 리소스만으로는 VM을 실행하기에 충분하지 않다. 그래서 기존 환경에 추가적으로 컨트롤러와 에이전트를 실행해서 로직을 실행할 수 있도록 한다.

Kubevirt architecture

The architecture of Kubevirt

 Kubevirt는 service-oriented architecture + choreography pattern을 사용하여 구축되었다. 구축된 Kubernetes 클러스트에 추가 기능을 제공하여 VM의 관리를 수행한다. 

 Kubevirt는 Kubernetes 클러스터 위에 배치되므로 Kubevirt를 통해 관리되는 VM 옆에서 Kubernetes native workloads를 실행할 수 있다. Kubernetes에서 지정된 형식에 따라 포드가 어떻게 생성되는지, 컨트롤러가 어떻게 요구사항에 맞춰 포드의 상태를 제어하는지 알고 있을 것이다. Kubervirt는 Kubernetes API와 유사한 메커니즘으로 로직을 위한 컨트롤러, 노드 별 추가 데몬을 사용한다. 위의 architecture 그림을 보면 추가된 컨트롤러와 데몬을 보여주며 그들 사이에서 어떻게 통신하는지 알 수 있다.

Components of Kubevirt

 Kubevirt는 아래와 같은 서비스 구성 요소를 가진다.

virt-api-server : 가상화 관련 흐름의 entry point 역할을 하며 가상화 관련 리소스 정의를 업데이트 한다. Kubevirt의 entry point 역할을 하며 제공된 VM의 디폴트 설정이나 유효성을 검사한다. 

virt-controller : 가상화 기능을 제공하여 VM을 모니터링하고 관련 포드를 관리한다. virt-controller는 VM 객체와 관련된 포드의 수명주기를 관리한다.

virt-handler : 모든 호스트에 필요한 Kubernetes DeamonSet이다. Kubelet의 기능과 유사한 기능을 수행하며 VM의 변경 사항을 모니터링하여 반응한다. 변경이 감지되면 요구사항에 알맞은 상태로 변경하기 위해 VM 작업을 수행한다.

virt-launcher : cgroup, namespace를 제공하여 VM 프로세스를 호스팅하는데 사용한다. virt-handler는 VM의 CRD 오브젝트를 virt-launcher로 전달하여 VM을 실행할 수 있도록 virt-launcher에 신호를 보낸다.

libvirtd instance  : 모든 VM pod에 위치해있으며 virt-launcher는 libvirtd를 사용하여 VM의 수명주기를 관리한다.

 Kubernetes와 마찬가지로 Kubevirt는 추가 컨트롤러나 플러그인을 설치하여 스토리지, 네트워크를 위한 추가 기능을 가질 수 있다.

Kubevirt community

 Kubevirt는 현재 진행중인 작업으로 Github에서 호스팅되며 Apache License 2.0 Version으로 배포된다. 컨트리뷰터들은 FreeNode의 #Kubevirt를 통해 IRC에 참여한다. 개발자 토론을 위해 Kubervirt-dev Google 그룹에 가입할 수 있다.