WSL2+Windows环境KinD集群Ingress无法通过hostPort访问问题
问题根本原因
- KinD是本地轻量化K8s发行版,默认没有集成云厂商的LoadBalancer负载均衡实现组件,因此你看到的
ingress-nginx-controller服务为LoadBalancer类型、External-IP始终处于<Pending>状态是默认环境下的正常表现,不是故障本身。 - 你配置的
extraPortMappings规则作用是将Windows宿主机的5180/51443端口,映射到KinD控制平面节点容器的80/443端口,但你通过Helm安装的Ingress NGINX控制器默认没有监听节点本地的80/443端口,而是通过NodePort类型的随机端口(你输出里的30674/30800)暴露服务,流量根本没有走到节点的80/443端口上,自然无法通过映射的宿主机端口访问。 - WSL2+Docker Desktop架构存在双层网络转发:Windows宿主机->WSL2虚拟机->Docker容器,任意一层的端口转发规则未自动同步,都会导致localhost访问失败。
- 你给控制平面节点打了
ingress-ready=true标签,但如果Ingress控制器Pod没有被调度到这个节点上,即使配置了HostPort也无法生效。
排查与修复步骤
- 重新配置Ingress NGINX控制器,适配KinD的端口映射规则
卸载原有不符合配置的Ingress控制器后,通过Helm重新安装时追加以下参数,强制控制器以HostPort模式监听节点80/443端口,并且调度到打了对应标签的控制平面节点上:
helm upgrade --install ingress-nginx ingress-nginx \ --namespace ingress-nginx --create-namespace \ --set controller.hostPort.enabled=true \ --set controller.service.type=NodePort \ --set controller.nodeSelector.ingress-ready=true \ --set controller.publishService.enabled=false
安装完成后执行以下命令,进入KinD控制平面容器验证端口监听状态,替换命令中<kind-control-plane容器名>为你实际的控制平面容器名称(可通过docker ps查看):docker exec -it <kind-control-plane容器名> ss -tulpn | grep -E ':(80|443)'
正常返回结果中可以看到nginx进程在0.0.0.0:80、0.0.0.0:443上处于监听状态。
分层验证网络连通性
- 第一步先进入WSL2终端,执行
curl http://localhost:5180验证WSL2层是否能正常访问服务。如果WSL2内访问正常、Windows侧访问失败,说明是Docker Desktop的WSL2端口转发规则失效,重启Docker Desktop即可恢复,必要时可以手动在Windows防火墙添加端口放行规则。 - 如果WSL2内也无法访问,执行
kubectl get pods -n ingress-nginx -o wide确认Ingress控制器Pod确实运行在打了ingress-ready=true标签的控制平面节点上,没有调度到worker节点。
- 第一步先进入WSL2终端,执行
校验Ingress资源配置
执行kubectl describe ingress <你的自定义Ingress资源名>,查看事件栏是否存在配置报错:- 确认
ingressClassName字段值为nginx,和安装的控制器匹配 - 确认后端关联的服务、端口配置正确,端点列表中存在正常运行的Pod IP,不存在
BackendNotFound类的报错 - 确认你访问的域名和Ingress规则中配置的host字段匹配,测试时可以通过
curl -H "Host: 你配置的域名" http://localhost:5180指定Host头访问。
- 确认
内容的提问来源于stack exchange,提问作者Dunge
相关产品推荐
相关产品推荐

