从同时具有私有和公共IP的虚拟机连接到私有IP上的Google Cloud SQL实例失败



我要设置的内容:

  • 带有私有IP的云SQL实例,Postgresql数据库
  • 一个有一个公共IP和一个私有IP的虚拟机与SQL实例所在的VPC网络相同(虚拟机、SQL实例和VPC都在同一个区域(
  • VM有一个具有足够云SQL客户端/查看器权限的服务帐户
  • 连接到SQL实例的VM上的SQL代理。我使用在一些文档中找到的-ip_address_types=PRIVATE参数运行它

配置代码

这里是稍微简化的Terraform代码,用于复制让我困惑的状态:https://github.com/hallvors/gcp-network-issue-demo要对此进行测试,请执行以下操作:

  1. 创建一个新的一次性谷歌云项目
  2. 为了方便起见,你可以运行bootstrap.sh来启用正确的服务(它会询问谷歌项目的ID,并假设你有一个登录并可以访问的gcloud客户端(
  3. 在项目中创建一个服务帐户,只是为了方便起见将其作为所有者,并在./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进入虚拟机并运行sudo apt install postgresql-client-common postgresql-client
  2. 查找DB实例的IP地址
  3. 运行此(根据需要修改详细信息(psql --host 10.167.0.3 -U gcp-network-issue-demo-staging-db-user gcp-network-issue-demo-staging-database

会发生什么

  • 任何实际使用连接的尝试,例如psql-client或db-migrate,都会超时
  • 如果我从安装程序中删除虚拟机的公共IP地址,它连接良好。然而,我需要一个可公开访问的VM,以便其他服务连接到它

我缺少什么?

这个问题的原因是我没有理解网络接口可以同时具有公共和私有IP/网络。因此,我的代码为google_computer_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

相关内容

  • 没有找到相关文章

最新更新