Nginx Ingress仅带NodePort可访问 如何配置无需NodePort即可访问
问题原因及排查方案
一、带NodePort可访问、不带端口无法访问的常见原因
你访问时携带的31840是Ingress Nginx控制器的LoadBalancer服务对应80端口的NodePort,默认不带端口访问时请求的是目标IP的80端口,出现该问题核心原因是你本地到Ingress控制器80端口的网络链路不通,常见场景如下:
- 你的Ingress Controller的LoadBalancer服务只有内网IP:从你给出的输出可以看到EXTERNAL-IP是
172.xxx.xx.130的私网地址,如果你本地不在集群所在的VPC/内网环境下,无法直接访问该私网IP的80端口,只能通过NodePort走集群节点的公网IP+端口访问。 - 域名解析配置错误:你将
somehostname.xyz解析到了集群节点的公网IP,而节点本身没有监听80端口,只有Ingress Controller的NodePort31840在节点上被监听,所以只有带端口才能访问。 - 云服务商安全组/防火墙规则拦截:你没有给LoadBalancer或者集群节点开放80端口的入方向访问规则,导致80端口的请求被拦截。
二、定位问题的测试方法
- 集群内部验证Ingress配置有效性:在集群内启动临时测试Pod执行请求,验证Ingress和后端服务是否正常
如果能正常返回Auth服务的页面内容,说明Ingress规则、后端服务配置完全正常,问题出在集群外部的网络链路。kubectl run -it --rm --image=curlimages/curl testcurl -- curl -H "Host: somehostname.xyz" http://172.xxx.xx.130 - 本地验证域名解析:执行
nslookup somehostname.xyz,确认返回的IP是否符合预期,如果返回的是集群节点的公网IP,不带端口访问80端口肯定会失败。 - 直接访问LoadBalancer IP验证:本地执行命令测试能否直接访问Ingress的80端口
如果请求失败说明你本地到该IP的80端口网络不通。curl http://172.xxx.xx.130 -H "Host: somehostname.xyz" - 节点端口监听验证:登录集群任意节点执行
ss -tulpn | grep :80,如果没有进程监听80端口,说明节点本身没有开放80端口的服务,访问节点IP的80端口必然被拒绝。
三、排查方向说明
首先可以排除以下可能性:
- Auth服务配置错误:带NodePort可以正常访问所有路径,说明Flask配置、Auth的Deployment和Service配置都没有问题。
- Ingress规则/命名空间配置错误:
kubectl describe ingress的输出显示规则匹配正常,所有资源都在default命名空间下,不存在匹配问题。 - Ingress控制器故障:带NodePort可以正常转发请求,说明Ingress控制器Pod运行正常,规则已经成功加载。
按照以下步骤排查即可:
- 先确认Ingress的LoadBalancer IP的网络属性:如果
172.xxx.xx.130是内网IP,你本地不在同一内网环境下,要么给LoadBalancer申请公网IP,开放80/443端口的安全组规则,再把域名解析到该公网IP;要么继续使用NodePort方式访问。 - 检查域名解析配置:如果已经申请了公网LoadBalancer IP,确保
somehostname.xyz解析到的是该公网IP,而不是集群节点的IP。 - 如果没有公网LoadBalancer资源,可以在集群节点上部署Nginx反向代理,监听80端口,将请求转发到Ingress的NodePort
31840,即可实现不带端口访问。
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

