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

Ubuntu环境下MicroK8s中Ingress未分配ADDRESS且路由返回404-nginx的问题排查请求

问题分析与解决方案

看起来你在MicroK8s环境里配置Ingress时碰到了两个核心问题:Ingress资源没分配ADDRESS,访问域名时返回Nginx 404错误。结合你提供的操作步骤和环境信息,咱们一步步排查解决:

1. 先检查Ingress Controller是否正常跑起来了

MicroK8s启用ingress扩展后,会在kube-system命名空间下部署Nginx Ingress Controller的Pod。先确认它的状态:

kubectl get pods -n kube-system

你要找名称类似nginx-ingress-microk8s-controller-xxx的Pod,得确保它的状态是Running。如果Pod是CrashLoopBackOff或者Pending,就去看日志找问题:

kubectl logs <pod-name> -n kube-system

常见的坑比如资源不够、镜像拉不下来,或者配置冲突,日志里一般会有明确提示。

2. 确认IngressClass和控制器的关联没问题

你的Ingress配置里指定了ingressClassName: nginx,得先确认集群里确实有这个IngressClass,而且它和Ingress Controller是绑定的:

kubectl get ingressclass

正常输出里应该有一条名称为nginx的记录,它的spec.controller字段应该是microk8s.io/ingress-nginx(这是MicroK8s专属的控制器标识)。如果找不到这个IngressClass,大概率是ingress扩展没启用好,重新开关一次试试:

microk8s disable ingress
microk8s enable ingress

3. 检查后端服务有没有实际的Pod在运行

Ingress要把流量转发到Service,但Service必须关联到正常运行的Pod(也就是有可用的Endpoint)。咱们检查下三个服务的Endpoint状态:

kubectl get endpoints cheddar stilton wensleydale

如果某个服务的ENDPOINTS列是空的,说明对应的Deployment Pod没起来。再去看Pod的状态:

kubectl get pods

我注意到你创建wensleydale Deployment时用的镜像名是errm/cheese:Wensleydale,这里大小写可能有问题——镜像实际是小写的errm/cheese:wensleydale,如果是这个问题,修正镜像名就行:

kubectl set image deployment/wensleydale wensleydale=errm/cheese:wensleydale

4. 确认Ingress Controller的访问端口映射

在MicroK8s里,Ingress Controller默认是用NodePort方式暴露服务的。咱们看看它的端口映射情况:

kubectl get svc -n kube-system

找到nginx-ingress-microk8s-service,它会把80和443端口映射到节点的随机NodePort(比如30080、30443)。这时候你访问域名得加上这个NodePort,比如http://cheddar.127.0.0.1.nip.io:30080。

如果想让Ingress直接用80/443端口访问,可以启用MetalLB负载均衡器:

microk8s enable metallb:192.168.1.100-192.168.1.200

启用后,Ingress Controller服务会拿到一个集群内的外部IP,Ingress的ADDRESS字段也会自动填充,之后访问域名就不用加端口了。

5. 测试本地域名解析和连通性

你用的是127.0.0.1.nip.io这种域名,先确认本地能正常解析到127.0.0.1:

ping cheddar.127.0.0.1.nip.io

如果解析正常但还是404,试试用curl直接指定Host头访问Ingress Controller的端口,验证后端服务是否正常:

curl http://127.0.0.1:<node-port> -H "Host: cheddar.127.0.0.1.nip.io"

如果能返回正常内容,说明Ingress配置没问题,只是访问方式的问题;如果还是404,就去看Ingress Controller的日志,排查路由匹配的错误。

小提示:可以合并Ingress资源(可选)

你现在创建了三个独立的Ingress资源,其实可以合并成一个,管理起来更方便:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cheese-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: cheddar.127.0.0.1.nip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cheddar
            port:
              number: 80
  - host: stilton.127.0.0.1.nip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: stilton
            port:
              number: 80
  - host: wensleydale.127.0.0.1.nip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wensleydale
            port:
              number: 80

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:02:37