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

Ingress Nginx遇Bad Gateway错误,/api/command无法访问,求路由与排障

问题排查与解决方案

一、先解决Bad Gateway错误

你的Ingress配置里有个致命拼写错误,这大概率是引发Bad Gateway的核心原因:
nginx.ingress.kubernetes.io/reqrite-target: / 要改成 nginx.ingress.kubernetes.io/rewrite-target: /(少了字母w)。这个注解负责将Ingress收到的请求路径重写后转发给后端服务,拼写错误会导致Nginx无法正确处理路径转发,直接触发502错误。

除此之外,按以下步骤逐一排查:

  1. 检查Pod运行状态:执行 kubectl get pods,确认command-depl的Pod处于Running状态,没有重启、崩溃或镜像拉取失败的情况。如果Pod状态异常,先解决容器启动问题。
  2. 验证端口匹配:确认commandservice容器内部确实在80端口提供服务。如果容器服务实际监听的是其他端口(比如3000),需要把Service的targetPort改成对应端口:
    ports:
    - port: 80
      protocol: TCP
      targetPort: 3000  # 替换为容器实际监听的端口
    
  3. 测试集群内服务连通性:临时启动一个测试Pod,执行集群内访问测试:
    kubectl run -it --rm busybox --image=busybox:1.36
    wget -qO- command-clusterip-srv/api/command
    
    如果这里无法获取响应,说明服务本身存在问题,和Ingress无关。

修正后的Ingress配置(适配路径后缀转发场景):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: acme.com
      http:
        paths:
          - path: /api/platform(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: platform-clusterip-srv
                port:
                  number: 80
          - path: /api/command(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: command-clusterip-srv
                port:
                  number: 80

注:如果后端服务需要接收完整的/api/command路径,保持rewrite-target: /即可;如果需要转发路径后缀(比如/api/command/create),用/$1配合正则路径会更灵活。

二、配置/api/myservice路由不同服务

如果要通过/api/myservice下的子路径路由到不同服务(比如/api/myservice/command对应command-service,/api/myservice/platform对应platform-service),可以这样配置Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - host: acme.com
      http:
        paths:
          - path: /api/myservice/platform(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: platform-clusterip-srv
                port:
                  number: 80
          - path: /api/myservice/command(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: command-clusterip-srv
                port:
                  number: 80

解释:

  • 路径规则/api/myservice/platform(/|$)(.*)会匹配所有以/api/myservice/platform开头的请求,包括/api/myservice/platform和/api/myservice/platform/list
  • rewrite-target: /$2会将请求路径重写为第二个捕获组的内容,比如/api/myservice/platform/list会转发给后端服务的/list

如果后端服务需要接收完整的/api/myservice/xxx路径,直接去掉rewrite-target注解,保留pathType: Prefix即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:35:02