簡體   English   中英

從具有私有和公共 IP 的虛擬機連接到私有 IP 上的 Google Cloud SQL 實例失敗

[英]Connecting to Google Cloud SQL instance on private IP from a VM with both private and public IPs fails

我要設置的內容:

  • 具有私有 IP、Postgresql 數據庫的 Cloud SQL 實例
  • 一個具有一個公網 IP 和一個私網 IP 的虛擬機,與 SQL 實例所在的 VPC 網絡相同(虛擬機、SQL 實例和 VPC 都在同一區域)
  • 虛擬機擁有一個服務帳號,該帳號具有足夠的 Cloud SQL 客戶端/查看者權限
  • 連接到 SQL 實例的 VM 上的 SQL 代理。 我使用在一些文檔中找到的-ip_address_types=PRIVATE參數運行它。

配置代碼

稍微簡化的 Terraform 代碼用於重現讓我感到困惑的狀態: https : //github.com/hallvors/gcp-network-issue-demo要對此進行測試,請執行以下操作:

  1. 創建一個新的一次性 Google Cloud 項目。
  2. 為方便起見,您可以運行 bootstrap.sh 以啟用正確的服務(它會詢問 Google 項目的 ID,並假設您有一個已登錄並具有訪問權限的 gcloud 客戶端)。
  3. 在項目中創建一個服務賬號,為了方便起見,只將其./local-secrets/google-project-credentials.json owner,並將密鑰文件保存在./local-secrets/google-project-credentials.json
  4. 使用項目 ID 和服務帳戶的電子郵件更新 terraform.tfvars
  5. terraform workspace new staging
  6. terraform init
  7. terraform apply

完成 Terraform 后,您應該在項目中設置了一個數據庫和一個 VM。

  1. 通過 SSH 連接到 VM 並運行sudo apt install postgresql-client-common postgresql-client
  2. 查找數據庫實例的 IP 地址
  3. 運行這個(根據需要修改細節) psql --host 10.167.0.3 -U gcp-network-issue-demo-staging-db-user gcp-network-issue-demo-staging-database

發生什么了?

  • 任何實際使用連接的嘗試,例如 psql 客戶端或 db-migrate,都會超時
  • 如果我從設置中刪除 VM 的公共 IP 地址,它連接正常。 但是,我需要一個可公開訪問的 VM 以便其他服務連接到它。

我錯過了什么?

這個問題的原因是我不理解,一個網絡接口,可以同時具有公共和私有IP地址/網絡。 所以我的代碼為 google_compute_instance 設置了一個公共接口和一個專用網絡接口:

  # Update VM needs a public IP
  network_interface {
    network = "default"
    access_config {
    }
  }

  network_interface {
    network    = var.network
    subnetwork = var.subnetwork
  }

現在,我仍然不完全了解網絡,但似乎您不能(很容易?)指定數據庫連接嘗試使用的接口,並且它不會自動選擇正確的接口。 修復在此提交中,配置對私有網絡和公共網絡接口的訪問:

https://github.com/hallvors/gcp-network-issue-demo/commit/ea14174c1087c89b92310b5b4913e12a4e17130d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM