CloudSQL Proxy なしで GKE から CloudSQL に接続できません - SQLSTATE[HY000] [2002] 操作がタイムアウトしました

CloudSQL Proxy なしで GKE から CloudSQL に接続できません - SQLSTATE[HY000] [2002] 操作がタイムアウトしました

次のコマンドで GKE クラスターを作成しました:

gcloud container clusters create stage1 \
--enable-ip-alias \
--release-channel stable \
--zone us-central1 \
--node-locations us-central1-a,us-central1-b

今、PHPアプリケーションをクラウドSQLに接続したいと思いました。ポッドで実行されているPHPアプリケーションからクラウドSQLへのアクセスを承認するために、次の手順を実行しました。

  • 秘密を作った
    kubectl create secret generic stage-cloudsql-secret \
      --from-literal=db_host=<YOUR-PRIVATE-IP-ADDRESS>
  • コンテナ セクションのこのシークレット ポッドを次のように更新しました。
    env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: stage-cloudsql-secret
                  key: db_host

PHP ファイル (env.php) で CloudSQL プライベート IP (DB 名、ユーザー名、パスワードを含む) を更新し、Docker イメージをビルドして、GKE クラスターにポッドを作成しました。ポッドが作成されると、コンテナから次のエラーが発生します (コンテナが失敗しました)。

SQLSTATE[HY000] [2002] Operation timed out

注1: これはホスト環境で動作するアプリケーションであり、Google Cloudに移行しています。

注2: GKE と Cloud SQL は同じ VPC 内にあります (デフォルト)

注3: クラスター内のIPエイリアシングを有効にする

注4: 起動時にデータベースにデータを作成するコンテナがあります

アップデート1

Google Cloud ドキュメントに記載されている手順に従いました。リンク

コンテナにSSHで接続し、プライベートIPを使用してクラウドSQLにアクセス(Ping)しようとしましたが、できませんでした。

アップデート2

上記のリンクに従って、シークレットを作成する方法を変更しました(今回はプライベートIPのみ)。また、env.phpを以下のように更新しました。

array (
    'table_prefix' => '',
    'connection' =>
    array (
      'default' =>
      array (
        'host' => getenv('DB_HOST'),

以前の「ホスト」=> [Cloud SQL のプライベート IP]

今回はポッドの作成時に次のエラーが表示されます

SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリはありません

アップデート3

すべての手順をやり直しましたが、うまくいきました

関連情報