文章大纲
KubeVirt 通过在 Kubernetes 运行的容器中基于 KVM 来提供容器云原生的虚拟化。KubeVirt 为 Kubernetes 构建了一组虚拟化 API ,可用于管理虚拟机的工作负载。
Stack
官网上介绍了整个 KubeVirt 的 Stack:
+---------------------+
| KubeVirt |
~~+---------------------+~~
| Orchestration (K8s) |
+---------------------+
| Scheduling (K8s) |
+---------------------+
| Container Runtime |
~~+---------------------+~~
| Operating System |
+---------------------+
| Virtual(kvm) |
~~+---------------------+~~
| Physical |
+---------------------+
KubeVirt 提供虚拟化功能,编排和调度都是借助 K8S 来完成的。VM 作为容器运行的,所以还需要 Container Runtimer,整个 K8S 可以选择部署在物理机或虚拟机上。
KubeVirt 组件
以下是 KubeVirt 的架构:
KubeVirt 提供的组件有:
virt-api
:提供 HTTP RESTful 接口来管理集群内的虚拟机和虚拟机相关的工作流,负责更新虚拟化 CRD,也负责 VMI CRD 的默认设置和验证。它是一个集群级别的组件。virt-controller
:负责集群范围的虚拟化功能,管理与 VMI 关联的 Pod 的生命周期。它是一个集群级别的组件。virt-handler
:在各个节点上运行的 DaemonSet 资源,用于监控 VM 对象的更改,以及执行必要的操作来达到所需状态。virt-launcher
:VMI 相关的 Pod 中包含了一个virt-launcher
组件,用于提供 CGroup 和命名空间来托管 VMI 进程,当 VM CRD 对象通过virt-handler
组件传递给virt-launcher
时,将使用 Pod 中的libvirtd
容器来启动 VMI,virt-launcher
将监控 VMI 进程,直至 VMI 终止时退出。
所以使用 KubeVirt 创建 VM 的流程可以概括为:
创建 VM 时,virt-controller
会向集群节点上的 virt-handler
发出信号,virt-handler
会为新的 VMI 创建 virt-launcher
Pod,在 virt-launcher
Pod 中将运行一个 libvirtd
的容器,以便将 VMI 作为一个孤立的进程来执行。
官网提供了一个简化的架构图:
所以位于 Master 上的是集群级别的组件,控制器(virt-controller)和 API(virt-api)
VM 与 VMI
在 KubeVirt 中,VM 是一个模板,用于在集群中创建 VM 的运行实例。
VM 的运行实例就称为虚拟机实例 VMI,所以 VM 和 VMI 的关系类似于 Deployment 和 ReplicaSet 的关系。
如果 VMI 删除了,会根据 VM 自动的生成一个新的实例。