无法从已部署的Kubernetes NodeJS应用连接到Google MySQL

时间:2018-10-30 00:14:11

标签: mysql node.js kubernetes sequelize.js gcloud

过去几天,我一直在尝试让部署的NodeJS Kubernetes LoadBalancer应用程序连接到Google Cloud MySQL实例。 SQL数据库和Kubernetes部署位于同一Google项目中。两者均为该项目选择的ORM是Sequelize。这是我的连接配置的片段:

"deployConfigs": {
   "username": DB_USERNAME,
   "password": DB_PASSWORD,
   "database": DB_DATABASE,
   "host": DB_HOST,
   "port": 3306,
   "dialect": "mysql",
   "socketPath": "/cloudsql/INSTANCE_NAME"
}

当我以相同的配置在本地运行应用程序时,我可以从数据库中查询。只要API没有访问数据库,我也可以访问NodeJS LoadBalancer URL以获取有效的API响应。

我已经将我的IP以及NodeJS LoadBalancer API的IP列入了白名单,但是我仍然收到以下响应:

{
"name": "SequelizeConnectionError",
"parent": {
    "errorno": "ETIMEDOUT",
    "code": "ETIMEDOUT",
    "syscall": "connect",
    "fatal": true
  },
"original": {
    "errorno": "ETIMEDOUT",
    "code": "ETIMEDOUT",
    "syscall": "connect",
    "fatal": true
  }
}

我遵循了通过Kubernetes部署创建代理的说明,但我认为这不一定能解决我的问题,因为我只是想从我的Kubernetes应用连接到持久数据库。

同样,在本地运行容器和本地运行节点应用程序时,我能够成功命中远程数据库。我真的不确定为什么部署时无法连接。

谢谢!

2 个答案:

答案 0 :(得分:0)

因此Kubernetes做了很多源NAT,所以我必须在网络上添加这样的规则,以允许GCE中群集中的所有位置的传出流量:

egress rule

这是非常宽松的,因此您可能只想最初出于测试目的添加它。您还可以通过封装到运行的pod中来检查与MySQL的连接性:

$ kubectl exec -it <running-pod> sh
/home/user # telnet $DB_HOST 3306

答案 1 :(得分:0)

听起来您可能正在尝试通过其公共IP连接到Cloud SQL实例?如果是这种情况,请小心,因为这不受支持。看看this documentation page,找出解决问题的最佳方法。

您提到您已经在使用代理,但没有提及哪个代理。如果是Cloud SQL代理,那么它应该允许您对数据库执行任何类型的操作,它所做的只是在客户端(即Pod)和Cloud SQL实例之间建立连接。该代理应该可以正常工作。

别忘了在Cloud SQL方面设置适当的授予以及所有这些东西。