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

