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

裸金属K8s集群基于NodeIP配置Ingress访问返回404问题求助

问题根因定位及解决方案

1. Ingress资源未关联对应IngressClass

你当前使用的ingress-nginx v1.0.0+版本遵循K8s ingress v1规范,要求Ingress资源明确指定关联的ingressClassName,你当前的Ingress资源CLASS字段为<none>,说明控制器未识别到该规则,自然不会处理对应的请求。
解决方式二选一:

  • 方式1:在Ingress资源的spec中明确指定ingressClassName
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-hello
  namespace: dev
spec:
  ingressClassName: nginx # 新增这一行,ingress-nginx默认的class名是nginx
  rules:
  - host: cluster.local
    http:
      paths:
      - backend:
          service:
            name: hello-service
            port:
              number: 80
        path: "/hello"
        pathType: Prefix
  • 方式2:将nginx的IngressClass设为集群默认,所有未指定class的Ingress都会自动关联
    执行命令:
    kubectl patch ingressclass nginx -p '{"metadata": {"annotations":{"ingressclass.kubernetes.io/is-default-class":"true"}}}'

2. 路径转发规则不匹配后端服务路由

就算Ingress规则被控制器识别,你当前配置的path: "/hello"会把完整的/hello路径直接转发给后端hello-app,而hello-app默认只监听根路径/,不存在/hello路由,所以会返回404。需要添加路径重写注解,把匹配到的路径前缀去掉再转发给后端:
修改后的完整Ingress配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-hello
  namespace: dev
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2 # 新增重写规则
spec:
  ingressClassName: nginx
  rules:
  - host: cluster.local
    http:
      paths:
      - backend:
          service:
            name: hello-service
            port:
              number: 80
        path: "/hello(/|$)(.*)" # 修改路径匹配规则
        pathType: Prefix

3. 验证操作

修改配置后执行kubectl apply -f更新Ingress资源,等待10秒左右执行测试:
curl -I http://cluster.local:30377/hello
正常会返回200状态码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:15:03