Kubernetes - NodeJs MySQL pod无法与MySQL pod建立连接
Kubernetes - NodeJs MySQL pod无法与MySQL pod建立连接
我有一个正在运行的MySQL Pod。我为这个Pod打开了一个终端,并创建了一个数据库和一个用户。
create database demodb; create user demo identified by 'Passw0rd'; grant all on demodb.* to 'demo';
我有一个Deployment
来启动一个用于MySQL Pod的NodeJs客户端。这是在我本地的minikube
安装上。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demos
spec:
selector:
matchLabels:
app: demos
template:
metadata:
labels:
app: demos
spec:
containers:
- name: demo-db
image: 172.30.1.1:5000/demo/db-demos:0.1.0
resources:
limits:
memory: "128Mi"
cpu: "200m"
ports:
- containerPort: 4000
name: probe-port
---
apiVersion: v1
kind: Service
metadata:
name: demos
spec:
selector:
app: demos
ports:
- name: probe-port
port: 4001
targetPort: probe-port
该镜像的Dockerfile
传递了NodeJs客户端使用的环境变量。
FROM node:alpine ADD . . RUN npm i WORKDIR /app ENV PROBE_PORT 4001 ENV MYSQL_HOST "mysql.demo.svc" ENV MYSQL_PORT "3306" ENV MYSQL_USER "demo" ENV MYSQL_PASSWORD "Passw0rd" ENV MYSQL_DATABASE "demodb" CMD ["node", "index.js"]
而NodeJs客户端的连接如下。
const mysql = require('mysql') const connection = mysql.createConnection({ host: process.env.MYSQL_HOST, port: process.env.MYSQL_PORT, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DATABASE }); connection.connect((err) => { if (err) { console.log('数据库连接失败。' + err.message) } else { console.log('数据库已连接。') } });
数据库连接一直失败,并显示消息数据库连接失败。connect ENOENT tcp://172.30.88.64:3306
。此消息中显示的TCP/IP地址是正确的,即它与正在运行的MySQL Pod的服务mysql.demo.svc
匹配。
在MySQL配置文件中,我没有看到bind-address
。这应该意味着MySQL应该接受来自“任何地方”的连接。我创建的用户没有位置限定符,即用户是'demo'@'%'
。连接显然不是通过套接字进行的,因为我传递了用于连接的主机和端口值。
我错过了什么?
问题原因:在连接MySQL pod时,代码中指定的端口号被注释掉,导致连接失败。
解决方法:将代码中的端口号注释取消,确保连接MySQL pod时指定了正确的端口号。另外,创建MySQL用户时,需要使用mysql_native_password
插件机制,因为这是NodeJs客户端支持的唯一插件机制。
文章内容如下:
我已经按照以下方式解决了这个问题。
const mysql = require('mysql') const connection = mysql.createConnection({ host: process.env.MYSQL_HOST, port: process.env.MYSQL_PORT, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DATABASE }); connection.connect((err) => { if (err) { console.log('数据库连接失败。' + err.message) } else { console.log('数据库已连接。') } });
没错,我从选项中移除了端口号。:rolleyes: 这是我找到的最接近的RedHat示例。
另外,我使用mysql_native_password
插件机制创建了用户,因为这是NodeJs客户端支持的唯一插件机制。详情请参阅这里。