Azure Kubernetes中React+Flask服务的Ingress路由配置问题
问题:Azure Kubernetes应用网关Ingress路由配置异常
在Azure Kubernetes环境中使用应用网关Ingress控制器配置流量路由,需求如下:
- 所有默认流量转发至React前端服务(端口3000)
- 所有包含
/api前缀的请求转发至Python Flask后端服务(端口5001)
当前尝试两种Ingress配置均存在问题:
- 初始配置中,前端可正常访问,但/api请求无法到达后端(后端日志无相关请求记录)
- 修改路径和前缀配置后,/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: "/"
配置说明:
- 路径匹配:
- 用
/api/*匹配所有/api/开头的请求(如/api/login),ImplementationSpecific适配应用网关的路径解析逻辑 - 单独添加
/api精确匹配规则,确保根路径请求能被正确转发
- 用
- 路径重写:
针对后端路径规则添加局部注解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门户中操作应用网关:
- 找到对应应用网关的路由规则
- 添加URL重写配置,将
/api/*重写为/*,并绑定到后端服务池
方式3:拆分Ingress资源
为前端和后端分别创建独立的Ingress资源,路由规则更清晰:
- 前端Ingress:匹配所有
/路径 - 后端Ingress:匹配
/api前缀路径
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

