본문 바로가기

Cloud/Kubernetes

내 너를 잊지 않겠다... Kubevirt

이상하게 자꾸 나를 따라다니는 Kubevirt에 대해서 포스팅하려고 한다. 

1. Container로 옮길 수 없는 레거시 업무들

 서버는 멋지고 간지나게 후지쯔로 사서 리눅스도 딱 올렸는데 기존 업무가 IIS를 사용하는 업무라면 어떻게 해야할까? (물론 이전에 검수하겠지만) 아니면 쓰는 업무가 겁나 예전꺼여서 3버전 커널을 사용한다면? 이런 여러가지의 이유로 컨테이너로 이전할 수 없는 업무들이 존재한다. K8S도 비슷한 고민을 했을거다. 이걸 억덕게하쥐?

2. Kubevirt

 사실 환경에서 KVM 같은 하이퍼바이저를 설치하면 해당 업무를 띄울 수 있긴하다. 하지만 K8S 환경에서 사용하고 싶은걸.. 귀찮다구..로 인해서 Redhat은 Kubevirt라는 add-on을 만들어 오픈소스로 공개했다.

 2017년에 공개된 만큼 3년정도의 연차를 가진 Add-on이다. Kubernetes는 API를 통해 모든 리소스를 관리하는데 사용자가 새로운 API를 추가할 수 있게 만들어놓았다. Add-on은 내가 필요한 리소스를 추가해서 입맛에 맞게 기능을 추가하는 플러그인같은 존재이다. 

 Add-on은 CRD와 Operator를 통해 동작하는데 Kubevirt의 CRD를 먼저 봐보자.

3. CRD

 Kubevirt는 VM / VMI / VM Replicaset / VM Preset / VM migration을 CRD로 추가한다. 제일 중요한건 아무래도 VM일 것이다.

CRD로 정의된 VM은 yaml을 통해 하나의 객체로 생성할 수 있다. 이 때에 VM의 spec을 정해주고 여러가지 옵션을 넣어줄 수 있는데 이런 내용은 api 문서에서 확인하도록 하자.

3. Operator

 그냥 component 소개라고 봐도 무방할 것 같다. 요청으로 날아온 VM.yaml 애들은 실제로 VM으로 만들어주고 관리해주는 역할을 한다.

Component 명 설명
virt-api

•클러스터 내에서 VM을 관리하기 위한 HTTP RESTful 진입점을 제공

•사용자의 요청에 대한 유효성을 검사

virt-controller

•Kubernetes API Server에 새로운 VM 요청이 들어오면 VM을 실행할 Pod를 생성 및 관리

•VM Pod가 스케줄링 되면 VM의 노드 정보를 업데이트하고 제어권을 virt-handler로 전달

•클러스터 내 VMI의 상태 관리

virt-handler

•Daemonset으로 배포되어 각 노드에서 실행

•virt-controller에게 제어권을 전달 받은 뒤 VM의 상태 변경

•Libvirt를 통해 Stop/Update/Status/Restart 담당

virt-launcher

•VM을 실행하는 container

•컨테이너는 virt-launcher를 실행하여 VM 프로세스에 필요한 cgroup 및 네임스페이스 제공

•virt-handler로부터 VM의 요소를 전달 받아 libvirtd를 통해 VM 생성

•VM 모니터링 수행

libvirtd

•VM을 관리하는 표준적인 API를 제공하여 KVM, Xen 등 하이퍼바이저의 종류에 구분 없이 동작하는 API

•VM Pod 안에 존재하며 VM의 생명주기를 관리

•Kubevirt의 경우에는 KVM-QEMU 사용

 얘네들은 Kubernetes Cluster 안에서 다음과 같이 작동한다. controller와 handler는 계속 API Server를 리슨하고 있고 요청에 따라 자신들의 역할을 수행한다.

4. Network

 네트워크는 어떻게 이루어질까? 일단 기본적인 pod 네트워크를 따른다. 그러려면 어떻게 해야되냐.. VM의 인터페이스가 Pod의 인터페이스여야한다. 때문에 다음과 같은 구조로 만들어진다.

CNI가 Pod 인터페이스를 만들어주면 Pod 내에서 그 인터페이스의 정보를 저장한다. 그리고 정보를 이용해 DHCP 대역을 만들어 브릿지를 생성한 후 DHCP 대역에서 정보를 부여해준다. 가상 인터페이스를 이용해 VM과 통신할 수 있도록 하고 VM에게 Pod에게 준 인터페이스 정보를 줘서 Pod 인터페이스처럼 보이게한다.

 그렇기 때문에 Pod 네트워크를 가질 수 있게 되는 것이다. 이런 일은 전부 Libvirtd가 해준다.

 

기본은 이렇고 파면 팔수록 어려운게 가상화이다. 게다가 K8S의 가상화라니 윽.. 하지만 알아야 하는 자료이니 꾸준히 정리해서 업로드해보도록 하겠다.