Kubernetes - NodeJs MySQL pod 未与 MySQL pod 连接
Kubernetes - NodeJs MySQL pod does not connect with MySQL pod
我有一个 MySQL 吊舱和 运行。我为这个 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('Database connection failed. ' + err.message)
} else {
console.log('Database connected.')
}
});
数据库连接一直失败并显示 Database connection failed. connect ENOENT tcp://172.30.88.64:3306
消息。此消息中显示的 TCP/IP 地址是正确的,即它与 运行 MySQL pod 的服务 mysql.demo.svc
匹配。
在 MySQL 配置文件中,我没有看到 bind-address
。这应该意味着,MySQL 应该接受来自 'every where' 的连接。我正在创建没有位置限定符的用户,即用户是 'demo'@'%'
。显然,连接不是通过套接字,因为我正在传递连接的主机和端口值。
我错过了什么?
我按如下方式工作。
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('Database connection failed. ' + err.message)
} else {
console.log('Database connected.')
}
});
没错;我从选项中删除了端口号。 :rolleyes: 这个 example from RedHat 是我见过的最接近的。
此外,我使用 mysql_native_password
创建了用户,因为这是 NodeJs 客户端支持的唯一插件机制。参见 here。
我有一个 MySQL 吊舱和 运行。我为这个 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('Database connection failed. ' + err.message)
} else {
console.log('Database connected.')
}
});
数据库连接一直失败并显示 Database connection failed. connect ENOENT tcp://172.30.88.64:3306
消息。此消息中显示的 TCP/IP 地址是正确的,即它与 运行 MySQL pod 的服务 mysql.demo.svc
匹配。
在 MySQL 配置文件中,我没有看到 bind-address
。这应该意味着,MySQL 应该接受来自 'every where' 的连接。我正在创建没有位置限定符的用户,即用户是 'demo'@'%'
。显然,连接不是通过套接字,因为我正在传递连接的主机和端口值。
我错过了什么?
我按如下方式工作。
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('Database connection failed. ' + err.message)
} else {
console.log('Database connected.')
}
});
没错;我从选项中删除了端口号。 :rolleyes: 这个 example from RedHat 是我见过的最接近的。
此外,我使用 mysql_native_password
创建了用户,因为这是 NodeJs 客户端支持的唯一插件机制。参见 here。