过去几天,我一直在尝试让部署的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应用连接到持久数据库。
同样,在本地运行容器和本地运行节点应用程序时,我能够成功命中远程数据库。我真的不确定为什么部署时无法连接。
谢谢!
答案 0 :(得分:0)
因此Kubernetes做了很多源NAT,所以我必须在网络上添加这样的规则,以允许GCE中群集中的所有位置的传出流量:
这是非常宽松的,因此您可能只想最初出于测试目的添加它。您还可以通过封装到运行的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方面设置适当的授予以及所有这些东西。