如何通过Microk8s让Nginx Pod可被同网络其他主机访问?
解决Microk8s NodePort跨网络访问失败的问题
1. 先搞清楚实际分配的NodePort端口
你执行的expose命令里指定的--port 80是集群内部的端口,NodePort会自动分配30000-32767范围内的随机端口,先查清楚这个实际端口:
microk8s kubectl get svc nginx-webserver
看输出里的NODEPORT列,比如30080,后续访问必须用这个端口,不是80。
2. 检查Multipass VM的网络模式
Multipass默认用NAT网络,这种模式下外部机器根本连不上VM,必须改成桥接网络:
2.1 先删旧VM重建
multipass delete <你的VM名称> multipass purge
2.2 用桥接模式新建VM
找你Windows上的物理网卡名称(控制面板→网络连接里看,比如以太网或Wi-Fi),然后执行:
multipass launch --name microk8s-vm --network "你的物理网卡名称" --mem 4G --disk 20G
2.3 验证VM内部访问正常
进VM里测一下NodePort能不能通:
multipass shell microk8s-vm curl localhost:<实际NodePort>
能返回Nginx页面就说明VM内部没问题,问题在外部网络或防火墙。
3. 给Windows防火墙加放行规则
Windows防火墙大概率把NodePort端口挡住了,手动加规则:
- 打开「Windows Defender防火墙」→「高级设置」→「入站规则」→「新建规则」
- 选「端口」→ 下一步,输入你的NodePort(比如30080),选TCP
- 允许连接,下一步,按需勾选「域」「专用」「公网」
- 给规则起个名,比如「放行Microk8s NodePort 30080」,完成
4. 确认Microk8s的NodePort插件已启用
虽然默认是开的,但还是查一下:
microk8s status
看已启用插件里有没有node-port,没有的话执行:
microk8s enable node-port
5. 正确的跨网络访问方式
- 用VM的IP + NodePort访问:比如
http://192.168.1.100:30080(VM IP用multipass list查) - 要是想用主机IP访问,得在Windows上加端口转发:
开管理员PowerShell,执行:
比如netsh interface portproxy add v4tov4 listenaddress=<你的主机IP> listenport=<你想对外用的端口> connectaddress=<VM的IP> connectport=<实际NodePort>netsh interface portproxy add v4tov4 listenaddress=192.168.1.50 listenport=8080 connectaddress=192.168.1.100 connectport=30080,这样外部机器访问http://192.168.1.50:8080就到Nginx了。
6. 检查HyperV虚拟交换机设置
如果HyperV用的是自定义虚拟交换机,确保它是外部类型:
- 打开Hyper-V管理器→虚拟交换机管理器
- 找到Multipass用的交换机,确认类型是「外部」,并且勾了「允许管理操作系统共享此网络适配器」
内容的提问来源于stack exchange,提问作者Amarnath Jena
相关产品推荐
相关产品推荐

