通过Ingress暴露服务时返回404 Not Found错误如何解决?
问题原因及排查方案
- 第一类通用配置问题(占90%以上概率)
你当前的Ingress配置为/前缀匹配,默认Nginx Ingress等主流Ingress Controller不会自动截断转发路径,也就是说你访问www.example.com/example-api时,转发到后端服务的请求路径依然是/example-api,如果你的后端Web服务没有对应/example-api的路由,就会直接返回404。
验证方式:直接在集群内部访问后端Pod的3000端口+/example-api路径,如果返回404,就属于这个问题。
解决方案:如果后端服务的接口都是根路径路由,需要给Ingress添加路径重写注解,以Nginx Ingress为例,修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: # 开启路径重写,将匹配到的路径后半部分转发到后端 nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: tls: - hosts: - www.example.com secretName: example-tls rules: - host: www.example.com http: paths: - path: /(/|$)(.*) pathType: Prefix backend: service: name: example-service port: number: 3000
如果只需要匹配/example-api前缀的请求,可以把path改为/example-api(/|$)(.*)即可。
- 第二类hostNetwork场景特有问题
如果上述配置修改后还是404,按以下步骤排查:
- 确认你的后端Pod(配置了
hostNetwork: true)的服务是监听0.0.0.0:3000而非127.0.0.1:3000,后者只能接收节点本地的请求,无法接收集群内部转发的流量 - 确认Pod所在节点的3000端口没有被其他进程占用,hostNetwork模式下端口是直接占用节点主机端口,冲突会导致服务无法正常监听
- 检查Ingress Controller如果也使用了hostNetwork模式,确认你访问的
www.example.com已经正确解析到Ingress Controller所在节点的IP,没有解析错误 - 先跳过Ingress,直接在集群内部访问
example-service:3000/example-api验证Service转发是否正常,如果这一步就返回404,说明问题出在Service或后端Pod,和Ingress无关
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

