如何通过Nginx Ingress Controller暴露EKS微服务并解决路径匹配异常
问题根因
你当前的Ingress配置中两个路由条目都使用path: /前缀规则,Nginx Ingress的匹配逻辑为前缀优先匹配,相同前缀的规则仅会按配置顺序生效第一个,因此永远只会将请求转发到排在前面的Service,这就是调整规则顺序后仅有一个服务可用的核心原因。
同时你配置的nginx.ingress.kubernetes.io/rewrite-target: /注解会将所有匹配到的请求路径强制重写为根路径,若后续配置分路径匹配规则需注意该注解的影响。
解决方案
按照两个服务的接口路径前缀拆分Ingress路由规则即可,具体配置参考如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/force-ssl-redirect: "false" # 移除rewrite-target注解,保证原请求路径完整传递到后端服务 spec: rules: - http: paths: # 所有/camps前缀的请求转发到integrations-api - path: /camps backend: serviceName: integrations-api servicePort: 80 # 所有/users前缀的请求转发到user-api - path: /users backend: serviceName: user-api servicePort: 80
如果后续你需要为服务添加统一的访问前缀(如/api/integrations/前缀对应integrations-api的根路径),可配合rewrite规则的捕获组实现,示例如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /api/integrations(/|$)(.*) backend: serviceName: integrations-api servicePort: 80 - path: /api/user(/|$)(.*) backend: serviceName: user-api servicePort: 80
此配置下访问/api/integrations/camps会自动重写为/camps转发到后端integrations-api服务。
额外优化建议
你当前的后端服务配置了LoadBalancer类型的Service,由于请求已经通过Ingress Controller的NLB转发,后端服务直接使用ClusterIP类型即可,无需额外创建LB,可减少资源损耗。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

