kvm2

Linux KVM(基于内核的虚拟机)驱动

概述

KVM (基于内核的虚拟机) 是一个用于运行在包含虚拟化扩展的x86硬件上的Linux的完整虚拟化解决方案。为了与KVM协同工作,minikube 使用 libvirt 虚拟化 API

要求

  • libvirt v1.3.1 或更高版本
  • qemu-kvm v2.0 或更高版本

安装先决条件

KVM 和 libvirt 的正确安装高度依赖于具体的 Linux 发行版。请查阅

配置完成后,请验证 libvirt 是否报告了任何错误。

virt-host-validate

用法

使用kvm2驱动启动集群

minikube start --driver=kvm2

将kvm2设为默认驱动

minikube config set driver kvm2

检查虚拟化支持

要使用虚拟机驱动,请验证您的系统是否启用了虚拟化支持。

grep -E -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no

如果上述命令输出“no”

  • 如果您在虚拟机中运行,您的虚拟机监控程序不允许嵌套虚拟化。您将需要使用 *None(裸金属)* 驱动。
  • 如果您在物理机上运行,请确保您的 BIOS 中已启用硬件虚拟化。

特殊功能

minikube start 命令支持 5 个额外的 KVM 特有标志

  • --kvm-gpu: 在 minikube 中启用实验性的 NVIDIA GPU 支持
  • --hidden: 在 minikube 中对客户机隐藏虚拟机监控程序签名
  • --kvm-network: KVM默认网络名称
  • --network: 专用的KVM私有网络名称
  • --kvm-qemu-uri: KVM qemu URI,默认为 qemu:///system

问题

  • 如果用户不在正确的 libvirt 组中,minikube 将反复要求输入 root 密码 #3467
  • 防火墙阻止虚拟机网络访问时,出现 Machine didn't return an IP after 120 seconds 错误 #3566
  • qemu.confdynamic ownership = 1 时,unable to set user and group to '65534:992 #4467
  • KVM 虚拟机无法与 VirtualBox 同时使用 #4913
  • 在某些发行版上,libvirt 桥接网络可能会在主机重启前失败。

另请参阅 co/kvm2-driver 开放问题

嵌套虚拟化

如果您在嵌套虚拟化环境中运行 KVM,请确保您的配置正确遵循 本教程本教程 来正确配置内核模块。

故障排除

  • 运行 id 以确认用户属于 libvirt[d] 组(输出应包含类似“groups=...,108(libvirt),...”的条目)。
  • 运行 virsh domcapabilities --virttype="kvm" 以确认主机支持 KVM 虚拟化。
  • 运行 virt-host-validate 并检查建议。
  • 运行 ls -la `which virsh` , virsh uri, sudo virsh net-list --allip a s 以收集更多调试信息。
  • 运行 minikube start --alsologtostderr -v=9 以调试崩溃。
  • 运行 docker-machine-driver-kvm2 version 以验证 kvm2 驱动程序是否正常执行。
  • 阅读 如何调试虚拟化问题

KVM/libvirt网络故障排除

在大多数情况下,minikube 会尝试为您检测并解决 KVM/libvirt 网络中的任何问题。但是,在某些情况下需要手动干预,这主要是因为需要 root 权限。

  1. 运行 sudo virsh net-list --all 列出所有接口。

输出示例

 Name                     State    Autostart   Persistent
-----------------------------------------------------------
 default                  active   yes         yes
 mk-kvm0                  active   yes         yes
 mk-minikube              active   yes         yes
 my-custom-kvm-priv-net   active   yes         yes

其中

  • default 是默认的 libvirt 网络,
  • mk-kvm0 是为 minikube kvm0 配置文件(例如,使用 minikube start -p kvm0 --driver=kvm2)创建的默认 libvirt 网络,
  • mk-minikube 是为默认 minikube 配置文件(例如,使用 minikube start --driver=kvm2)创建的网络,以及
  • my-custom-kvm-priv-net 是为 minikube 配置文件提供的自定义私有网络名称(例如,使用 minikube start -p kvm1 --driver=kvm2 --network="my-custom-kvm-priv-net")。
  1. 运行 sudo virsh net-autostart <network> 以手动将 network 设置为自动启动,如果尚未设置。

  2. 运行 sudo virsh net-start <network> 以手动启动/激活 network,如果尚未启动/激活。

    1. 如果 默认 libvirt 网络丢失或无法启动/激活,请查阅您的操作系统/发行版特定的 libvirt 文档;以下步骤 可能 会帮助您解决问题

      1. 运行 sudo virsh net-dumpxml default > default.xml 备份 默认 libvirt 网络配置。
      2. 运行 sudo virsh net-destroy default 停止 默认 libvirt 网络。
      3. 运行 sudo virsh net-undefine default 删除 默认 libvirt 网络。
      4. 运行 sudo virsh net-define /usr/share/libvirt/networks/default.xml 重新创建 默认 libvirt 网络。
        • 注意:如果出现任何问题,请重复上述步骤 b.c.,然后运行 sudo virsh net-define default.xml 以恢复原始的 默认 libvirt 网络配置。
      5. 运行 sudo virsh net-start default 启动 默认 libvirt 网络。
      6. 运行 sudo virsh net-autostart default 自动启动 默认 libvirt 网络。
    2. 如果 非默认 libvirt 网络 无法启动/激活,请使用以下步骤

      1. 运行 sudo virsh net-dumpxml <network> 转储 XML 网络 配置 - 注意 bridge name=<bridge>ip address='<address>' netmask='<netmask>' 值。输出示例
      <network connections='1'>
        <name>mk-minikube</name>
        <uuid>cfcb37fb-fd75-4599-825a-14bee5d863f5</uuid>
        <bridge name='virbr1' stp='on' delay='0'/>
        <mac address='52:54:00:80:97:5a'/>
        <dns enable='no'/>
        <ip address='192.168.39.1' netmask='255.255.255.0'>
          <dhcp>
            <range start='192.168.39.2' end='192.168.39.254'/>
          </dhcp>
        </ip>
      </network>
      

      b. 运行 ip -4 -br -o a s 以显示所有已分配 IP(CIDR 格式)的接口,现在将上述 IP 地址网络掩码桥接 的进行比较。输出示例

      lo               UNKNOWN        127.0.0.1/8
      virbr0           UP             192.168.122.1/24
      wlp113s0         UP             192.168.42.17/24
      br-08ada8d5dfa4  DOWN           172.22.0.1/16
      docker0          DOWN           172.17.0.1/16
      virbr1           UP             192.168.39.1/24
      
      • 如果它们匹配,或者 IP 地址未在任何地方列出:运行 sudo ip link delete <bridge>,然后运行 sudo virsh net-start <network>sudo virsh net-autostart <network>,让 libvirt 重新创建 桥接 并[自动]启动 网络
      • 如果 IP 地址属于另一个接口:其他东西占用了 IP 地址 造成冲突,您必须确定是什么,然后在两者之间做出选择……
  3. 运行 sudo systemctl restart libvirtdsudo systemctl restart libvirt(取决于您的操作系统/发行版)以重新启动 libvirt 守护程序。

希望到此为止,您的 libvirt 网络已正常运行,并且您可以再次成功运行 minikube。