前幾日在 Cloud Native Taiwan User Group 久違的講了一場 KubeVirt 101,越玩越覺得這個計畫還真有趣。在這裡打算把 KubeVirt 101 講的內容稍微濃縮一下,將重點放在架構的地方來寫一篇介紹。推坑大家來玩玩這個在 Kubernetes 上跑 VM workload 的 operator。
Table of Contents
基本介紹
官網原文:
KubeVirt is a virtual machine management add-on for Kubernetes. The aim is to provide a common ground for virtualization solutions on top of Kubernetes.
簡單來說 KubeVirt 是一個讓使用者能夠在 Kubernetes 上跑虛擬機應用的 Kubernetes operator,讓使用者可以跑一些還沒容器化或是需要特殊 kernel 的應用。最大的好處在於維運上所有概念都跟一般的 Kubernetes container 應用差不多,能夠大大降低維運人員的學習曲線
CRD
首先大致介紹一下 KubeVirt 比較常用的 CRD
Virtual Machine
- VirtualMachine
- VirtualMachineInstance
- VMI ReplicaSet
- VMI Preset
VirtualMachineInstance 是一個 instance 最基本的 building block,大部分狀況下使用者不會直接去建立這個 CRD 而是由其他更高階的 CRD 去建立,而更高階的 CRD 是 VirtualMachine 跟 VMI ReplicaSet
VirtualMachine 通常定義的是 stateful 的 VM,在停止跟開啟之後仍然會保留其資料,但是也可以用來建立 stateless VM
VMI ReplicaSet 比較像 Kubernetes 的 ReplicaSet,是用來提供一群擁有相似設定 stateless 的 VM 的 CRD
VMI Preset 則是 instance 的 flavor,可以先設定好 VM 所需要的 CPU, RAM 等資源並且重複利用。
主要元件
大致上的架構圖長得像這樣:
KubeVirt 由以下元件組成:
- virt-api
- virt-controller
- virt-handler
- virt-launcher
- libvirtd
virt-api
virt-api 負責提供一些 KubeVirt 特有的 api,像是
等。console, vnc, startvm, stopvm
virt-controller
virt-controller 主要負責監控 VMI (CRD) 的狀況並且管理跟 VMI 相關的 pod,pod 的 life cycle (create, delete) 會由這個元件去處理,另外將 node name 在 VMI object 中更新也是 virt-controller 的工作之一。
virt-handler
virt-handler 是個會跑在 worker node 上的 deamonset,主要目的是去 watch Kubernetes api-server 中 VM object 的變化,並且將 VM 變成你想要的形狀。在開啟 VM 的時候 virt-handler 會提供 VMI object 去 signal virt-launcher 去開啟一個 VMI,而之後工作就會交給接下來要介紹的 virt-launcher。
virt-launcher
每一個 VMI object 都會對應一個 pod,而那個 pod 的 container 會跑 virt-launcher 這個元件。virt-launcher pod 會負責提供跑 VMI process 所需要的 cgroups 跟 namespaces。它也是主要跟 libvirtd 溝通的元件,當接受到 virt-launcher 的 siganl 後會透過 libvirtd 去開啟 VMI,並且監控 VMI process 的狀況,在其 exit 的時候 terminate。
libvirtd
libvirtd 顧名思義,就是個 libvirt daemon,負責提供 API 去建立虛擬機。
總結
KubeVirt 整體架構不算太複雜,在使用上也非常輕鬆簡單,有需要在 Kubernetes 環境跑 VM workload 的讀者可以考慮嘗試看看。後續應該也會再寫幾篇介紹網路架構跟如何使用。等不及的讀者們可以考慮先上 CNTUG 的 YouTube 看當初線上分享的錄影。
Reference
https://github.com/kubevirt/kubevirt/blob/master/docs/architecture.md
https://kubernetes.io/blog/2018/05/22/getting-to-know-kubevirt/
https://github.com/kubevirt/kubevirt/blob/master/docs/components.md
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.