kvm2
概述
KVM(基于内核的虚拟机)是 Linux 上 x86 硬件的完整虚拟化解决方案,其中包含虚拟化扩展。为了与 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
检查虚拟化支持
要使用 VM 驱动程序,请验证您的系统是否已启用虚拟化支持
grep -E -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
如果上述命令输出“no”
- 如果您在 VM 中运行,则您的虚拟机监控程序不允许嵌套虚拟化。您需要使用*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 - 当防火墙阻止 VM 网络访问时,出现
Machine didn't return an IP after 120 seconds
#3566 - 当
qemu.conf
中的dynamic ownership = 1
时,出现unable to set user and group to '65534:992
#4467 - KVM VM 不能与 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 --all
和ip a s
以收集其他调试信息。 - 运行
minikube start --alsologtostderr -v=9
以调试崩溃。 - 运行
docker-machine-driver-kvm2 version
以验证 kvm2 驱动程序是否正确执行。 - 阅读 如何调试虚拟化问题
KVM/libvirt 网络故障排除
在大多数情况下,minikube 将尝试检测并为您解决 KVM/libvirt 网络的任何问题。但是,在某些情况下,需要手动干预,主要是因为需要 root 权限。
- 运行
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 配置文件创建的默认 libvirt 网络(例如,使用
minikube start -p kvm0 --driver=kvm2
), - 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"
)。
-
运行
sudo virsh net-autostart <network>
以手动将 network 设置为自动启动(如果尚未设置)。 -
运行
sudo virsh net-start <network>
以手动启动/激活 network(如果尚未启动/激活)。-
如果 default libvirt 网络丢失或无法启动/激活 - 请查阅特定于您的操作系统/发行版的 libvirt 文档;以下步骤可能可以帮助您解决问题
- 运行
sudo virsh net-dumpxml default > default.xml
以备份 default libvirt 网络配置。 - 运行
sudo virsh net-destroy default
以停止 default libvirt 网络。 - 运行
sudo virsh net-undefine default
以删除 default libvirt 网络。 - 运行
sudo virsh net-define /usr/share/libvirt/networks/default.xml
以重新创建 default libvirt 网络。- 注意:重复上述步骤 b. 和 c.,然后运行
sudo virsh net-define default.xml
以恢复原始的 default libvirt 网络配置(以防出现任何问题)。
- 注意:重复上述步骤 b. 和 c.,然后运行
- 运行
sudo virsh net-start default
以启动 default libvirt 网络。 - 运行
sudo virsh net-autostart default
以自动启动 default libvirt 网络。
- 运行
-
如果 非默认 libvirt network 无法启动/激活,请使用以下步骤
- 运行
sudo virsh net-dumpxml <network>
以转储 XML network 配置 - 注意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 address 和 netmask 与 bridge 的 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 地址,造成了冲突,您必须确定是什么占用了,然后在两者之间做出选择……
- 运行
-
-
运行
sudo systemctl restart libvirtd
或sudo systemctl restart libvirt
(取决于您的操作系统/发行版) 来重启 libvirt 守护进程。
希望到现在您已经使 libvirt 网络正常运行,并且您将再次成功运行 minikube。