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

AKS中Nginx Ingress Controller多路由规则失效求助

问题描述

我已在AKS中安装了Nginx Ingress Controller,需要通过路径匹配分别转发请求至前端和后端服务。现有两个Ingress配置文件:

frontend.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc
            port:
              number: 80

backend.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: backend
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /backend(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: backend-svc
            port:
              number: 8005

预期效果:访问Ingress Controller地址时展示前端应用,访问/backend路径时调用后端API。但实际情况是,同时应用两个规则时Ingress无响应,删除其中一个规则则对应服务可正常访问。

解决方案

问题根源在于你创建了两个独立的Ingress资源。Nginx Ingress Controller合并多个Ingress的规则时,前缀匹配/会优先拦截所有请求,导致后端的/backend规则无法生效,甚至因规则冲突引发Ingress无响应。正确做法是将两个路径规则合并到同一个Ingress资源中,并确保更具体的路径规则排在前面,保证匹配顺序正确。

修改后的合并配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      # 优先匹配后端的具体路径
      - path: /backend(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: backend-svc
            port:
              number: 8005
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /$2
      # 根路径作为兜底规则,匹配所有未被前面规则拦截的请求
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc
            port:
              number: 80
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /

关键说明

  1. 规则顺序:Nginx Ingress按从上到下的顺序匹配路径,将/backend这类具体路径放在前面,避免被根路径的前缀匹配先拦截。
  2. 正则匹配:添加nginx.ingress.kubernetes.io/use-regex: "true"注解,启用正则路径匹配,确保/backend(/|$)(.*)能正确匹配/backend、/backend/及/backend/xxx等路径。
  3. 路径级重写:为每个路径单独配置rewrite-target注解,满足前端和后端不同的重写需求。

验证步骤

  1. 删除原有两个Ingress:
    kubectl delete ingress frontend backend
    
  2. 应用合并后的配置文件(假设保存为app-ingress.yaml):
    kubectl apply -f app-ingress.yaml
    
  3. 检查Ingress状态:
    kubectl get ingress
    
    确认ADDRESS字段已正确关联Ingress Controller的IP,且READY状态为True。

内容的提问来源于stack exchange,提问作者Mohamed Thasin ah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:37:46