KubeVirt 探秘:一些核心问题解答

大家好,我是张晋涛。

上一篇文章 KubeVirt: 耗时 7 年终将虚拟机带入 Kubernetes 世界 | MoeLove 发布后,我收到了很多留言和讨论。 限于篇幅,很多回答都比较简短,我想着还是写篇文章来详细聊聊关于 KubeVirt 的一些问题好了。

为什么要用 KubeVirt

有小伙伴问到 KubeVirt 的使用场景是什么?

按照官方文档的描述是:Building a virtualization API for Kubernetes,为 Kubernetes 构建一个虚拟化 API 扩展。 这隐含的其实就是 KubeVirt 带来了一层抽象,一层基于 API 的抽象。

我们知道 Kubernetes 中提供了 CRD 的模式允许对 Kubernetes 进行扩展,也有很多的项目通过这种模式进行扩展,开发了对应的 Operator 之类的。 为的就是能利用更多 Kubernetes 提供的能力。对于 KubeVirt 而言,它也是利用了 CRD 的这种模式,所以这方面它也一样。这些好处具体而言就是:

此外,它还有一些其他的优势:

直接用 KVM 不好吗?

还有小伙伴问到,直接用 KVM 不就可以了?

按照前面的介绍,KubeVirt 的核心优势其实在于它的抽象和封装,它提供了类似 VirtualMachineVirtualMachineInstance 等自定义资源, 用户可以直接通过这些声明式配置就完成对应环境的准备。

但如果是直接使用 KVM 的话,则还需要使用 virsh 之类的命令进行操作,会比较麻烦。

而且最为重要的一点,KubeVirt 底层实际上也使用了 QEMU/KVM 等技术,只是它将这些技术带入了 Kubernetes 世界,以一种更加 Kubernetes 原生的方式提供给用户使用。

KubeVirt 有什么劣势?

KubeVirt 作为一项并没有那么广泛使用的技术,引入它除去有上文中提到的优势外,它自然也有一些劣势,或者说不适用的场景。

➜  ~ 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 吗?在 KubeVirt 仓库中有一个文件,是对应厂商自己登记的,当然,这应该也不是全部的用例,可能还有一些未进行登记。 https://github.com/kubevirt/kubevirt/blob/main/ADOPTERS.md

2023-09-03 08-51-07屏幕截图.png

2023-09-03 08-50-54屏幕截图.png

2023-09-03 08-50-35屏幕截图.png

KubeVirt 的网络是如何管理的?

KubeVirt 的网络管理主要依赖于 Kubernetes 的网络模型和扩展。KubeVirt 使用多种网络插件和技术来支持虚拟机(VM)之间以及 VM 与容器之间的网络通信。

在虚拟机的 spec.networks 中可以配置虚拟机可以使用的网络后端(backend),目前有两个选项:

kind: VM
spec:
  domain:
    devices:
      interfaces:
        - name: default
          masquerade: {}
  networks:
  - name: default
    pod: {} # Stock pod network

先创建一个 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

好了,以上就是最近看到比较频繁问到的一些问题,欢迎大家继续留言讨论。


欢迎订阅我的文章公众号【MoeLove】

TheMoeLove

Related Posts

Comments