kvm2
概述
KVM (Kernel-based Virtual Machine) 是一个针对包含虚拟化扩展的 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
检查虚拟化支持
要使用 VM 驱动程序,请验证您的系统是否启用了虚拟化支持
grep -E -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
如果上述命令输出“no”
- 如果您在 VM 中运行,则您的 hypervisor 不允许嵌套虚拟化。您将需要使用 None (bare-metal) 驱动程序
- 如果您在物理机上运行,请确保您的 BIOS 已启用硬件虚拟化
特殊功能
minikube start 命令支持 5 个额外的 KVM 特定标志
--kvm-gpu: 在 minikube 中启用实验性 NVIDIA GPU 支持--hidden: 在 minikube 中向来宾隐藏 hypervisor 签名--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来调试崩溃。 - 阅读 如何调试虚拟化问题
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 网络。
- 运行
-
如果 non-default 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 的进行比较。示例输出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 重新创建 bridge 并 [自动] 启动 network。 - 如果 IP 地址属于另一个接口:其他东西占用了 IP address 造成冲突,您必须确定是什么,然后在两者之间做出选择…
- 运行
-
-
运行
sudo systemctl restart libvirtd或sudo systemctl restart libvirt(取决于您的操作系统/发行版)以重新启动 libvirt 守护程序。
希望到目前为止,您的 libvirt 网络已正常运行,您将能够再次成功运行 minikube。