AKS环境下前端无法连接后端微服务,Ingress请求报404
AKS Ingress返回404故障排查
问题背景
已在AKS中部署服务,前端通过LoadBalancer暴露,本应请求两个微服务数据但网站无法接收数据。直接向Ingress发起请求仍返回404错误。
Ingress资源配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: bert-ingress namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - http: paths: - path: /reinforcement pathType: Prefix backend: service: name: bertreinforcement port: number: 5000 - path: /environment pathType: Prefix backend: service: name: bertenvironment port: number: 8080
请求测试结果
(base) b:~$ curl -I http://<IngressIP>/reinforcement/get_prediction_result HTTP/1.1 404 Not Found Date: Tue, 13 Aug 2024 05:44:26 GMT Content-Type: text/html Content-Length: 146 Connection: keep-alive (base) b:~$ curl -I http://<IngressIP>/environment/get_result HTTP/1.1 404 Not Found Date: Tue, 13 Aug 2024 05:44:39 GMT Content-Type: text/html Content-Length: 146 Connection: keep-alive
已确认端口及名称配置无误,代码端点配置正确,需排查故障原因是Ingress配置还是内部微服务暴露流程问题。
故障原因及解决方法
问题出在Ingress的rewrite-target注解配置上:
当前设置nginx.ingress.kubernetes.io/rewrite-target: /,当请求/reinforcement/get_prediction_result时,Ingress会把整个路径重写为/,而非保留/get_prediction_result部分,导致请求发到后端服务的根路径,但你的服务实际监听的是/get_prediction_result这类具体端点,因此返回404。
正确配置方式
需要使用带正则捕获组的重写规则,适配Kubernetes v1版本Ingress的路径处理逻辑:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: bert-ingress namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - http: paths: - path: /reinforcement(/|$)(.*) pathType: Prefix backend: service: name: bertreinforcement port: number: 5000 - path: /environment(/|$)(.*) pathType: Prefix backend: service: name: bertenvironment port: number: 8080
配置说明
path: /reinforcement(/|$)(.*):通过正则捕获组,把/reinforcement之后的路径部分捕获到$2变量中rewrite-target: /$2:将请求重写为后端服务对应的路径,比如请求/reinforcement/get_prediction_result会被转换为/get_prediction_result,完美匹配后端服务的端点
额外验证步骤
- 应用修改后的Ingress配置:
kubectl apply -f your-ingress-file.yaml - 等待Ingress控制器更新配置后,重新测试请求
- 如果仍有问题,先验证后端服务本身是否正常:
- 查看服务Pod状态:
kubectl get pods - 本地端口转发测试:
kubectl port-forward service/bertreinforcement 5000:5000,然后访问http://localhost:5000/get_prediction_result确认服务端点是否正常响应
- 查看服务Pod状态:
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

