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

Minikube中Service与Ingress无法访问Flask服务的问题求助

问题

在MacOS上安装了v1.29.0版本的Minikube,基于Flask构建API接口并打包为Docker镜像,将镜像加载到Minikube后,创建了包含Deployment、NodePort Service和Ingress的配置文件,执行命名空间创建、切换及资源部署操作。通过端口转发验证Flask服务可正常访问,但尝试通过Minikube节点IP+NodePort访问服务失败,添加hosts映射后通过Ingress访问也失败。请问为何通过Service和Ingress无法访问部署的服务?该如何解决此问题?


配置与操作详情

Dockerfile

FROM debian:latest

COPY . /app
WORKDIR /app
RUN pip3 install --no-cache-dir -r requirements.txt

CMD ["uwsgi", "--socket", "0.0.0.0:5001", "--protocol=http", "-w", "wsgi:app", "--ini", "wsgi.ini"]

镜像加载命令

minikube image load drnoreg/devops_blog:0.0.1

app.yaml 配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: devops-blog
spec:
  selector:
    matchLabels:
      run: devops-blog
  replicas: 1
  template:
    metadata:
      labels:
        run: devops-blog
    spec:
      containers:
        - name: devops-blog
          image: docker.io/drnoreg/devops_blog:0.0.1
          ports:
            - name: pod-port
              containerPort: 5001
---
apiVersion: v1
kind: Service
metadata:
  name: devops-blog
  labels:
    run: devops-blog
spec:
  type: NodePort
  ports:
    - name: pod-port
      port: 5001
      targetPort: 5001
      protocol: TCP
      nodePort: 30001
  selector:
    run: devops-blog
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: devops-blog
  namespace: devops-blog
spec:
  rules:
    - host: devops-blog.cluster.local
      http:
        paths:
          - pathType: ImplementationSpecific
            backend:
              service:
                name: devops-blog
                port:
                  number: 5001

命名空间操作

kubectl create namespace devops-blog
kubectl config set-context --current --namespace=devops-blog
kubectl create -f app.yaml

端口转发验证

kubectl port-forward devops-blog-f666d8cd7-njp95  5001:5001
Forwarding from 127.0.0.1:5001 -> 5001
Forwarding from [::1]:5001 -> 5001
Handling connection for 5001
Handling connection for 5001

资源状态信息

% kubectl get service -n devops-blog -o wide
NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE   SELECTOR
devops-blog   NodePort   10.99.37.126   <none>        5001:30001/TCP   45s   run=devops-blog
% kubectl get pod -n devops-blog -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
devops-blog-f666d8cd7-b9n7j   1/1     Running   0          57s   10.244.0.34   minikube   <none>           <none>
% kubectl get node -n devops-blog -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
minikube   Ready    control-plane   16h   v1.26.1   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   5.10.47-linuxkit   docker://20.10.23

Service访问测试

% telnet 192.168.49.2 30001
Trying 192.168.49.2...

Ingress访问测试

Hosts 配置

127.0.0.1 devops-blog.cluster.local

测试命令

% telnet devops-blog.cluster.local 80   
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

问题分析与解决方案

NodePort 无法访问的原因及解决

核心原因

MacOS下Minikube使用Docker驱动时,运行在独立的轻量虚拟机中,Mac主机无法直接访问虚拟机内部的NodePort端口(192.168.49.2:30001),因为虚拟机的网络与主机隔离。

解决步骤

  1. 使用Minikube内置命令暴露服务
    执行以下命令获取可在Mac主机直接访问的服务URL:

    minikube service devops-blog -n devops-blog --url
    

    复制返回的URL(格式类似http://127.0.0.1:xxxx),直接在浏览器或curl中访问即可。

  2. 验证节点端口监听状态
    若需确认端口是否在Minikube节点正常监听,可进入虚拟机检查:

    minikube ssh
    netstat -tulpn | grep 30001
    

    如果无监听结果,检查Service与Pod的标签匹配(你的配置中selector: run=devops-blog与Pod的labels: run=devops-blog一致,这部分无问题),或重启Service:

    kubectl rollout restart service devops-blog -n devops-blog
    

Ingress 无法访问的原因及解决

核心原因

  1. Minikube默认未启用Ingress控制器插件,导致Ingress规则无组件处理;
  2. Hosts映射错误,将域名指向了本地127.0.0.1而非Minikube节点IP。

解决步骤

  1. 启用Minikube Ingress插件
    执行命令启用Ingress控制器:

    minikube addons enable ingress
    

    等待控制器Pod启动完成:

    kubectl wait --namespace ingress-nginx \
      --for=condition=ready pod \
      --selector=app.kubernetes.io/component=controller \
      --timeout=120s
    
  2. 修正Hosts映射
    修改/etc/hosts文件,将域名指向Minikube节点IP:

    192.168.49.2 devops-blog.cluster.local
    
  3. 验证Ingress资源状态
    检查Ingress是否正常关联Service:

    kubectl describe ingress devops-blog -n devops-blog
    

    查看Events字段,确认无"Service not found"等错误提示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:10:33