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

Ingress Nginx路由规则偶发不生效,请求交替返回404如何排查解决?

问题根因

  1. 你的两个ClusterIP Service的标签选择器配置错误,导致同一个Service同时匹配到了prevlab和newlab两个应用的Pod:
    • 从Ingress日志可以看到,请求/upstream路径时,Ingress已经正确转发到prevlab-cluster-ip-service,但该Service后端绑定了两个不同Pod IP:10.1.0.181和10.1.0.179,两个Pod轮询接收流量
    • 其中一个是正确的prevlab应用Pod,返回200,另一个是错误的newlab应用Pod,没有对应接口返回404,反过来访问/downstream路径时也是同样逻辑
  2. 其次你的Ingress路径重写配置存在漏洞,当前路径正则匹配规则不严谨:
    • 你写的path: /upstream?(.*)里的?在正则中表示匹配前面字符0或1次,会匹配到/upstrea这类不符合预期的路径,不符合你的实际业务需求

解决步骤

  1. 先修正两个ClusterIP Service的selector配置:
    • 执行kubectl describe svc prevlab-cluster-ip-service -n javaspace查看当前标签选择器
    • 执行kubectl get pods -n javaspace --show-labels核对两个应用Pod的标签
    • 给两个应用的Pod分别配置唯一的业务标签,比如app: prevlab和app: newlab
    • 分别修改两个Service的selector,只匹配对应应用的Pod标签,确保每个Service后端只有1个对应应用的Pod
  2. 修正Ingress的路径匹配和重写规则,修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: javaspace
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http:
        paths:
          - path: /upstream(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: prevlab-cluster-ip-service
                port:
                  number: 8080
          - path: /downstream(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: newlab-cluster-ip-service
                port:
                  number: 8080
  1. 配置修改完成后重新apply即可生效

补充说明

这个问题不是ingress-nginx的默认行为,完全是Service标签选择器配置错误导致的流量异常,修正配置后即可完全恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:48:03