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

Azure Kubernetes中React+Flask服务的Ingress路由配置问题

问题:Azure Kubernetes应用网关Ingress路由配置异常

在Azure Kubernetes环境中使用应用网关Ingress控制器配置流量路由,需求如下:

  • 所有默认流量转发至React前端服务(端口3000)
  • 所有包含/api前缀的请求转发至Python Flask后端服务(端口5001)

当前尝试两种Ingress配置均存在问题:

  1. 初始配置中,前端可正常访问,但/api请求无法到达后端(后端日志无相关请求记录)
  2. 修改路径和前缀配置后,/api请求能到达后端,但前端无法访问,且后端因路由无/api前缀返回404

正确的Ingress配置方案

核心问题在于路径匹配规则与后端路径前缀重写的配合,以下是修正后的完整配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/ssl-redirect: "true"
    appgw.ingress.kubernetes.io/backend-protocol: "http"
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - mydomain.com
      secretName: letsencrypt-prod-secret
  rules:
    - host: mydomain.com
      http:
        paths:
          # 前端默认路由:匹配所有路径,优先级低于/api规则
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 3000
          # 匹配所有/api/开头的请求,并重写路径去掉/api前缀
          - path: /api/*
            pathType: ImplementationSpecific
            backend:
              service:
                name: backend-service
                port:
                  number: 5001
            annotations:
              appgw.ingress.kubernetes.io/backend-path-prefix: "/"
          # 单独匹配/api根路径,避免请求丢失
          - path: /api
            pathType: Exact
            backend:
              service:
                name: backend-service
                port:
                  number: 5001
            annotations:
              appgw.ingress.kubernetes.io/backend-path-prefix: "/"

配置说明:

  1. 路径匹配:
    • 用/api/*匹配所有/api/开头的请求(如/api/login),ImplementationSpecific适配应用网关的路径解析逻辑
    • 单独添加/api精确匹配规则,确保根路径请求能被正确转发
  2. 路径重写:
    针对后端路径规则添加局部注解appgw.ingress.kubernetes.io/backend-path-prefix: "/",应用网关会自动将/api/login重写为/login转发给Flask,匹配后端无/api前缀的路由

其他实现方式

方式1:调整Flask后端路由前缀

修改Flask代码,给所有后端路由统一添加/api前缀:

from flask import Flask
app = Flask(__name__)

@app.route('/api/login')
def login():
    # 业务逻辑
    return "Login Success"

此时Ingress配置可简化,无需路径重写:

paths:
  - path: /
    pathType: Prefix
    backend:
      service:
        name: frontend-service
        port: 3000
  - path: /api
    pathType: Prefix
    backend:
      service:
        name: backend-service
        port: 5001

方式2:直接配置应用网关URL重写规则

跳过Ingress注解,直接在Azure门户中操作应用网关:

  1. 找到对应应用网关的路由规则
  2. 添加URL重写配置,将/api/*重写为/*,并绑定到后端服务池

方式3:拆分Ingress资源

为前端和后端分别创建独立的Ingress资源,路由规则更清晰:

  • 前端Ingress:匹配所有/路径
  • 后端Ingress:匹配/api前缀路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:43:15