如何从 gcloud 中的容器应用程序连接到云 sql?

How to connect to cloud sql from containered application in gcloud?

我正在使用 GCloud,我有一个 kubernate 集群和一个云 sql 实例。

我有一个简单的 node.js 应用程序,它使用数据库。当我使用 gcloud app deploy 部署时,它可以访问数据库。但是,当我构建 docker 图像并将其公开时,它无法访问数据库。

  1. 我公开 Docker 应用程序如下:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
  2. 云 SQL 没有启用私有 IP,我使用云 sql 代理连接
  3. 在 app.yaml 中我指定了 base_settings:cloud_sql_instances。我在 socketPath 配置中为 mysql 连接使用相同的值。
  4. 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 地址进行连接。 有人试过吗?