VirtualBox桥接网络环境下K3s集群MetalLB分配的LoadBalancer IP无法从Windows宿主机访问的问题求助
VirtualBox桥接网络环境下K3s集群MetalLB分配的LoadBalancer IP无法从Windows宿主机访问的问题求助
环境信息
- 宿主机:Windows 10,Wi-Fi网卡IP为
192.168.165.117 - 虚拟机:Ubuntu 23(VirtualBox运行),桥接网络配置,IP为
192.168.165.230 - 集群:K3s已部署,安装了MetalLB v0.13.11,核心配置如下:
- IP地址池:
192.168.165.240-192.168.165.250 - L2Advertisement已关联该IP池
- IP地址池:
- 当前状态:虚拟机内可正常访问MetalLB分配给Nginx LoadBalancer的IP(
192.168.165.240、192.168.165.241),但Windows宿主机无法访问。
排查与解决步骤
根据你的场景,我建议按以下顺序逐步排查,定位问题:
1. 先确认基础网络连通性
- 在Windows宿主机的命令行执行
ping 192.168.165.230,验证宿主机和虚拟机的基础网络是否连通:- 如果ping不通:
- 检查VirtualBox的桥接适配器是否选对了Windows当前在用的Wi-Fi网卡(别选禁用的网卡);
- 临时关闭Ubuntu的ufw防火墙试试:
sudo ufw disable,再重新ping; - 确认虚拟机的桥接网络确实获取到了和宿主机同网段的IP(你的场景已经满足,可快速跳过)。
- 如果ping不通:
2. 检查MetalLB L2模式的网络转发
MetalLB的L2模式依赖ARP广播宣告IP,VirtualBox桥接网络有时会限制这类广播的跨宿主机传递:
- 在Ubuntu虚拟机上用tcpdump抓ARP包:
sudo tcpdump -i <你的桥接网卡名> arp,然后在Windows宿主机访问192.168.165.240,观察是否有对应的ARP请求/响应包; - 给VirtualBox虚拟机开启混杂模式:打开虚拟机设置 → 网络 → 高级 → 混杂模式,选择「允许所有」,然后重启虚拟机。这个设置能让VirtualBox正确转发L2层的广播包,解决MetalLB的IP宣告问题。
3. 验证K3s的CNI(Flannel)配置
K3s默认用Flannel作为网络插件,要是网卡绑定错误会导致外部流量无法进入集群:
- 先检查Flannel的Pod状态:
kubectl get pods -n kube-system | grep flannel,确保所有Flannel Pod都是Running状态; - 查看K3s是否绑定了正确的网卡:如果虚拟机有多个网卡(比如lo和桥接网卡),需要让Flannel绑定到桥接网卡上。编辑K3s配置文件
/etc/rancher/k3s/config.yaml,添加一行:
然后重启K3s服务:flannel-iface: enp0s3 # 替换成你的桥接网卡实际名称,可用ip addr命令查看sudo systemctl restart k3s。
4. 检查Ubuntu的防火墙规则
如果基础网络连通,但端口访问失败,大概率是ufw拦截了流量:
- 临时关闭ufw后再测试访问,如果能正常打开页面,说明是防火墙的问题;
- 重新开启ufw并添加允许规则,比如允许宿主机网段访问MetalLB的IP池端口:
sudo ufw enable sudo ufw allow from 192.168.165.0/24 to 192.168.165.240/28 proto tcp port 80
5. 测试端口连通性
如果ping通了虚拟机,但访问80端口失败,用PowerShell命令测试端口是否开放:
Test-NetConnection 192.168.165.240 -Port 80
如果显示TcpTestSucceeded: False,说明端口被拦截,回到前面的防火墙或CNI配置排查;如果是True,那可能是浏览器缓存或代理的问题,试试用隐私模式访问。
备注:内容来源于stack exchange,提问作者sardar
相关产品推荐
相关产品推荐

