#postgresql #sequelize.js #google-kubernetes-engine #google-cloud-sql #google-cloud-networking
#postgresql #sequelize.js #google-kubernetes-engine #google-cloud-sql #google-облачные сети
Вопрос:
Я пытаюсь подключиться из модуля в GKE к Google Cloud SQL.
В прошлые выходные я заставил его работать, но когда я удалил модуль и воссоздал его заново, он не работал, и я не уверен, почему.
Описание
У меня есть nodejs
приложение, которое оно настроено. Он использует библиотеку sequelize
и подключается к postgres
базе данных.
Sequelize считывает переменные из среды, а в kubenetes я передаю их через секрет
apiVersion: v1
kind: Secret
metadata:
name: myapi-secret
namespace: development
type: Opaque
data:
MYAPI_DATABASE_CLIENT: XXX
MYAPI_DATABASE_PORT : XXX
MYAPI_DATABASE_HOST: XXX
MYAPI_DATABASE_NAME : XXX
MYAPI_DATABASE_USERNAME: XXX
MYAPI_DATABASE_PASSWORD: XXX
И мое определение pod
apiVersion: v1
kind: Pod
metadata:
name: myapi
namespace: development
labels:
env: dev
app: myapi
spec:
containers:
- name: myapi
image: gcr.io/companydev/myapi
envFrom:
- secretRef:
name: myapi-secret
ports:
- containerPort: 3001
name: myapi
При развертывании модуля я получаю сообщение об ошибке подключения к базе данных
Error: listen EACCES: permission denied tcp://podprivateip:3000
at Server.setupListenHandle [as _listen2] (net.js:1300:21)
at listenInCluster (net.js:1365:12)
at Server.listen (net.js:1462:5)
at Function.listen (/usr/src/app/node_modules/express/lib/application.js:618:24)
at Object.<anonymous> (/usr/src/app/src/app.js:46:5)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:941:32)
at Function.Module._load (internal/modules/cjs/loader.js:782:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
Emitted 'error' event on Server instance at:
at emitErrorNT (net.js:1344:8)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
code: 'EACCES',
errno: -13,
syscall: 'listen',
address: 'tcp://podprivateip:3000',
port: -1
}
Я не мог понять, чего мне не хватает
Благодаря @kurtisvg я смог понять, что я не передавал хост и порт через переменные env в express. Однако у меня все еще есть ошибка подключения
Предупреждение о необработанном отказе: ошибка продолжения подключения: время подключения к postgresinternalip:5432
Это странно, потому что postgres (cloud sql) и кластер (gke) находятся в одной сети gcp, но похоже, что модуль не может видеть базу данных.
Если я запускаю docker-compose в своем локальном компьютере, это соединение работает.
Комментарии:
1. Убедитесь, что если вы подключаетесь из GKE, вы должны запускать GKE 1.8 или выше в кластере, использующем VPC. Документация по облачному SQL
Ответ №1:
Вы подключаетесь по частному IP, но указанный вами порт выглядит 3000
как . Обычно Cloud SQL прослушивает порт по умолчанию для ядра базы данных:
- MySQL — 3306
- Postgres — 5432
- SQL Server — 1433
Комментарии:
1. спасибо за ответ, возможно, я допускаю ошибку, я перепроверю. ip и порт взяты из контейнера в модуле. Я передал порт postgres в качестве переменной env в секретах.
2. спасибо за ваш ответ, я понял, что одна из моих ошибок заключалась в том, что я не передавал правильный хост для express. Однако я все еще не могу подключиться к Cloud SQL. Я обновлю вопрос. Спасибо
3. Для справки, первоначальная проблема заключалась не в подключении к базе данных, а в том, что я не передавал правильный хост / порт для express. Затем проблема заключалась в том, что я создал сеть в GCP, и я не понимал, что когда я менял сеть в экземпляре базы данных, это изменение никогда не происходило, поэтому у меня есть мой кластер и мой sql в разных сетях. Ваш ответ поможет мне правильно, спасибо. Затем я попытаюсь использовать sql proxy, как вы предложили в видео на YouTube.