AKS环境下Nginx Ingress访问mydns/post/test出现404错误求助
问题:访问mydns/post/test出现Nginx 404错误
我已将DNS映射至AKS负载均衡器的外部IP,负载均衡器下部署了Nginx Ingress Controller以对接集群内服务的Ingress。尝试访问mydns/post/test时收到Nginx 404错误,推测是内部路由映射问题。以下是实现步骤:
- 通过命令安装Nginx Ingress Controller:
执行kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yamlkubectl get all -n ingress-nginx可查看资源状态。 - 创建Ingress资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: service-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: post-service port: number: 8080 - 对应post-service资源:
apiVersion: v1 kind: Service metadata: name: post-service spec: selector: app.kubernetes.io/name: post ports: - port: 8080 targetPort: 8080
该服务关联的Pod运行Spring Boot应用,其/test端点已通过端口转发验证正常:
@RestController @Slf4j public class PostController { @GetMapping("/test") String all() { return "Hello!"; } }
原因分析与解决方案
错误原因
你访问的mydns/post/test路径中,/post是Ingress未配置的前缀。当前Ingress仅匹配/前缀,默认会把完整请求路径/post/test转发给后端Spring Boot应用,但你的应用只监听/test端点,因此后端返回404,最终Nginx将该错误返回给客户端。
解决办法
办法1:调整Ingress规则适配/post前缀
修改Ingress资源,添加/post前缀的匹配规则,并通过注解重写路径,去掉/post部分后转发给后端:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: service-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /post(/|$)(.*) pathType: ImplementationSpecific backend: service: name: post-service port: number: 8080
配置生效后,/post/test会被重写为/test转发给后端,匹配你的Spring Boot端点。
办法2:修改访问路径
如果不需要/post前缀,直接访问mydns/test即可,当前Ingress已将所有/前缀的请求转发给post-service,后端/test端点可正常响应。
验证配置
修改Ingress后执行以下命令确认生效:
kubectl apply -f <修改后的ingress.yaml> # 查看Ingress状态 kubectl get ingress service-ingress # 查看Nginx Ingress日志,确认路由规则 kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
内容的提问来源于stack exchange,提问作者Ciube
相关产品推荐
相关产品推荐

