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

无法连接Minikube Kubernetes集群中部署的Flask应用

Flask应用Kubernetes部署访问故障排查

问题背景

我已用Docker打包Flask应用镜像,创建了如下Deployment配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: flask-web-app
  template:
    metadata:
      labels:
        app: flask-web-app
    spec:
      containers:
      - name: flask-web-app
        image: flask-web-image
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000

先后尝试NodePort、LoadBalancer类型的Service对外暴露服务,均无法访问。LoadBalancer的配置文件如下:

apiVersion: v1
kind: Service
metadata:
  name: flask-web-app-service
spec:
  selector:
    app: flask-web-app
  ports:
    - name: http
      port: 80
      targetPort: 5000
  type: LoadBalancer

当前状态

  • 用kubectl port-forward deployment/flask-web-app 5000:5000可正常通过http://localhost:5000访问应用
  • Metallb已配置完成,地址池为192.168.39.233-192.168.39.240,配置详情:
Name:         config
Namespace:    metallb-system
Labels:       <none>
Annotations:  <none>

Data
====
config:
----
address-pools:
- name: default
  protocol: layer2
  addresses:
  - 192.168.39.233-192.168.39.240


BinaryData
====

Events:  <none>
  • kubectl get service -n flask-app显示LoadBalancer外部IP为192.168.39.233,访问http://192.168.39.233:80失败
  • minikube service flask-web-app-service -n flask-app --url返回http://192.168.39.228:32608,访问同样失败
  • minikube ip输出为192.168.39.228

排查与解决步骤

  1. 检查Pod运行状态与应用日志
    先确认Pod是否正常启动:

    kubectl get pods -n flask-app
    

    若Pod状态异常(如CrashLoopBackOff),查看日志定位问题:

    kubectl logs <具体Pod名称> -n flask-app
    

    重点检查:Flask应用默认绑定127.0.0.1,必须改为0.0.0.0才能被容器外部访问。启动命令需调整为:

    flask run --host=0.0.0.0
    

    或在Dockerfile中设置:

    CMD ["flask", "run", "--host=0.0.0.0"]
    
  2. 验证Service与Pod的关联
    检查Service的selector是否匹配Pod的labels:

    kubectl describe service flask-web-app-service -n flask-app
    

    查看Endpoints字段,若为空则说明selector不匹配,核对Deployment中Pod的labels和Service的selector是否一致(当前配置均为app: flask-web-app,但仍需确认)

  3. 检查Metallb组件状态
    确认Metallb的controller和speaker Pod正常运行:

    kubectl get pods -n metallb-system
    

    若有Pod未启动,查看日志排查:

    kubectl logs <Metallb Pod名称> -n metallb-system
    
  4. 测试集群内部访问
    在集群内临时创建busybox Pod,测试访问Service的ClusterIP:

    kubectl run -it --rm busybox --image=busybox:1.28 -- wget -qO- http://flask-web-app-service.flask-app.svc.cluster.local:80
    

    若能返回内容,说明集群内部转发正常,问题出在外部网络层面;若不能,回到前两步排查内部转发问题。

  5. Minikube网络模式适配
    若Minikube使用docker驱动,主机可能无法直接访问Metallb分配的IP段。可尝试:

    • 切换到virtualbox驱动重新启动Minikube
    • 执行minikube tunnel -n flask-app命令暴露LoadBalancer服务,之后再访问http://192.168.39.233:80
  6. 检查防火墙/安全组
    临时关闭主机防火墙测试是否有拦截:

    # Ubuntu系统
    sudo ufw disable
    # CentOS/RHEL系统
    sudo systemctl stop firewalld
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:32:41