You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Ingress返回502 Bad Gateway错误的原因排查求助

解决Kubernetes Ingress 502 Bad Gateway问题

问题根源分析

从Nginx控制器日志的connect() failed (111: Connection refused)可以明确:Ingress控制器尝试将流量转发到Pod的8000端口,但Pod内的应用并未在该端口监听,导致连接被拒绝。结合配置文件,核心问题有两个:

  1. 端口配置不匹配:你的.NET应用基于mcr.microsoft.com/dotnet/aspnet:7.0镜像构建,该镜像默认配置.NET应用监听80端口(通过环境变量ASPNETCORE_URLS=http://+:80),但Deployment和Service却错误地将端口指向了8000。
  2. 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

验证步骤

  1. 测试Pod内应用可用性:

    kubectl exec -it <pod-name> -- curl localhost:80
    

    替换<pod-name>为你的Pod名称,确认能收到应用的正常响应。

  2. 测试Service可用性:

    kubectl port-forward service/ticket-application-service 8000:8000
    

    本地访问http://localhost:8000,确认应用可正常访问。

  3. 检查Service Endpoints:

    kubectl get endpoints ticket-application-service
    

    确认输出中包含3个Pod的IP地址,且端口为80。

内容的提问来源于stack exchange,提问作者borjanob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:11:20