【问题标题】:Connect from GKE to Cloud SQL through private IP通过私有 IP 从 GKE 连接到 Cloud SQL
【发布时间】:2020-10-22 03:32:59
【问题描述】:

我正在尝试从 GKE 中的 pod 连接到 Google Cloud SQL。

上周末我让它工作了,但是当我删除 pod 并重新创建它时它不起作用,我不知道为什么。

说明

我有一个被 dockerized 的 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

当我部署 pod 时,我收到一个与数据库的连接错误

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,我能够意识到我没有通过环境变量传递主机和端口来表达。但是我仍然有连接错误

UnhandledPromiseRejectionWarning: SequelizeConnectionError: connect ETIMEDOUT postgresinternalip:5432

很奇怪,因为postgres(cloud sql)和cluster(gke)在同一个gcp网络,但是就像pod看不到数据库一样。

如果我在本地运行 docker-compose,则此连接正常。

【问题讨论】:

  • 确保如果您从 GKE 连接,您必须在 VPC 原生集群上运行 GKE 1.8 或更高版本。 Cloud SQL documentation

标签: postgresql sequelize.js google-kubernetes-engine google-cloud-sql google-cloud-networking


【解决方案1】:

您正在通过私有 IP 进行连接,但您指定的端口似乎是 3000。通常,Cloud SQL 会侦听数据库引擎的默认端口:

  • MySQL - 3306
  • Postgres - 5432
  • SQL Server - 1433

【讨论】:

  • 感谢您的回答,也许我在那里犯了一个错误,我会仔细检查。 ip 和端口来自 pod 中的容器。我已将 postgres 端口作为 env 变量传递到 secrets 中。
  • 感谢您的回答我意识到我的错误之一是我没有通过正确的主机来表达。但是我仍然无法连接到 Cloud SQL。我会更新这个问题。谢谢
  • 作为记录,最初的问题不是与数据库的连接,而是我没有传递正确的主机/端口来表达。然后问题是我在GCP中创建了一个网络,我没有意识到当我在数据库实例中更改网络时,这种更改从未发生过,所以我的集群和我的sql在不同的网络中。您的回答以正确的方式指导我,谢谢。然后我会按照你在 youtube 视频中的建议尝试使用 sql 代理。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2020-11-24
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多