我正在使用GCloud,我有一个kubernate集群和一个云SQL实例。
我有一个简单的节点.js应用程序,它使用数据库。当我使用gcloud app deploy
进行部署时,它可以访问数据库。但是,当我构建 dockerimage 并公开它时,它无法访问数据库。
- 我公开了以下Docker应用程序:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
- Cloud SQL deosn未启用私有IP,我使用云SQL代理进行连接
- 在app.yaml中,我确实指定了
base_settings:cloud_sql_instances
。我在 mysql 连接的配置socketPath
使用相同的值。 -
docker 日志中的错误是:
(节点:1) 未处理的承诺拒绝警告:错误:连接 ENOENT/cloudsql/x-alcove-224309:欧洲西部1:学习 at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
您能否解释一下如何从dockerized节点应用程序连接到云sql。
当您使用gcloud app deploy
在 App Engine 上部署应用时,平台会在容器中运行它,同时在负责运行cloud_sql_proxy的挎斗容器中运行它(您可以通过在 app.yaml 文件中指定base_settings:cloud_sql_instances
来请求它)。
Kubernetes Engine 不使用 app.yaml 文件,也不会向你提供这个 side-car 容器,所以你必须设置它。公共文档展示了如何通过为数据库凭据创建机密并使用 side-car 容器配置更新部署文件来执行此操作。文档中显示的示例如下所示:
...
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
...
通常,最好的方法是使用与应用程序相同的 Pod 内的 sidecar 容器进行连接。您可以在"从 Google Kubernetes Engine 连接"页面上找到示例。这里还有一个 Codelab,它更深入,可能会有所帮助。
文档提到可以使用内部 IP 地址进行连接。 有人尝试过吗?