如何在AKS中配置支持多API端点的Ingress Controller
解决AKS Nginx Ingress多API路由重写问题
你遇到的核心问题是全局rewrite-target注解只能生效最后一个,要实现多路径对应不同后端API,需要给每个路由单独配置正则匹配和重写规则,利用Nginx Ingress的正则捕获组来完整保留查询参数。
修正后的Ingress配置
kind: Ingress metadata: name: test-ingress namespace: containerpoc annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" # 移除全局rewrite-target,改为给每个路径单独配置重写规则 spec: ingressClassName: nginx rules: - http: paths: # 匹配 /Account?xxx,重写到后端的 /api/AccountBalance?xxx - path: /Account(/|$)(.*) pathType: ImplementationSpecific backend: service: name: accountbalance-service port: number: 80 annotations: nginx.ingress.kubernetes.io/rewrite-target: /api/AccountBalance?$2 # 匹配 /account/balanceref?xxx,重写到后端的 /api/RefiningDetail?xxx - path: /account/balanceref(/|$)(.*) pathType: ImplementationSpecific backend: service: name: accountbalance-service port: number: 80 annotations: nginx.ingress.kubernetes.io/rewrite-target: /api/RefiningDetail?$2 # 匹配 /Transaction?xxx,重写到后端的 /api/Transactions?xxx - path: /Transaction(/|$)(.*) pathType: ImplementationSpecific backend: service: name: transactions-service port: number: 80 annotations: nginx.ingress.kubernetes.io/rewrite-target: /api/Transactions?$2 # 匹配 /refining?xxx,重写到后端的 /api/Refining?xxx - path: /refining(/|$)(.*) pathType: ImplementationSpecific backend: service: name: refining-service # 替换为你的refining服务实际名称 port: number: 80 annotations: nginx.ingress.kubernetes.io/rewrite-target: /api/Refining?$2
关键配置说明
正则路径匹配:
- 用
/Account(/|$)(.*)这类正则表达式,(/|$)确保匹配/Account或/Account/开头的路径,(.*)捕获所有后续内容(包括查询参数?xxx部分)。 - 必须设置
pathType: ImplementationSpecific:因为使用了正则表达式,不能用Prefix或Exact类型。
- 用
单路径独立重写:
- 给每个
paths条目单独添加rewrite-target注解,用$2引用正则捕获的第二个分组(即查询参数部分),确保浏览器传入的查询参数完整传递到后端API。
- 给每个
查询参数传递逻辑:
- 重写规则里的
?$2会把捕获到的查询参数直接追加到后端API路径后,比如访问IP/Account?account=1,后端会收到/api/AccountBalance?account=1,完全符合你的需求。
- 重写规则里的
验证步骤
- 应用修正后的Ingress配置:
kubectl apply -f your-ingress-file.yaml -n containerpoc - 检查Ingress状态:
kubectl get ingress test-ingress -n containerpoc - 测试各路由:
- 访问
http://<AKS-IP>/Account?account=1,验证accountbalance-service的/api/AccountBalance接口是否正常响应。 - 访问
http://<AKS-IP>/refining?CustomRefnum=&Ref=2323-oo&DateReceived=03-May-2023&account=0000,验证对应后端服务的/api/Refining接口是否正常接收参数。
- 访问
内容的提问来源于stack exchange,提问作者Sudhir Goswami
相关产品推荐
相关产品推荐

