Flutter前端Pod调用K8s后端Pod时出现net::ERR_EMPTY_RESPONSE问题排查
问题:Kubernetes集群中Flutter前端Pod请求后端返回net::ERR_EMPTY_RESPONSE
背景信息
Flutter登录相关代码
Future<(bool, User?)> login(String username, String password) async { var (bool statusCode, String responsebody) = await loginAPI( username, password); //.timeout(const Duration(seconds: 3)); if (statusCode) { print('Login correcto: $responsebody'); var (bool st2, String rp2) = await getUser(username); if (st2) { print('Datos del usuario: $rp2'); User user = translateUser(rp2, password); print(user.toString()); return (true, user); } else { print('Error al obtener los datos del usuario: $rp2'); return (false, null); } } else { print('Error al hacer login: $responsebody'); return (false, null); } } Future<(bool, String)> loginAPI(String username, String password) async { print('Login:'); print('Login: $username, $password'); print('URL: $urlUserAPI'); String url = urlUserAPI; String path = 'user/User/checkUser'; Map<String, String> bodyData = { 'username': username, 'password': password, }; Map<String, String> headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' }; final response = await http.post(Uri.http(url, path), body: jsonEncode(bodyData), headers: headers); if (response.statusCode == 200) { print('Response: ' + response.body); return (true, response.body); } else { print('Response: ' + response.body); return (false, response.body); } }
Nginx配置(部署Flutter Web应用使用)
server { listen 8085; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html =404; } }
Kubernetes Deployment与Service定义
apiVersion: v1 kind: Service metadata: name: micro-front-main spec: type: NodePort selector: app: mfm ports: - nodePort: 30811 protocol: TCP port: 8085 targetPort: 8085 --- apiVersion: apps/v1 kind: Deployment metadata: name: deploy-mfm spec: replicas: 1 selector: matchLabels: app: mfm template: metadata: labels: app: mfm spec: imagePullSecrets: - name: ghcr-login-secret containers: - name: gestor-jobs-container image: front-test imagePullPolicy: Never ports: - containerPort: 8085
集群内部测试结果
通过kubectl查看集群内Pods和Service状态正常,且从前端Pod内部curl后端服务可正常获取响应:
messalhi@NTTD-CM5H633:~/repositorios/Integracion$ k get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bbdd-postgres-taskdb ClusterIP 10.100.240.175 <none> 5433/TCP 85m bbdd-postgres-usersdb ClusterIP 10.102.139.249 <none> 5432/TCP 85m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 134m micro-cloud-eventos NodePort 10.108.55.189 <none> 8083:30810/TCP 64m micro-cloud-tareas NodePort 10.107.231.41 <none> 8082:30809/TCP 70m micro-front-main NodePort 10.111.28.106 <none> 8085:30811/TCP 8m5s micro-gestion-usuarios NodePort 10.103.85.52 <none> 8081:30808/TCP 70m messalhi@NTTD-CM5H633:~/repositorios/Integracion$ k get pods NAME READY STATUS RESTARTS AGE deploy-bbdd-task-6d766fb7f-fqccf 1/1 Running 0 85m deploy-bbdd-user-7765f77f6d-w468t 1/1 Running 0 85m deploy-mce-58c7f788fd-lklt2 1/1 Running 0 64m deploy-mct-578d8c4475-knfrx 1/1 Running 0 70m deploy-mct-578d8c4475-wbh6n 1/1 Running 0 70m deploy-mct-578d8c4475-x74lj 1/1 Running 0 70m deploy-mfm-776f586d6d-bnmb2 1/1 Running 0 8m8s deploy-mgu-55c46f7b7c-5kvtn 1/1 Running 0 70m deploy-mgu-55c46f7b7c-bglzz 1/1 Running 0 70m deploy-mgu-55c46f7b7c-cjhg7 1/1 Running 0 70m messalhi@NTTD-CM5H633:~/repositorios/Integracion$ k exec -it deploy-mfm-776f586d6d-bnmb2 -- /bin/sh / # curl -X POST http://micro-gestion-usuarios:8081/user/User/checkUser \ > -H "Content-Type: application/json" \ > -d '{"username":"userTest", "password":"passTest"}' userTest OK
端口转发后的问题
使用kubectl port-forward暴露前端服务后,前端发起请求仍报错:
messalhi@NTTD-CM5H633:~/repositorios/Integracion$ kubectl port-forward svc/micro-front-main 27020:8085 Forwarding from 127.0.0.1:27020 -> 8085 Forwarding from [::1]:27020 -> 8085
浏览器控制台报错:
POST http://micro-gestion-usuarios:8081/user/User/checkUser net::ERR_EMPTY_RESPONSE
后端CORS配置
后端为Spring Boot应用,已配置全局CORS规则,排除跨域问题:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") .maxAge(168000) .allowedHeaders("*") .allowCredentials(true); } }
解决方案
问题源于Kubernetes环境配置:原环境为WSL+Minikube+Docker驱动,切换到Ubuntu 22.04+Minikube+Docker驱动后,将前端请求地址改为minikube ip:NodePort格式,前端即可正常连接后端服务。
内容的提问来源于stack exchange,提问作者Mohamed Essalhi
相关产品推荐
相关产品推荐

