NestJS混合微服务部署AWS EKS时TCP主机名配置及连接异常排查
NestJS混合模式TCP微服务连接失败(ECONNREFUSED 0.0.0.0:8080)排查方案
核心问题拆解
应用部署正常、HTTP REST API可用,但TCP的@messagePattern无法工作,报错connect ECONNREFUSED 0.0.0.0:8080,问题集中在TCP服务的可访问性配置和调用地址上,以下是针对性排查和解决步骤:
1. 主机名配置错误
当前TCP_HOST设为0.0.0.0是正确的监听配置(表示监听容器内所有网卡),但调用方不能用0.0.0.0作为目标地址:
- 在K8s集群内部调用:必须使用微服务对应的K8s服务名称(如
evaluation-service.default.svc.cluster.local,同namespace可简化为evaluation-service)或服务的ClusterIP; - 同Pod内调用:改用
localhost作为目标地址; - 外部调用:需通过NodePort/LoadBalancer暴露,或配置Nginx Ingress的TCP转发(默认Ingress仅处理HTTP流量)。
2. Docker与K8s端口配置缺失
必须确保TCP端口被正确暴露和映射:
- Dockerfile:添加
EXPOSE 8080声明容器要暴露的TCP端口; - K8s Deployment:在
containers.ports字段明确配置TCP端口映射:
这一步是K8s服务发现能识别TCP端口的前提。ports: - containerPort: 8080 name: tcp-evaluation protocol: TCP
3. 网络与安全组配置
- 集群内部通信:AWS EKS的节点安全组需允许Pod之间的TCP 8080端口通信;
- 外部TCP访问:若需从集群外调用,需:
- 开放NodePort/LoadBalancer对应端口的安全组规则;
- 配置Nginx Ingress Controller的TCP转发:
- 在Ingress Controller的ConfigMap中添加端口映射:
data: "8080": "default/evaluation-service:8080" - 在Ingress Controller的Deployment中添加对应端口的
hostPort或nodePort配置。
- 在Ingress Controller的ConfigMap中添加端口映射:
4. 端口冲突检查
当前TCP_CORE_PORT和TCP_EVALUATION_PORT均为8080:
- 若两个微服务部署在同一个Pod,会导致端口占用冲突,必须修改其中一个微服务的端口;
- 若部署在不同Pod,需确认各自的Deployment端口配置无重叠。
快速修复步骤
- 调整调用方的目标地址,替换
0.0.0.0为K8s服务名称或ClusterIP; - 补全Dockerfile的
EXPOSE声明和K8s Deployment的端口配置; - 检查集群内部安全组规则,确保Pod间TCP 8080端口通信被允许;
- 若为外部调用,配置Nginx Ingress的TCP转发规则。
内容的提问来源于stack exchange,提问作者Ishika Jain
相关产品推荐
相关产品推荐

