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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:25:12