无法连接Minikube Kubernetes集群中部署的Flask应用
问题背景
我已用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
排查与解决步骤
检查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"]验证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,但仍需确认)检查Metallb组件状态
确认Metallb的controller和speaker Pod正常运行:kubectl get pods -n metallb-system若有Pod未启动,查看日志排查:
kubectl logs <Metallb Pod名称> -n metallb-system测试集群内部访问
在集群内临时创建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若能返回内容,说明集群内部转发正常,问题出在外部网络层面;若不能,回到前两步排查内部转发问题。
Minikube网络模式适配
若Minikube使用docker驱动,主机可能无法直接访问Metallb分配的IP段。可尝试:- 切换到
virtualbox驱动重新启动Minikube - 执行
minikube tunnel -n flask-app命令暴露LoadBalancer服务,之后再访问http://192.168.39.233:80
- 切换到
检查防火墙/安全组
临时关闭主机防火墙测试是否有拦截:# Ubuntu系统 sudo ufw disable # CentOS/RHEL系统 sudo systemctl stop firewalld
内容的提问来源于stack exchange,提问作者MichaelLong102

