Azure AKS中Nginx Ingress外部IP无法访问连接超时问题
AKS环境Nginx Ingress公网访问超时排查方案
连接超时属于流量未到达Ingress控制器的典型表现,按以下优先级排查即可:
1. 公网链路排查(90%的连接超时问题出在这层)
- 检查Azure负载均衡健康状态
你已经给Ingress Service加了service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path=/healthz注解,先到Azure控制台找到AKS节点资源组自动创建的负载均衡器,查看80端口对应的健康探针状态:如果探针探测失败,负载均衡会直接丢弃所有入站流量,不会向后端转发。 - 检查网络安全组(NSG)规则
确认AKS节点关联的NSG放行了80、443端口的公网入站流量,同时必须放通源为AzureLoadBalancer服务标签的入站流量,否则健康探针会被拦截,导致负载均衡不转发流量。 - 验证Service的负载均衡配置
执行kdev get svc nginx-ingress-ingress-nginx-controller -o yaml,检查spec.loadBalancerSourceRanges字段,如果配置了错误的IP段拦截,会直接导致公网访问被拒,可临时清空该字段做连通性验证。
2. 集群内连通性验证
先跳过公网链路,直接在集群内部测试Ingress连通性,定位问题边界:
- 执行命令进入集群内任意业务Pod,curl访问Ingress控制器的ClusterIP:
kdev exec -it <你的业务pod名称> -- curl -v http://10.0.106.37/wallet - 如果集群内访问正常,说明Ingress规则、后端wallet-service、控制器本身都没有问题,故障完全出在Azure公网负载均衡到节点的链路,回到第1部分排查即可。
- 如果集群内访问也超时,继续排查控制器本身状态。
3. Ingress控制器状态排查
- 检查控制器Pod运行状态:
确认2个副本Pod都处于kdev get pods -l app.kubernetes.io/component=controllerRunning状态,没有持续重启、Crash的情况。 - 检查控制器端点是否正常:
确认返回结果中正确列出2个控制器Pod的IP和80端口地址,不存在空端点问题。kdev get endpoints nginx-ingress-ingress-nginx-controller - 查看控制器日志:
发起curl请求时如果日志中完全没有对应请求记录,证明流量确实没有到达控制器进程。kdev logs -l app.kubernetes.io/component=controller --tail=100
4. 配置修正提示(连通性恢复后处理,不会导致连接超时)
你当前的Ingress注解配置存在重写规则错误,连通后会出现404问题:
- 现有配置
nginx.ingress.kubernetes.io/rewrite-target: /api/v1$uri搭配正则匹配的写法不符合Nginx Ingress的重写规范,需要调整path配置为正则捕获格式:
同时把rewrite-target注解修改为# 调整后的path配置示例 paths: - path: /wallet(/|$)(.*) pathType: ImplementationSpecific backend: service: name: wallet-service port: number: 80nginx.ingress.kubernetes.io/rewrite-target: /api/v1/$2,才能正确把/wallet/xxx的请求转发到后端服务的/api/v1/wallet/xxx路径。
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

