如何从 gcloud 中的容器应用程序连接到云 sql?
How to connect to cloud sql from containered application in gcloud?
我正在使用 GCloud,我有一个 kubernate 集群和一个云 sql 实例。
我有一个简单的 node.js 应用程序,它使用数据库。当我使用 gcloud app deploy
部署时,它可以访问数据库。但是,当我构建 docker 图像并将其公开时,它无法访问数据库。
- 我公开 Docker 应用程序如下:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
- 云 SQL 没有启用私有 IP,我使用云 sql 代理连接
- 在 app.yaml 中我指定了
base_settings:cloud_sql_instances
。我在 socketPath
配置中为 mysql 连接使用相同的值。
docker 日志中的错误是:
(node:1) UnhandledPromiseRejectionWarning: 错误: connect ENOENT /cloudsql/x-alcove-224309:europe-west1:learning
在 PipeConnectWrap.afterConnect [完成时] (net.js:1097:14)
能否请您解释一下如何从 docker 化节点应用程序连接到云 sql。
当您使用 gcloud app deploy
在 App Engine 上部署您的应用程序时,该平台会在一个容器中运行它以及一个负责 运行 cloud_sql_proxy(您通过在 app.yaml 文件中指定 base_settings:cloud_sql_instances
来请求它。
Kubernetes Engine 不使用 app.yaml 文件,也不向您提供此 side-car 容器,因此您必须对其进行设置。 public doc 展示了如何通过为您的数据库凭证创建秘密并使用 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 容器进行连接。您可以在 "Connecting from Google Kubernetes Engine" 页面 here. There is also a codelab here 上找到更深入且可能有用的示例。
文档 mentions 可以使用内部 IP 地址进行连接。
有人试过吗?
我正在使用 GCloud,我有一个 kubernate 集群和一个云 sql 实例。
我有一个简单的 node.js 应用程序,它使用数据库。当我使用 gcloud app deploy
部署时,它可以访问数据库。但是,当我构建 docker 图像并将其公开时,它无法访问数据库。
- 我公开 Docker 应用程序如下:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
- 云 SQL 没有启用私有 IP,我使用云 sql 代理连接
- 在 app.yaml 中我指定了
base_settings:cloud_sql_instances
。我在socketPath
配置中为 mysql 连接使用相同的值。 docker 日志中的错误是:
(node:1) UnhandledPromiseRejectionWarning: 错误: connect ENOENT /cloudsql/x-alcove-224309:europe-west1:learning 在 PipeConnectWrap.afterConnect [完成时] (net.js:1097:14)
能否请您解释一下如何从 docker 化节点应用程序连接到云 sql。
当您使用 gcloud app deploy
在 App Engine 上部署您的应用程序时,该平台会在一个容器中运行它以及一个负责 运行 cloud_sql_proxy(您通过在 app.yaml 文件中指定 base_settings:cloud_sql_instances
来请求它。
Kubernetes Engine 不使用 app.yaml 文件,也不向您提供此 side-car 容器,因此您必须对其进行设置。 public doc 展示了如何通过为您的数据库凭证创建秘密并使用 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 容器进行连接。您可以在 "Connecting from Google Kubernetes Engine" 页面 here. There is also a codelab here 上找到更深入且可能有用的示例。
文档 mentions 可以使用内部 IP 地址进行连接。 有人试过吗?