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

如何从外部独立应用连接K8s集群内的MySQL Server Pod?

外部应用连接Kubernetes集群内MySQL Pod的方案

核心前提

Kubernetes集群内的Pod默认仅集群内部可达,外部独立应用要连接,必须通过Service暴露或临时端口转发的方式打通网络。以下是几种常用方案:


方案一:NodePort服务(通用场景)

这是你提到的方式,适合没有负载均衡服务的自建K8s集群。

  1. 创建NodePort类型的Service
    编写Service配置文件mysql-nodeport.yaml,注意selector要和你的MySQL Pod标签匹配:

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-nodeport
    spec:
      type: NodePort
      selector:
        app: mysql  # 替换为你的MySQL Pod实际label
      ports:
        - port: 3306          # 集群内部Service访问端口
          targetPort: 3306    # MySQL Pod的实际监听端口
          nodePort: 30007     # 可选,指定节点端口(范围30000-32767),不指定会自动分配
    

    执行命令创建Service:

    kubectl apply -f mysql-nodeport.yaml
    
  2. 获取连接信息
    查看Service详情获取NodePort:

    kubectl get svc mysql-nodeport
    

    输出PORT(S)字段会显示3306:30007/TCP,其中30007就是NodePort。同时获取集群节点的公网/内网IP(外部应用和集群同内网用内网IP,否则用公网IP)。

  3. JDBC连接字符串

    jdbc:mysql://<集群节点IP>:<NodePort>/<目标数据库名>?useSSL=false&serverTimezone=UTC
    

    替换<集群节点IP>、<NodePort>、<目标数据库名>,按需调整SSL和时区参数。


方案二:LoadBalancer服务(云厂商K8s场景)

如果你的集群部署在云厂商(如AWS EKS、阿里云ACK等),可直接用LoadBalancer类型的Service,云厂商会自动分配公网IP。

  1. 创建LoadBalancer类型的Service
    编写配置文件mysql-loadbalancer.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-loadbalancer
    spec:
      type: LoadBalancer
      selector:
        app: mysql
      ports:
        - port: 3306
          targetPort: 3306
    

    执行命令创建:

    kubectl apply -f mysql-loadbalancer.yaml
    
  2. 获取连接信息
    查看Service的EXTERNAL-IP字段:

    kubectl get svc mysql-loadbalancer
    
  3. JDBC连接字符串

    jdbc:mysql://<LoadBalancer外部IP>:3306/<目标数据库名>?useSSL=false&serverTimezone=UTC
    

方案三:kubectl端口转发(开发测试临时用)

无需创建Service,适合本地开发调试时临时访问,不适合生产环境。

执行端口转发命令,将本地3306端口映射到集群内的MySQL Pod:

# 通过Pod直接转发
kubectl port-forward pod/<mysql-pod-name> 3306:3306

# 或通过已有的ClusterIP Service转发(如果已有Service)
kubectl port-forward svc/<mysql-service-name> 3306:3306

命令执行后保持窗口打开,关闭则转发停止。此时JDBC连接字符串用本地地址:

jdbc:mysql://localhost:3306/<目标数据库名>?useSSL=false&serverTimezone=UTC

关键注意事项

  • MySQL允许外部连接:修改MySQL配置(如my.cnf),将bind-address设为0.0.0.0,或在启动命令中添加--bind-address=0.0.0.0,否则仅允许集群内部访问。
  • 用户权限配置:创建允许外部访问的MySQL用户,例如:
    CREATE USER 'your-user'@'%' IDENTIFIED BY 'your-password';
    GRANT ALL PRIVILEGES ON <目标数据库名>.* TO 'your-user'@'%';
    FLUSH PRIVILEGES;
    
    若要限制特定IP,可将%替换为对应IP地址。
  • 防火墙/安全组:使用NodePort或LoadBalancer时,需确保集群节点的对应端口(NodePort或3306)在防火墙/安全组中开放,允许外部应用的IP访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:57:16