Helm安装Ingress-Nginx后访问LoadBalancer外部IP返回404 Not Found问题排查求助
Ingress-Nginx访问LoadBalancer IP返回404 Not Found的原因及解决办法
问题背景
你已经通过以下Helm命令成功部署了Ingress-Nginx控制器:
helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --version 4.2.0 \ --set controller.ingressClass=nginx \ --set rbac.create=true \ --values /tmp/ingress-nginx.yaml
所有资源状态正常:
[rke@k8gui apps]$ kubectl get all -n ingress-nginx NAME READY STATUS RESTARTS AGE pod/ingress-nginx-controller-248rc 1/1 Running 0 3m15s pod/ingress-nginx-controller-hpv8h 1/1 Running 0 3m15s pod/ingress-nginx-controller-jwzjn 1/1 Running 0 3m15s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.43.117.177 192.168.33.100 80:31678/TCP,443:32340/TCP 3m4s service/ingress-nginx-controller-admission ClusterIP 10.43.119.134 <none> 443/TCP 3m4s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/ingress-nginx-controller 3 3 3 3 3 kubernetes.io/os=linux 3m4s
但访问http://192.168.33.100时返回404:
404 Not Found 404 Not Foundnginx
核心原因
Ingress-Nginx本质上是反向代理控制器,它本身不提供任何默认的后端服务。它必须依赖Kubernetes的Ingress资源来定义路由规则:告诉它“收到某个路径的请求时,转发到哪个后端Service”。当你直接访问LoadBalancer IP时,没有任何匹配的Ingress规则,所以Nginx会返回404。
解决步骤
1. 检查现有Ingress资源
首先确认集群中是否已经配置了Ingress资源:
kubectl get ingress --all-namespaces
如果输出为空,说明你还没有配置任何路由规则,需要继续下一步。
2. 部署测试用后端服务
先创建一个简单的Nginx服务作为测试后端:
# 部署Deployment kubectl create deployment test-nginx --image=nginx # 暴露为Service kubectl expose deployment test-nginx --port=80 --target-port=80
3. 创建匹配的Ingress资源
创建一个test-ingress.yaml文件,内容如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx # 必须和你安装时设置的controller.ingressClass一致 rules: - http: paths: - path: / pathType: Prefix backend: service: name: test-nginx port: number: 80
应用这个Ingress资源:
kubectl apply -f test-ingress.yaml
4. 验证访问
等待1-2分钟让Ingress规则生效,再次访问http://192.168.33.100,就能看到Nginx的默认欢迎页面了。
额外检查点(如果已经配置Ingress但仍报错)
- 确认Ingress资源的
ingressClassName字段值为nginx(和你Helm安装时的--set controller.ingressClass=nginx一致),Ingress-Nginx只会处理匹配这个类名的Ingress资源。 - 检查后端Service是否正常运行:
kubectl get service test-nginx,确保它的状态正常。 - 查看Ingress-Nginx控制器的日志,排查路由匹配问题:
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
内容的提问来源于stack exchange,提问作者er24rf4f
相关产品推荐
相关产品推荐

