You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地Nginx Ingress Controller配置Ingress资源后返回404问题求助

Nginx Ingress Controller 规则未生效导致NodePort访问404问题排查与解决

我来帮你拆解这个问题——你已经确认Pod和Service本身没问题,但Ingress规则就是没同步到Nginx的配置里,导致请求落到默认的404路由。下面是几个大概率的原因和对应的解决办法,按排查优先级排序:

1. 访问时没带正确的Host头(最常见!)

Nginx Ingress Controller是按Host字段匹配server块的,如果你的Ingress资源里指定了host(比如your-app.com),但访问时没在请求里带这个Host头,请求就会落到默认的404 server上。

  • 先检查你的Ingress配置里的spec.rules[].host字段:
    kubectl get ingress example-ingress -o yaml
    
  • 如果有指定host,访问时必须带上这个Host头才能匹配到对应的server块:
    curl -H "Host: your-app.com" http://xx.xx.xx.193:30207/apple
    
  • 如果不需要域名,也可以把Ingress的host留空,或者用*作为host,确保请求能匹配到对应的server配置。

2. Ingress路径配置或注解不符合Controller要求

官方Nginx Ingress Controller对路径匹配和重写有特定要求,比如:

  • 如果你用了路径重写,必须添加nginx.ingress.kubernetes.io/rewrite-target注解,否则路径匹配会出错。
  • Kubernetes 1.22+版本要求必须指定pathType(比如Prefix或Exact),否则Ingress资源可能不生效。

举个符合要求的Ingress配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1  # 将匹配到的路径重写到服务的根路径
spec:
  rules:
  - host: your-app.com
    http:
      paths:
      - path: /apple(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: apple-service
            port:
              number: 5678
      - path: /banana(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: banana-service
            port:
              number: 5678

3. Ingress Controller权限不足,无法读取Ingress资源

Controller需要足够的RBAC权限来监听Ingress、Service、Endpoint等资源的变化,如果权限不够,就没法同步配置到Nginx。

  • 检查Controller的ServiceAccount对应的ClusterRole权限:
    kubectl describe clusterrole nginx-ingress-clusterrole  # 替换成你的Controller的ClusterRole名称
    
  • 确保ClusterRole包含ingresses的get、list、watch权限,以及services、endpoints的对应权限。如果缺失,重新应用官方的RBAC配置即可。

4. 版本不兼容导致Ingress资源不被识别

如果你的Kubernetes集群版本是1.22+,但用了较老的Nginx Ingress Controller版本,可能不支持networking.k8s.io/v1版本的Ingress资源,导致Controller无法识别你的Ingress规则。

  • 查看Controller的日志,看看有没有类似资源无法识别的错误:
    kubectl logs -n <你的Ingress命名空间> <nginx-ingress-pod名称>
    
  • 如果是版本问题,优先升级Controller到适配Kubernetes版本的最新版;如果暂时无法升级,可以把Ingress资源改成Controller支持的旧版本API(比如extensions/v1beta1,但该版本已废弃,不推荐长期使用)。

5. 命名空间不匹配或Controller只监听特定命名空间

  • 确保你的Ingress资源和Ingress Controller在同一个命名空间,或者Controller配置了监听所有命名空间。
  • 检查Controller的启动参数,看看有没有--watch-namespace参数:
    kubectl describe deployment -n <你的Ingress命名空间> nginx-ingress | grep watch-namespace
    
  • 如果有这个参数,说明Controller只监听指定命名空间,你的Ingress必须放在这个命名空间里;如果没有,Controller默认监听所有命名空间,再检查Ingress是否正确创建:
    kubectl get ingress --all-namespaces
    

6. 配置同步进程异常

有时候Controller的配置同步进程卡住了,导致新的Ingress规则没被同步。

  • 查看Controller的同步日志,找有没有配置同步失败的信息:
    kubectl logs -n <你的Ingress命名空间> <nginx-ingress-pod名称> -c controller  # 容器名可能是nginx-ingress-controller,根据实际情况调整
    
  • 如果日志里有同步失败的提示(比如找不到Service、DNS解析错误),根据错误信息修复;如果没有明显错误,尝试删除并重建Controller Pod,强制重启同步进程:
    kubectl delete pod -n <你的Ingress命名空间> <nginx-ingress-pod名称>
    

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:56:05