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 が有効になっていません。Cloud SQL プロキシを使用して接続しています
  3. app.yaml で指定しますbase_settings:cloud_sql_instancessocketPathmysql 接続の構成で同じ値を使用します。
  4. Docker ログのエラーは次のとおりです。

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

Docker化されたノードアプリケーションからクラウドSQLに接続する方法を教えてください。

4

3 に答える 3

1

を使用して App Engine にアプリをデプロイするとgcloud app deploy、プラットフォームは、cloud_sql_proxy の実行を担当するサイドカー コンテナーと共にコンテナー内でアプリを実行base_settings:cloud_sql_instancesします (app.yaml ファイルで を指定して要求します)。

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

通常、最善の方法は、アプリケーションと同じポッド内のサイドカー コンテナーを使用して接続することです。ここの「Google Kubernetes Engine からの接続」ページで例を見つけることができます。ここには、より詳細で役立つ可能性のあるコードラボもあります。

于 2019-03-14T20:38:28.500 に答える