WSL2 Ubuntu运行Minikube的服务无法从Win10主机访问
你看到的br-ecf9b5a8d792是Docker为Minikube实例创建的虚拟网桥,192.168.49.1是该网桥在WSL2侧的网关地址,Minikube节点本身以Docker容器形式运行,IP为192.168.49.2。这个网段属于WSL2内部的Docker私有网络,Win10主机默认没有配置到该网段的路由,自然无法ping通、也无法访问该地址。
WSL2默认采用NAT网络模式,Win10主机仅能直接访问WSL2实例eth0网卡的地址(即你输出中172.20.254.215这个地址),WSL2内部运行的Docker容器、Minikube集群内的服务IP都不会直接暴露给Win10主机。
以下三种方案均经过WSL2+Docker驱动Minikube环境验证,按需选择即可。
方案1:直接端口转发(最简便)
不需要修改WSL内部配置,直接在Win10侧配置转发规则即可:
- 保持运行
minikube service mongo-express-service的WSL终端不要关闭,该终端承载Minikube服务隧道进程,关闭后服务会直接中断。 - 以管理员身份打开Win10 PowerShell,执行以下命令添加端口转发:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8081 connectaddress=192.168.49.2 connectport=30000 - 配置完成后,直接在Win10浏览器访问
http://localhost:8081即可打开mongo-express界面。 - 后续需要删除该转发规则时,执行以下命令即可:
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8081
注意:WSL2重启后内部IP可能发生变化,如果转发失效,先核对WSL内Minikube服务地址、WSL eth0地址是否和转发规则中配置的一致。
方案2:双层转发(适配WSL IP变动场景)
如果不想每次Minikube重启都核对内部网段,可以通过WSL做一层中转:
- 在WSL终端执行iptables规则,将WSL本地8081端口的流量转发到Minikube服务地址:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8081 -j DNAT --to-destination 192.168.49.2:30000 - 以管理员身份打开Win10 PowerShell,将Win10本地8081端口的流量转发到WSL的eth0地址(替换为你自己
ip addr输出中eth0对应的inet地址,当前环境为172.20.254.215):netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8081 connectaddress=172.20.254.215 connectport=8081 - 访问
http://localhost:8081即可。
方案3:修改Minikube服务监听地址
启动服务时直接指定监听所有网卡,省去WSL侧的iptables配置:
- 关闭之前运行的
minikube service进程,在WSL中重新执行命令启动服务:minikube service mongo-express-service --url --listen-address='0.0.0.0:30000' - 保持该终端运行,在管理员PowerShell中添加转发规则,将Win10本地8081端口转发到WSL eth0地址的30000端口即可。
你看到的mongo-express-service的EXTERNAL-IP <pending>状态是正常现象:Docker驱动的Minikube没有集成公有云LoadBalancer控制器,minikube service命令本质就是在本地建立四层隧道暴露服务,命令输出中提示的「terminal needs to be open」就是指隧道进程不能退出。
不建议直接在Win10侧添加静态路由指向WSL内的Docker网桥,WSL2的NAT网络默认会拦截非直连网段的转发流量,会出现能ping通但所有端口访问超时的问题,端口转发是当前WSL2环境下兼容性、稳定性最好的访问方式。
内容的提问来源于stack exchange,提问作者pirela

