大家好,我是张晋涛。
上一篇文章 KubeVirt: 耗时 7 年终将虚拟机带入 Kubernetes 世界 | MoeLove 发布后,我收到了很多留言和讨论。限于篇幅,很多回答都比较简短,我想着还是写篇文章来详细聊聊关于 KubeVirt 的一些问题好了。
有小伙伴问到 KubeVirt 的使用场景是什么?
按照官方文档的描述是:Building a virtualization API for Kubernetes,为 Kubernetes 构建一个虚拟化 API 扩展。这隐含的其实就是 KubeVirt 带来了一层抽象,一层基于 API 的抽象。
我们知道 Kubernetes 中提供了 CRD 的模式允许对 Kubernetes 进行扩展,也有很多的项目通过这种模式进行扩展,开发了对应的 Operator 之类的。为的就是能利用更多 Kubernetes 提供的能力。对于 KubeVirt 而言,它也是利用了 CRD 的这种模式,所以这方面它也一样。这些好处具体而言就是:
VirtualMachine
类型的自定义资源来创建 VM,创建 VirtualMachineInstance
类型的资源来描述虚拟机实例。这与我们在使用 Deployment 和 Pod 描述工作负载时的逻辑和体验基本类似,而且基本的一些操作经验等都是可以复用的;此外,它还有一些其他的优势:
还有小伙伴问到,直接用 KVM 不就可以了?
按照前面的介绍,KubeVirt 的核心优势其实在于它的抽象和封装,它提供了类似 VirtualMachine
和 VirtualMachineInstance
等自定义资源, 用户可以直接通过这些声明式配置就完成对应环境的准备。
但如果是直接使用 KVM 的话,则还需要使用 virsh
之类的命令进行操作,会比较麻烦。
而且最为重要的一点,KubeVirt 底层实际上也使用了 QEMU/KVM 等技术,只是它将这些技术带入了 Kubernetes 世界,以一种更加 Kubernetes 原生的方式提供给用户使用。
KubeVirt 作为一项并没有那么广泛使用的技术,引入它除去有上文中提到的优势外,它自然也有一些劣势,或者说不适用的场景。
/etc/modprobe.d/kvm.conf
➜ ~ cat /etc/modprobe.d/kvm.conf
# Setting modprobe kvm_intel/kvm_amd nested = 1
# only enables Nested Virtualization until the next reboot or
# module reload. Uncomment the option applicable
# to your system below to enable the feature permanently.
#
# User changes in this file are preserved across upgrades.
#
# For Intel
#options kvm_intel nested=1
#
# For AMD
#options kvm_amd nested=1
有小伙伴问到真的有人在用 KubeVirt 吗?在 KubeVirt 仓库中有一个文件,是对应厂商自己登记的,当然,这应该也不是全部的用例,可能还有一些未进行登记。https://github.com/kubevirt/kubevirt/blob/main/ADOPTERS.md
2023-09-03屏幕截图.png
2023-09-03 屏幕截图.png
2023-09-03 屏幕截图.png
KubeVirt 的网络管理主要依赖于 Kubernetes 的网络模型和扩展。KubeVirt 使用多种网络插件和技术来支持虚拟机(VM)之间以及 VM 与容器之间的网络通信。
在虚拟机的 spec.networks
中可以配置虚拟机可以使用的网络后端(backend),目前有两个选项:
pod
:KubeVirt 使用 Kubernetes 的 Pod 网络来实现虚拟机与容器之间的通信。虚拟机作为一个 Pod 被部署在集群中,它们共享相同的网络命名空间。这意味着虚拟机可以像容器一样访问集群中的其他资源,反之亦然。kind: VM
spec:
domain:
devices:
interfaces:
- name: default
masquerade: {}
networks:
- name: default
pod: {} # Stock pod network
multus
:使用 Multus 提供的辅助网络,KubeVirt 支持将多个网络接口附加到虚拟机上,这使得虚拟机可以连接到多个网络。为了实现这一点,KubeVirt 使用了 Multus,这是一个 Kubernetes 的 CNI(容器网络接口)插件,它允许将多个网络接口附加到 Pod 上。先创建一个 NetworkAttachmentDefinition 的资源,以 ovs 为例:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: ovs-vlan-100
spec:
config: '{
"cniVersion": "0.3.1",
"type": "ovs",
"bridge": "br1",
"vlan": 100
}'
然后使用它
kind: VM
spec:
domain:
devices:
interfaces:
- name: default
masquerade: {}
bootOrder: 1 # attempt to boot from an external tftp server
dhcpOptions:
bootFileName: default_image.bin
tftpServerName: tftp.example.com
- name: ovs-net
bridge: {}
bootOrder: 2 # if first attempt failed, try to PXE-boot from this L2 networks
networks:
- name: default
pod: {} # Stock pod network
- name: ovs-net
multus: # Secondary multus network
networkName: ovs-vlan-100
它还支持通过 spec.domain.devices.interfaces
配置多种网络接口(前端),例如:
kind: VM
spec:
domain:
devices:
interfaces:
- name: default
model: e1000 # expose e1000 NIC to the guest
masquerade: {} # connect through a masquerade
ports:
- name: http
port: 80
networks:
- name: default
pod: {}
更多关于 KubeVirt 网络配置相关的内容可以参考其官方文档,还是很详细的:https://kubevirt.io/user-guide/virtual_machines/interfaces_and_networks/#frontend
好了,以上就是最近看到比较频繁问到的一些问题,欢迎大家继续留言讨论。
TheMoeLove