Kubernetes - NodeJs MySQL pod не соединяется с MySQL pod - PullRequest
0 голосов
/ 31 января 2020

У меня есть MySQL стручок и работает. Я открыл терминал для этого модуля и создал базу данных и пользователя.

create database demodb;
create user demo identified by 'Passw0rd';
grant all on demodb.* to 'demo';

У меня есть Deployment для запуска клиента NodeJs для модуля MySQL. Это в моей локальной 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.demo.svc запущенного MySQL модуля.

В файлах конфигурации MySQL я не вижу bind-address , Это должно означать, что MySQL должен принимать соединения из любого места. Я создаю пользователя без квалификатора местоположения, т.е. пользователь 'demo'@'%'. Очевидно, что соединение не через сокеты, так как я передаю значения хоста и порта для соединения.

Чего мне не хватает?

1 Ответ

0 голосов
/ 01 февраля 2020

Я получил это работает следующим образом.

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 клиентом , Смотри здесь .

...