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

Minikube环境下Ingress无法路由前端服务的排查求助

问题描述

我用Minikube搭建了Kubernetes集群,想通过Ingress访问前端服务。已经配置了Ingress并修改了/etc/hosts文件,但无法通过浏览器访问barakatouna.ma域名。Ingress控制器运行正常,所有Pod状态都正确,但应用就是访问不了。


配置文件

frontend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
  namespace: project-management
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: yazid0hakimi/companymanagement-frontend:latest
        ports:
        - containerPort: 80
        env:
        - name: REACT_APP_API_URL
          valueFrom:
            configMapKeyRef:
              name: frontend-config
              key: API_URL
        resources:
          limits:
            memory: "256Mi"
            cpu: "200m"
          requests:
            memory: "128Mi"
            cpu: "100m"

frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
  namespace: project-management
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

frontend-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend-ingress
  namespace: project-management
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: barakatouna.ma
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 80

frontend-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-config
  namespace: project-management
data:
  API_URL: "http://backend-service.project-management:8088"
  REACT_APP_ENV: "production"
  REACT_APP_VERSION: "1.0.0"

/etc/hosts 文件

127.0.0.1 localhost
::1 localhost
# Added by Docker Desktop
100.79.128.254 host.docker.internal
100.79.128.254 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
192.168.49.2 barakatouna.ma
# End of section

已执行操作

  • 使用kubectl apply -f应用所有YAML配置。
  • 在Minikube中启用Ingress插件:minikube addons enable ingress。
  • 启动Minikube隧道:minikube tunnel。
  • 将Minikube IP添加到/etc/hosts文件中。

集群状态检查

所有资源状态(project-management命名空间)

kubectl get all -n project-management
NAME                                      READY   STATUS    RESTARTS        AGE
pod/backend-deployment-6c6b5997b7-kvxln   1/1     Running   10 (4d1h ago)   6d
pod/debug                                 0/1     Error     0               5d23h
pod/frontend-deployment-86f6fdd77-mtvzw   1/1     Running   2               4d23h
pod/mysql-deployment-79d6c9555b-2k4lx     1/1     Running   6 (4d1h ago)    6d

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/backend-service       NodePort    10.105.228.71    <none>        8088:31733/TCP   6d
service/frontend-deployment   NodePort    10.101.226.161   <none>        8080:30949/TCP   4d23h
service/frontend-service      NodePort    10.111.235.165   <none>        80:30080/TCP     6d
service/mysql-service         ClusterIP   10.98.97.34      <none>        3306/TCP         6d

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/backend-deployment    1/1     1            1           6d
deployment.apps/frontend-deployment   1/1     1            1           5d
deployment.apps/mysql-deployment      1/1     1            1           6d

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/backend-deployment-6c6b5997b7    1         1         1       6d
replicaset.apps/frontend-deployment-7466c844dd   0         0         0       5d
replicaset.apps/frontend-deployment-86f6fdd77    1         1         1       4d23h
replicaset.apps/mysql-deployment-5d97cd759c      0         0         0       6d
replicaset.apps/mysql-deployment-79d6c9555b      1         1         1       6d

Ingress配置详情

kubectl get ingress -n project-management -o yaml
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"frontend-ingress","namespace":"project-management"},"spec":{"rules":[{"host":"barakatouna.ma","http":{"paths":[{"backend":{"service":{"name":"frontend-service","port":{"number":80}}},,"path":"/","pathType":"Prefix"}]}}]}}
      nginx.ingress.kubernetes.io/rewrite-target: /
    creationTimestamp: "2024-08-28T19:48:55Z"
    generation: 1
    name: frontend-ingress
    namespace: project-management
    resourceVersion: "20606"
    uid: 61159641-0439-4549-b0f9-3032ba32e682
  spec:
    ingressClassName: nginx
    rules:
    - host: barakatouna.ma
      http:
        paths:
        - backend:
            service:
              name: frontend-service
              port:
                number: 80
          path: /
          pathType: Prefix
  status:
    loadBalancer:
      ingress:
      - ip: 192.168.49.2
kind: List
metadata:
  resourceVersion: ""

Ingress控制器状态

kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-h5flq        0/1     Completed   0          5d
ingress-nginx-admission-patch-c2jsz         0/1     Completed   0          5d
ingress-nginx-controller-7bf9bf9df7-hd4zv   1/1     Running     0          70m

Minikube IP

minikube ip
192.168.49.2

访问测试结果

  • 浏览器访问http://barakatouna.ma页面无法加载
  • 执行nslookup barakatouna.ma返回:
Server:  192.168.0.1
Address:  192.168.0.1

192.168.0.1 can't find barakatouna.ma: Non-existent domain

疑问

  1. 哪些因素可能阻碍Ingress将流量路由到我的前端服务?
  2. 我的Ingress或Service配置是否存在错误?
  3. 如何排查域名barakatouna.ma解析失败的问题?
  4. 在Minikube环境中,我还缺少哪些额外的步骤或配置?

解答

1. 阻碍Ingress路由的可能因素

  • 域名解析失败:主机未正确读取/etc/hosts配置,导致请求未发送到Minikube IP
  • Ingress控制器规则未生效:控制器可能未重载最新的Ingress配置
  • 防火墙或网络策略:主机防火墙阻挡80端口流量,或Kubernetes网络策略限制Ingress到Service的访问
  • Service到Pod的连通性:虽然标签匹配,但Pod内部服务可能未正常监听端口
  • Minikube隧道未持续运行:minikube tunnel是前台进程,关闭终端会导致LoadBalancer IP失效

2. Ingress与Service配置检查

你的配置无明显错误:

  • Service标签选择器app: frontend与Pod标签完全匹配,端口映射(80->80)正确
  • Ingress规则指向正确的Service和端口,rewrite-target注解对于根路径访问合理(单页应用可额外添加nginx.ingress.kubernetes.io/use-regex: "true",但非必须)
  • 注意:Service类型为NodePort不是Ingress访问的必要条件,ClusterIP类型即可,此配置不影响访问

3. 域名解析失败排查步骤

  • 验证hosts配置生效:执行ping barakatouna.ma,若返回IP不是192.168.49.2,说明hosts未被读取:
    • 检查hosts文件语法:确保IP与域名之间用空格/制表符分隔,无多余空格
    • 刷新DNS缓存:
      • Linux:sudo systemctl restart systemd-resolved
      • macOS:sudo killall -HUP mDNSResponder
      • Windows:ipconfig /flushdns
  • 检查DNS优先级:执行getent hosts barakatouna.ma(Linux/macOS),确认是否返回正确IP,避免系统优先使用公共DNS
  • 确认修改权限:确保是以管理员/sudo身份编辑的/etc/hosts,普通用户修改的文件可能不生效

4. Minikube环境补充步骤

  • 保持minikube tunnel运行:使用nohup minikube tunnel &让隧道后台运行,避免终端关闭后失效
  • 验证Ingress服务端口:执行kubectl get svc -n ingress-nginx,确认ingress-nginx-controller的EXTERNAL-IP为192.168.49.2
  • 跳过Ingress直接测试:通过NodePort访问前端服务http://192.168.49.2:30080,确认Pod本身能正常响应
  • 查看Ingress控制器日志:执行kubectl logs -n ingress-nginx ingress-nginx-controller-7bf9bf9df7-hd4zv,排查请求转发错误
  • 检查Pod内部服务:进入前端Pod执行curl localhost,确认容器内Web服务正常:
    kubectl exec -n project-management frontend-deployment-86f6fdd77-mtvzw -- curl localhost
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:42:03