Ingress Nginx路由规则偶发不生效,请求交替返回404如何排查解决?
问题根因
- 你的两个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路径时也是同样逻辑
- 从Ingress日志可以看到,请求
- 其次你的Ingress路径重写配置存在漏洞,当前路径正则匹配规则不严谨:
- 你写的
path: /upstream?(.*)里的?在正则中表示匹配前面字符0或1次,会匹配到/upstrea这类不符合预期的路径,不符合你的实际业务需求
- 你写的
解决步骤
- 先修正两个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
- 执行
- 修正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
- 配置修改完成后重新apply即可生效
补充说明
这个问题不是ingress-nginx的默认行为,完全是Service标签选择器配置错误导致的流量异常,修正配置后即可完全恢复正常。
内容的提问来源于stack exchange,提问作者Harshit Rajput
相关产品推荐
相关产品推荐

