Подключение из GKE к облачному SQL через частный IP

#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.