通过NodePort类型Ingress Nginx访问K8s应用报404错误求助
排查Ingress Nginx 404问题的步骤
1. 核对Ingress资源核心配置
- 确认Ingress的
spec.rules.host与curl请求的hello-world.info完全一致,注意拼写、大小写无偏差 - 检查
spec.rules.http.paths配置:path是否为预期路径(比如/)pathType建议设为Prefix或Exact,避免使用ImplementationSpecific引发匹配问题backend.service.name必须与你的Hello World Service名称完全匹配backend.service.port.number填写的是Service暴露的端口(而非Pod的8080,若Service用80映射Pod的8080,此处填80)
- 执行命令查看Ingress状态及事件:
重点看Events字段,是否存在找不到Service、端口不匹配等报错kubectl describe ingress <你的Ingress名称>
2. 确认Ingress Controller与Ingress的关联
- 检查Ingress资源是否指定了正确的Ingress Class:
- 旧版本Controller用注解:
kubernetes.io/ingress.class: "nginx" - K8S 1.19+用
spec.ingressClassName: "nginx"
- 旧版本Controller用注解:
- 验证Ingress Controller Pod状态:
确保Pod处于Running状态kubectl get pods -n ingress-nginx - 查看Controller详细日志,过滤请求路由信息:
确认是否接收到kubectl logs -n ingress-nginx <Controller Pod名称> -f -v=3hello-world.info的Host头,以及是否匹配到对应的Ingress规则
3. 验证Service与Pod的关联有效性
- 核对Service的
spec.selector与Pod的metadata.labels完全一致,这是Service发现Pod的核心依据 - 查看Service的Endpoints状态:
Endpoints字段需显示kubectl describe service <你的Service名称>PodIP:8080,若为<none>说明标签匹配失败 - 在Ingress Controller Pod内直接访问Service,排查网络连通性:
若能正常返回Hello World,说明Controller到Service的网络无问题kubectl exec -n ingress-nginx <Controller Pod名称> -- curl http://<Service集群IP>:<Service端口>/
4. 检查节点网络与端口规则
- 确认节点防火墙(iptables/firewalld)允许30255端口的入站流量,裸金属服务器默认防火墙可能拦截该端口
- 若在集群外部机器执行curl,需将
localhost替换为节点的公网/内网IP,而非本地回环地址 - 检查kube-proxy生成的NodePort转发规则:
确认存在对应的转发规则iptables-save | grep 30255
5. 测试最简Ingress配置
若以上排查无结果,使用最简配置验证:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress annotations: kubernetes.io/ingress.class: "nginx" # K8S 1.19+可替换为spec.ingressClassName: "nginx" spec: rules: - host: hello-world.info http: paths: - path: / pathType: Prefix backend: service: name: hello-world-service # 替换为你的Service名称 port: number: 80 # 替换为你的Service端口
应用配置后重新执行curl测试
内容的提问来源于stack exchange,提问作者filipstrapinadotcz
相关产品推荐
相关产品推荐

