1

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

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

  1. 我公开 Docker 应用程序如下:https ://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
  2. Cloud SQL 未启用私有 IP,我使用云 sql 代理连接
  3. 在 app.yaml 我确实指定了base_settings:cloud_sql_instances. 我在 config 中使用相同的值socketPath进行 mysql 连接。
  4. docker日志中的错误是:

    (node:1) UnhandledPromiseRejectionWarning: E​​rror: connect ENOENT /cloudsql/x-alcove-224309:europe-west1:learning at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)

您能否解释一下如何从 dockerized 节点应用程序连接到云 sql。

4

3 回答 3

1

当您在 App Engine 上部署您的应用时,平台会在一个容器中运行它以及一个负责运行 cloud_sql_proxy 的边车容器(您可以通过在 app.yaml 文件中gcloud app deploy指定 来请求它)。base_settings:cloud_sql_instances

Kubernetes Engine 不使用 app.yaml 文件,也不向您提供这个边车容器,因此您必须对其进行设置。公共文档展示了如何通过为您的数据库凭据创建机密并使用边车容器配置更新您的部署文件来做到这一点。文档中显示的示例如下所示:

...
- 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
...
于 2019-03-14T20:38:11.803 回答
1

通常,最好的方法是使用与应用程序相同的 pod 内的 sidecar 容器进行连接。您可以在此处的“从 Google Kubernetes Engine 连接”页面上找到示例。这里还有一个更深入的代码实验室,可能会有所帮助。

于 2019-03-14T20:38:28.500 回答
0

该文档提到可以使用内部 IP 地址进行连接。有人试过吗?

于 2019-09-08T07:26:51.497 回答