Kubernetes Ingress Nginx HTTP访问404但HTTPS正常求助
问题排查与解决步骤
1. 确认HTTP请求是否正确到达Ingress Controller
你的Ingress Controller的80端口映射到了NodePort 31797,而本地hosts配置为127.0.0.1 example.com。直接访问http://example.com时默认使用本地80端口,若该端口未转发到Ingress的31797,请求根本无法到达Ingress Controller。
- 先尝试访问
http://example.com:31797,若能正常响应,说明是本地端口转发问题:- Windows环境下可通过
netsh工具将本地80端口映射到31797:netsh interface portproxy add v4tov4 listenport=80 listenaddress=127.0.0.1 connectport=31797 connectaddress=127.0.0.1 - 或后续直接使用带端口的地址访问。
- Windows环境下可通过
2. 修正Ingress路径匹配配置
你启用了正则匹配,但pathType设置为Prefix,这会导致正则规则无法正确生效(Kubernetes v1 Ingress中,use-regex注解仅在pathType为ImplementationSpecific时才能完全兼容正则匹配逻辑)。
修改Ingress配置的所有pathType为ImplementationSpecific:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-srv annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' nginx.ingress.kubernetes.io/ssl-redirect: "false" # 保留该注解以禁用HTTPS强制跳转 spec: rules: - host: example.com http: paths: - path: /create-posts pathType: ImplementationSpecific backend: service: name: posts-clusterip-srv port: number: 4000 - path: /posts pathType: ImplementationSpecific backend: service: name: query-srv port: number: 4002 - path: /posts/?(.*)/comments pathType: ImplementationSpecific backend: service: name: comments-srv port: number: 4001 - path: /?(.*) pathType: ImplementationSpecific backend: service: name: client-srv port: number: 3000
应用修改:
kubectl apply -f ingress-srv.yaml
3. 验证Ingress配置是否生效
查看Ingress的详细状态,确认路由规则已正确加载:
kubectl describe ingress ingress-srv
重点检查Rules部分是否完整显示所有路径,且无错误提示。
4. 查看Ingress Controller日志定位请求问题
通过日志分析HTTP请求的处理流程,确认请求是否匹配到正确的后端服务:
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller
搜索example.com相关日志条目,关注请求的host、path以及upstream(后端服务)字段,判断是否存在路由匹配失败的情况。
5. 确认后端服务的可用性
检查所有后端ClusterIP服务是否正常运行且端口可访问:
# 测试posts-clusterip-srv kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://posts-clusterip-srv:4000/create-posts # 测试query-srv kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://query-srv:4002/posts # 测试comments-srv kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://comments-srv:4001/posts/test/comments # 测试client-srv kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://client-srv:3000
若某个服务请求失败,说明该服务本身存在问题,需排查对应Deployment的Pod状态和日志。
内容的提问来源于stack exchange,提问作者Usama
相关产品推荐
相关产品推荐

