通过私有 IP 从 GKE 连接到 Cloud SQL
Connect from GKE to Cloud SQL through private IP
我正在尝试从 GKE 中的 pod 连接到 Google 云 SQL。
上周末我让它工作,但是当我删除 pod 并重新创建它时它不工作,我不确定为什么。
描述
我有一个 nodejs
应用程序,它是 docker 化的。它使用库 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(cloudsql)和cluster(gke)在同一个gcp网络,但是好像pod看不到数据库
如果我 运行 在我的本地进行 docker-compose,此连接有效。
您正在通过私有 IP 进行连接,但您指定的端口似乎是 3000
。通常云 SQL 侦听数据库引擎的默认端口:
- MySQL - 3306
- Postgres - 5432
- SQL 服务器 - 1433
我正在尝试从 GKE 中的 pod 连接到 Google 云 SQL。
上周末我让它工作,但是当我删除 pod 并重新创建它时它不工作,我不确定为什么。
描述
我有一个 nodejs
应用程序,它是 docker 化的。它使用库 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(cloudsql)和cluster(gke)在同一个gcp网络,但是好像pod看不到数据库
如果我 运行 在我的本地进行 docker-compose,此连接有效。
您正在通过私有 IP 进行连接,但您指定的端口似乎是 3000
。通常云 SQL 侦听数据库引擎的默认端口:
- MySQL - 3306
- Postgres - 5432
- SQL 服务器 - 1433