kvm2
概述
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.conf
中dynamic 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 --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 配置文件(例如,使用
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"
)。
-
运行
sudo virsh net-autostart <network>
以手动将 network 设置为自动启动,如果尚未设置。 -
运行
sudo virsh net-start <network>
以手动启动/激活 network,如果尚未启动/激活。-
如果 默认 libvirt 网络丢失或无法启动/激活,请查阅您的操作系统/发行版特定的 libvirt 文档;以下步骤 可能 会帮助您解决问题
- 运行
sudo virsh net-dumpxml default > default.xml
备份 默认 libvirt 网络配置。 - 运行
sudo virsh net-destroy default
停止 默认 libvirt 网络。 - 运行
sudo virsh net-undefine default
删除 默认 libvirt 网络。 - 运行
sudo virsh net-define /usr/share/libvirt/networks/default.xml
重新创建 默认 libvirt 网络。- 注意:如果出现任何问题,请重复上述步骤 b. 和 c.,然后运行
sudo virsh net-define default.xml
以恢复原始的 默认 libvirt 网络配置。
- 注意:如果出现任何问题,请重复上述步骤 b. 和 c.,然后运行
- 运行
sudo virsh net-start default
启动 默认 libvirt 网络。 - 运行
sudo virsh net-autostart default
自动启动 默认 libvirt 网络。
- 运行
-
如果 非默认 libvirt 网络 无法启动/激活,请使用以下步骤
- 运行
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 地址 造成冲突,您必须确定是什么,然后在两者之间做出选择……
- 运行
-
-
运行
sudo systemctl restart libvirtd
或sudo systemctl restart libvirt
(取决于您的操作系统/发行版)以重新启动 libvirt 守护程序。
希望到此为止,您的 libvirt 网络已正常运行,并且您可以再次成功运行 minikube。