본문 바로가기

Cloud/Kubernetes

Kubernetes - KubeVirt

※ 해당 내용은 개인적으로 공부하며 정리한 내용이므로 정확한 자료가 아닙니다. 

 

 KubeVirt를 공부해야 해서 검색해봤는데 한국어 자료도 얼마 없고 정리도 할 겸 블로그에 포스팅 해본다. 나도 미국이나 북(중요함)유럽에서 태어났다면 얼마나 삶이 편했을까...

 공식 주소 : https://kubevirt.io/

 

KubeVirt.io

Virtual Machine Management on Kubernetes

kubevirt.io

깃허브 : https://github.com/kubevirt

 

KubeVirt

Managing virtualization workloads on Kubernetes. KubeVirt has 57 repositories available. Follow their code on GitHub.

github.com

KubeVirt의 공식자료에서는 다음과 같이 정의하고 있다.

 Technology enabling developer use of Kubernetes as a unified platform for building, modifying, and deploying applications residing in both containers and virtual machines in a common, shared environment.

 개발자가 공통의 Container, VM 환경에서 어플리케이션을 구축, 수정, 배포할 수 있는 통합 플랫폼으로 Kubernetes를 사용할 수 있는 기술이다.

 기존의 Kubernetes는 Container(Docker, LXC ...) 밖에 사용할 수 없었다. 이런 단점을 보완하기 위해 RedHat에서는 KubeVirt의 개발을 2016년부터 시작하였고, 2017년에 오픈소스로 공개하였다. KubeVirt에서는 Kubernetes에서 Virtual Machines를 관리할 수 있게(생성할 수 있게) 해준다. KubeVirt하에 생성된 VM은 Kubernetes의 기본적인 요소를 따를 수 있다.

Kubernetes의 기본 요소

- Scheduling

- Storage

- Networking

- Monitoring

- Tolling - Kubectl

KubeVirt의 특징

- Drops directly into existing Kubernetes Clusters : 기존 Kubernetes Cluster에 직접 삭제

- Takes as K8S-native an approach as possible : K8S의 native 접근 방식을 따름

- Leverage Container Networking Interface, Container Storage Interface and other K8S-native integrations. : CNI, CSI를 활용

- Apache License, Version 2.0

정확히 생각해보자. Docker의 환경 그림을 그려보면 대부분 이렇게 그려진다.

하지만 물리적으로는 이런 모습이 아니다. (논리적으론 저게 맞다)

Docker는 Container의 생성을 도와주는 소프트웨어이기 때문이다. 이걸 K8S로 바꾸어도 똑같다.

여기에서 KubeVirt의 VM을 넣고 간결하게 그리면 이런 모양이 된다.

이제 VM을 K8S로 관리할 수 있게 되면서 Container와 동등한 관계가 된다.

High-Level Architecture 그림을 가져와봤다.

User가 원하는 VM Spec을 요청하면 Master의 virt-controller가 적합한 Worker를 골라 virt-handler을 통해 VM을 Pod로 띄워준다.


Kubectl에서 vm을 조회하는 명령어

kubectl get crds

생성하는 Yaml(Example)

- 가상머신의 디스크는 PersistentVolumes로 매핑

- 네트워크는 일반 포드 네트워크를 따름 (외부에서는 VM/Container를 구분하지 못함)

- 고급 네트워크(L2, Infiniband, SR-IOC)는 아직 지원하지 않음

- 가상머신의 이미지는 containerized-data-import를 통해 가져올 수 있음 (HTTP를 통해, read-only Kubernetes namespace에서 이미지를 복사하여)

- virt-v2v를 사용하여 가상머신을 KubeVirt로 가져올 수 있음(Vmware, libvirt, ova). 단 단일 NIC, 단일 DISK


1. KubeVirt - Compute

(1) VirtualMachine

- Immortal VM object

- Just an object, there are no associated pods/processes

(2) VirtualMachineInstance

- Instantiation of a VM when it is modified/started

(3) VMI Preset

- Same idea as a "flavor" but includes ability to set storage/network params too

- Individual VMIs can override specific values, acception the rest of the preset values as defaults

2. KubeVirt - Images

VM booting options

(1) Ephemeral Disk

- Immutable VMIs

- Lose changes across reboots

- Container image embed VM images under /disk directory

(2) Persistent Disk

- DataVolume

- Copy Registry disk into a DataVolume

3. Kubervirt - CDI (Containerized Data Importer)

- Solves problem of "how do I load in compatible images for my VMs?"

- CRD/Controller which sits on top of PVCs

4. Virt-Launcher Pod - Virtualization

(1) VM is inside a POD

(2) Launched by Virt-Launcher

(3) Uses Libvirt

- KVM where avaiable

- Emulation where not : AWS, GCP, Nersted VM

(4) Volume Container

- Unwrapping docker images to VM images

(5) Other Containers

- Sidecars as required

- Infra container : liveness check

5. Virt-Launcher Pod - Networking

(1) Virt-Launcher creates a dnsmasq on a link-local address

(2) Transferes the IP to the VM

(3) The Pod itself is without networking

6. Virt-Controller - All the Controller(s)

- Each Object has a corresponding controller

- VirtualMachine controller delegates most to Virtual MachineInstance

- Fairly comprehensive set of objects and more being discussed

7. Virt-Handler

(1) Demonset

(2) Acts as a minion

(3) Responsible for

- Stop

- Update

- Status

- Restart

(4) Communicates to Livbirt via socket /var/run/kubevirt host mount

8. The complete picture

'Cloud > Kubernetes' 카테고리의 다른 글

Minikube로 KubeVirt 시작하기 (3)  (0) 2019.11.20
Minikube로 KubeVirt 시작하기 (2)  (0) 2019.11.20
Minikube로 KubeVirt 시작하기 (1)  (0) 2019.11.19
kubernetes pod name 뽑아내기  (0) 2019.11.14
Kubernetes Garbage Collection  (0) 2019.11.08