![](/img/trans.png)
[英]Kubernetes pod host not allowed to connect to this mysql server
[英]Kubernetes - NodeJs MySQL pod does not connect with 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('Database connection failed. ' + err.message)
} else {
console.log('Database connected.')
}
});
數據庫連接不斷失敗,並顯示一條消息,因為Database connection failed. connect ENOENT tcp://172.30.88.64:3306
Database connection failed. connect ENOENT tcp://172.30.88.64:3306
。 此消息中顯示的 TCP/IP 地址是正確的,即它與正在運行的 MySQL pod 的服務mysql.demo.svc
匹配。
在 MySQL 配置文件中,我沒有看到bind-address
。 這應該意味着,MySQL 應該接受來自“任何地方”的連接。 我正在創建沒有位置限定符的用戶,即用戶是'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: 這個來自 RedHat 的例子是我見過的最接近的例子。
此外,我使用mysql_native_password
創建了用戶,因為這是 NodeJs 客戶端支持的唯一插件機制。 見這里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.