繁体   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