如何从外部独立应用连接K8s集群内的MySQL Server Pod?
外部应用连接Kubernetes集群内MySQL Pod的方案
核心前提
Kubernetes集群内的Pod默认仅集群内部可达,外部独立应用要连接,必须通过Service暴露或临时端口转发的方式打通网络。以下是几种常用方案:
方案一:NodePort服务(通用场景)
这是你提到的方式,适合没有负载均衡服务的自建K8s集群。
创建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获取连接信息
查看Service详情获取NodePort:kubectl get svc mysql-nodeport输出
PORT(S)字段会显示3306:30007/TCP,其中30007就是NodePort。同时获取集群节点的公网/内网IP(外部应用和集群同内网用内网IP,否则用公网IP)。JDBC连接字符串
jdbc:mysql://<集群节点IP>:<NodePort>/<目标数据库名>?useSSL=false&serverTimezone=UTC替换
<集群节点IP>、<NodePort>、<目标数据库名>,按需调整SSL和时区参数。
方案二:LoadBalancer服务(云厂商K8s场景)
如果你的集群部署在云厂商(如AWS EKS、阿里云ACK等),可直接用LoadBalancer类型的Service,云厂商会自动分配公网IP。
创建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获取连接信息
查看Service的EXTERNAL-IP字段:kubectl get svc mysql-loadbalancerJDBC连接字符串
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用户,例如:
若要限制特定IP,可将CREATE USER 'your-user'@'%' IDENTIFIED BY 'your-password'; GRANT ALL PRIVILEGES ON <目标数据库名>.* TO 'your-user'@'%'; FLUSH PRIVILEGES;%替换为对应IP地址。 - 防火墙/安全组:使用NodePort或LoadBalancer时,需确保集群节点的对应端口(NodePort或3306)在防火墙/安全组中开放,允许外部应用的IP访问。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

