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),因为虚拟机的网络与主机隔离。
解决步骤
使用Minikube内置命令暴露服务
执行以下命令获取可在Mac主机直接访问的服务URL:minikube service devops-blog -n devops-blog --url复制返回的URL(格式类似
http://127.0.0.1:xxxx),直接在浏览器或curl中访问即可。验证节点端口监听状态
若需确认端口是否在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 无法访问的原因及解决
核心原因
- Minikube默认未启用Ingress控制器插件,导致Ingress规则无组件处理;
- Hosts映射错误,将域名指向了本地127.0.0.1而非Minikube节点IP。
解决步骤
启用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修正Hosts映射
修改/etc/hosts文件,将域名指向Minikube节点IP:192.168.49.2 devops-blog.cluster.local验证Ingress资源状态
检查Ingress是否正常关联Service:kubectl describe ingress devops-blog -n devops-blog查看Events字段,确认无"Service not found"等错误提示。
内容的提问来源于stack exchange,提问作者Nikolay Baranenko

