Kubernetes Ingress返回502 Bad Gateway错误的原因排查求助
解决Kubernetes Ingress 502 Bad Gateway问题
问题根源分析
从Nginx控制器日志的connect() failed (111: Connection refused)可以明确:Ingress控制器尝试将流量转发到Pod的8000端口,但Pod内的应用并未在该端口监听,导致连接被拒绝。结合配置文件,核心问题有两个:
- 端口配置不匹配:你的.NET应用基于
mcr.microsoft.com/dotnet/aspnet:7.0镜像构建,该镜像默认配置.NET应用监听80端口(通过环境变量ASPNETCORE_URLS=http://+:80),但Deployment和Service却错误地将端口指向了8000。 - Ingress重写规则配置错误:你启用了正则重写,但路径
/ticket未包含正则捕获组,导致rewrite-target: /$1中的$1为空,可能引发请求路径异常。
分步解决方案
1. 修正Pod与Service的端口配置
修正后的Deployment配置(ticket-application-deployment.yml)
apiVersion: apps/v1 kind: Deployment metadata: name: ticket-application-deployment spec: replicas: 3 selector: matchLabels: component: ticketApp template: metadata: labels: component: ticketApp spec: containers: - name: ticket-app image: borjanob/ticket_app:55da0f121ba6432da3c5afdf48950a00bc431e29 ports: - containerPort: 80 # 改为应用实际监听的80端口
修正后的Service配置(ticket-application-service.yml)
apiVersion: v1 kind: Service metadata: name: ticket-application-service spec: type: ClusterIP selector: component: ticketApp ports: - port: 8000 # Service对外暴露的端口可保持不变 targetPort: 80 # 修正为容器内应用的监听端口
2. 修正Ingress的重写规则
由于启用了正则重写,需要将路径改为带捕获组的格式,确保rewrite-target能正确匹配路径:
修正后的Ingress配置(ingress-service.yml)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-service-project annotations: kubernetes.io/ingress.class: 'nginx' nginx.ingress.kubernetes.io/use-regex: 'true' nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - http: paths: - path: /ticket/(.*) # 添加正则捕获组,匹配/ticket下的所有子路径 pathType: ImplementationSpecific # 适配正则路径的类型 backend: service: name: ticket-application-service port: number: 8000
验证步骤
测试Pod内应用可用性:
kubectl exec -it <pod-name> -- curl localhost:80替换
<pod-name>为你的Pod名称,确认能收到应用的正常响应。测试Service可用性:
kubectl port-forward service/ticket-application-service 8000:8000本地访问
http://localhost:8000,确认应用可正常访问。检查Service Endpoints:
kubectl get endpoints ticket-application-service确认输出中包含3个Pod的IP地址,且端口为
80。
内容的提问来源于stack exchange,提问作者borjanob
相关产品推荐
相关产品推荐

