AWS EKS中Nginx Ingress后ASP.NET Core服务返回502 Bad Gateway求助
排查思路
- 最优先排查:ASP.NET容器监听端口不匹配
微软官方mcr.microsoft.com/dotnet/samples:aspnetapp镜像默认监听8080端口(为了兼容非root运行模式,没有使用80端口),你当前Deployment配置的containerPort为3001,Service的targetPort也指向3001,和容器实际监听端口不一致是502错误的最常见诱因。
验证操作:执行kubectl exec -it <moba-web-portal对应Pod名称> -- ss -tlnp查看容器内部实际监听的端口。如果确实为8080,两种解决方式:- 将Deployment的
containerPort、Service的targetPort都改为8080,Ingress后端端口同步改为8080 - 给ASP.NET容器添加环境变量
ASPNETCORE_URLS=http://+:3001强制监听3001端口
- 将Deployment的
- 第二步:验证Service层连通性(排除Ingress影响)
直接在集群内部测试Service是否可访问,执行:
如果无法正常返回响应,说明问题出在Deployment/Service层,和Ingress配置无关:kubectl run -it --rm --image=busybox:1.28 test -- wget -O- http://moba-web-portal.default.svc.cluster.local:3001- 执行
kubectl get pods -l app=moba-web-portal确认Pod处于Running状态,无重启报错 - 执行
kubectl get endpoints moba-web-portal确认Endpoint存在对应Pod的IP+端口记录,无空值
- 执行
- 第三步:校验Ingress规则匹配逻辑
你当前Ingress配置的路径前缀为/moba,但你提到访问的是/moba-web-portal路径,路径不匹配会直接找不到后端服务。要么将Ingress的path改为/moba-web-portal,要么访问/moba路径测试。
另外你配置了nginx.ingress.kubernetes.io/rewrite-target: /注解,所有匹配前缀的请求都会被重写为根路径传给后端,需要确认ASP.NET应用是否支持根路径访问,若应用需要保留路径前缀请删除该注解。 - 第四步:查看Ingress Controller日志定位具体错误
执行命令查看Nginx Ingress Controller的访问日志:
搜索对应502请求的日志条目:如果报错为kubectl logs -n <Ingress Controller所在命名空间> <Ingress Controller Pod名称>connection refused,说明还是后端端口/服务未正常监听;如果报错为connection timed out,检查EKS工作节点安全组是否放开3001端口入站规则、集群是否配置NetworkPolicy禁止Ingress Controller访问该服务端口。 - 第五步:验证后端协议配置
可以在Ingress注解中添加nginx.ingress.kubernetes.io/backend-protocol: "HTTP",明确指定后端使用HTTP协议访问,避免ASP.NET默认的HTTPS跳转逻辑导致的访问异常。
内容的提问来源于stack exchange,提问作者Luong To
相关产品推荐
相关产品推荐

