EKS使用AWS ALB Controller时Ingress子路径访问返回404问题
问题根因
- AWS ALB转发请求时默认保留完整原始路径,访问
http://alb-dns/foo/时,到达后端Nginx的请求路径仍为/foo/,而默认Nginx部署仅在根路径/映射首页资源,不存在/foo/、/bar/对应的站点内容,因此返回404,本质是路径重写能力缺失导致的转发不匹配。
可选解决方案
方案1:保留AWS Load Balancer Controller实现需求
不需要切换控制器即可实现路径访问,核心是通过ALB原生支持的自定义转发动作配置路径重写,之前配置未生效通常是注解格式错误、控制器版本过低导致。
- 前置检查:确认集群运行的AWS Load Balancer Controller版本不低于
v2.2.0,低于该版本不支持路径重写动作。 - 正确的Ingress配置参考:通过
alb.ingress.kubernetes.io/actions注解定义带路径重写的转发规则,将非根路径的请求重写为/后再转发给后端服务,配置示例如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: ns-fargate-app name: game-app-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip kubernetes.io/ingress.class: alb # 定义/foo路径的重写转发动作 alb.ingress.kubernetes.io/actions.rewrite-foo: > {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"game-app-service","servicePort":80}]}, "rewriteConfig":{"path":"/"}} # 定义/bar路径的重写转发动作 alb.ingress.kubernetes.io/actions.rewrite-bar: > {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"game-app-service","servicePort":80}]}, "rewriteConfig":{"path":"/"}} spec: rules: - http: paths: - path: /foo/ pathType: Prefix backend: service: name: rewrite-foo port: name: use-annotation - path: /bar/ pathType: Prefix backend: service: name: rewrite-bar port: name: use-annotation - path: / pathType: Prefix backend: service: name: game-app-service port: number: 80
- 其他轻量替代方式:
- 直接修改Nginx配置,在Nginx内部添加
/foo/、/bar/路径的映射规则,将请求内部跳转至根路径首页,无需调整Ingress配置,但多服务场景下每个服务都需要单独适配路径,维护成本较高。 - 配置ALB重定向动作,将
/foo/、/bar/的请求302跳转至根路径,但该方式会导致用户浏览器地址栏变更为根路径,透明性较差,仅适合临时测试场景。
- 直接修改Nginx配置,在Nginx内部添加
方案2:切换Nginx Ingress Controller的选型判断
根据实际业务场景选择即可,没有绝对的优劣:
- 如果业务大量使用路径重写、正则路径匹配、细粒度流量切分、自定义认证等Ingress层高级能力,优先切换为Nginx Ingress Controller。该控制器原生支持
nginx.ingress.kubernetes.io/rewrite-target注解,路径重写配置简单,社区生态成熟,这类路径转发问题的排查成本更低。 - 如果架构已经深度绑定AWS生态,后续需要用到ALB原生的WAF集成、Cognito认证、AWS基础设施原生适配等能力,保留AWS Load Balancer Controller即可,通过上述自定义动作配置完全可以满足路径重写需求,无需强行切换。
配置验证注意事项
- 应用更新后的Ingress配置后,到AWS控制台查看ALB监听器规则,确认
/foo/、/bar/对应的规则已关联「重写路径为/」的动作 - 验证时清空浏览器缓存,避免历史404响应缓存干扰结果
- 如果需要同时匹配不带尾斜杠的
/foo路径访问,需要额外添加一条path为/foo的转发规则,否则不带尾斜杠的请求仍会匹配失败返回404
内容的提问来源于stack exchange,提问作者Suvendu Mandal
相关产品推荐
相关产品推荐

