裸金属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
相关产品推荐
相关产品推荐

