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

K8S中Node.js应用可解析MySQL Cluster IP但无法通过Service连接Pod的问题求助

问题分析与解决方案

你遇到的这个问题核心原因非常明确:你的MySQL Service的标签选择器(selector)和MySQL Deployment的Pod标签不匹配,导致Service无法将流量转发到MySQL Pod上。虽然DNS能正常解析到Service的ClusterIP,但这个IP背后没有可用的后端Pod,自然会触发连接拒绝的错误。

具体问题点

对比你的配置就能发现明显的不匹配:

  • MySQL Deployment里定义的Pod标签是:
    labels:
      app: mysql
    
  • 但MySQL Service的选择器却是:
    selector:
      io.kompose.service: mysql
    

Kubernetes的Service是通过selector匹配Pod标签来绑定后端实例的,现在你的mysql Service根本找不到对应的MySQL Pod,相当于这个Service是“空的”——虽然有ClusterIP,但没有流量转发的目标。

修复步骤

只需要修改MySQL Service的selector,让它和Deployment的Pod标签一致即可:

修改后的MySQL Service YAML:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: C:\Users\xxx\Desktop\xxx\kompose.exe convert
    kompose.version: 1.24.0 (7c629530)
  creationTimestamp: null
  labels:
    io.kompose.service: mysql
  name: mysql
spec:
  ports:
    - name: "3306"
      port: 3306
      targetPort: 3306
  selector:
    app: mysql  # 这里改成和Deployment一致的标签
status:
  loadBalancer: {}

验证修复

  1. 应用修改后的Service配置:
    kubectl apply -f <你的mysql-service.yaml路径>
    
  2. 检查Service是否成功绑定到Pod:
    kubectl describe service mysql
    
    在输出的Endpoints字段里,你应该能看到MySQL Pod的IP和端口(比如172.x.x.x:3306),这就说明Service已经正确关联到Pod了。
  3. 重启你的Node.js应用Pod(或者重新部署),测试连接:
    kubectl rollout restart deployment app
    
    这时候你的Node.js应用用host: "mysql"就能正常连接到数据库,而且不用再依赖易变的Pod IP。

额外小提示

  • 为了避免以后再出现这类标签不匹配的问题,建议在定义Deployment和对应的Service时,统一使用一套标签规则,比如都用app: <服务名>这样的格式,保持一致性。
  • 你也可以用kubectl get endpoints mysql快速查看Service的后端端点状态,如果显示<none>就说明没有绑定到Pod,这时候就要优先检查selector和Pod标签是否匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:19:08