配置专用服务访问通道

本页面介绍了如何在 VPC 网络中配置专用服务访问通道

专用服务访问通道是作为您的 VPC 网络与 Cloud SQL 实例所在的底层 Google 服务 VPC 网络之间的 VPC 对等互连连接实现的。通过专用连接,您的 VPC 网络中的虚拟机实例和您访问的服务可以使用内部 IP 地址进行专有的通信。虚拟机实例不需要接入互联网或具备外部 IP 地址,通过专用服务访问通道即可访问可用服务。

准备工作

Cloud SQL 要求用于专用 IP 连接的每个 VPC 网络使用专用服务访问通道。如需管理专用服务访问通道连接,用户应具有以下 IAM 权限:

  • compute.networks.list
  • compute.addresses.create
  • compute.addresses.list
  • servicenetworking.services.addPeering

如果您不具备这些权限,则可能会发生权限不足错误。

如果您使用的是共享 VPC 网络,则还必须执行以下操作:

  • 将您的用户添加到宿主项目中。
  • 在宿主项目上为用户分配上面的四个权限。
  • 向用户授予 compute.globalAddresses.list IAM 权限。

为 Cloud SQL 配置专用服务访问通道

专用服务访问通道的配置过程分为两个部分:

  • 选择现有 IP 范围或分配新的 IP 地址范围。

    您也可以选择允许 Google 为您分配范围。在这种情况下,Google 将自动分配一个前缀长度为 /20 的 IP 范围并命名为“default-ip-range”

    如果您要在多个区域中或针对不同的数据库类型创建实例,则您必须至少有 /24 范围的 IP 地址可供每个区域或数据库类型使用。这包括其他应用,例如 FilestoreMemorystore。对于新的区域或数据库类型,Cloud SQL 必须具有可用的 /24 范围。

  • 创建从 VPC 网络到底层服务提供方网络的专用连接。

分配 IP 地址范围

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 选择要使用的 VPC 网络。
  3. 选择专用服务连接标签页。
  4. 选择为服务分配的 IP 范围标签页。
  5. 点击分配 IP 范围
  6. 对于已分配的范围的名称,请指定 google-managed-services-VPC_NETWORK_NAME,其中 VPC_NETWORK_NAME 是要连接的 VPC 网络的名称(例如 google-managed-services-default)。说明为可选字段。
  7. 选择自定义选项,然后以 CIDR 表示法输入要分配的 IP 地址范围。
  8. 点击分配以创建分配的范围。

gcloud

执行下列其中一项操作:

  • 如需指定地址范围和前缀长度(子网掩码),请使用 addressesprefix-length 标志。例如,如需分配 CIDR 地址段 192.168.0.0/16,请将地址指定为 192.168.0.0,并将前缀长度指定为 16
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --addresses=192.168.0.0 \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            
  • 如需只指定前缀长度(子网掩码),请使用 prefix-length 标志。如果您省略地址范围,则 Google Cloud 会自动选择您的 VPC 网络中未使用的地址范围。以下示例选择的是前缀长度为 16 位的未使用的 IP 地址范围。
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            

VPC_NETWORK_NAME 替换为您的 VPC 网络的名称,例如 my-vpc-network

以下示例分配一个 IP 范围,该范围允许 VPC 网络 my-vpc-network 中的资源使用专用 IP 连接到 Cloud SQL 实例。

    gcloud compute addresses create google-managed-services-my-vpc-network \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --network=projects/myprojectid/global/networks/myvpcnetwork \
    --project=my-project
    

Terraform

如需分配 IP 地址范围,请使用 Terraform 资源

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.peering_network.id
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

通过运行以下命令并在提示符处输入 yes,移除之前使用 Terraform 配置应用的资源:

terraform destroy

创建专用连接

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 选择要使用的 VPC 网络。
  3. 选择专用服务连接标签页。
  4. 选择连到服务的专用连接标签页。
  5. 点击创建连接以在您的网络与服务提供方之间创建专用连接。
  6. 对于指定的分配范围,请选择一个或多个未被其他服务提供方占用的现有分配范围。
  7. 点击连接以创建连接。

gcloud

  1. 创建专用连接。

    gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-VPC_NETWORK_NAME \
    --network=VPC_NETWORK_NAME \
    --project=PROJECT_ID
    

    该命令会启动一个长时间运行的 Cloud SQL 实例操作,并返回操作 ID。

  2. 检查操作是否成功。

    gcloud services vpc-peerings operations describe \
    --name=OPERATION_ID
    

创建专用连接时,您可以指定多个分配范围。举例来说,如果一个范围已用尽,则您可以分配额外的分配范围。该服务会按您指定的顺序使用所提供的所有范围中的 IP 地址。

Terraform

如需创建专用连接,请使用 Terraform 资源

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

创建专用连接时,采用 service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com 格式的服务账号会被授予 servicenetworking.serviceAgent 角色,因为该账号是即时预配的。

如果您看到有关项目的 compute.globalAddresses.list 权限或 compute.projects.get 权限的错误,请运行以下 gcloud 命令:

gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \
    --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \
    --role=roles/servicenetworking.serviceAgent

更改专用服务访问通道配置

无需修改任何现有的 Cloud SQL 实例,即可更改专用服务连接已分配的地址范围。如需更改现有 Cloud SQL 实例的专用 IP 地址,请按照以下步骤操作。

如需更改已分配的地址范围,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 选择要使用的 VPC 网络。
  3. 选择专用服务连接标签页。
  4. 选择为服务分配的 IP 范围标签页。
  5. 选择要删除的范围的名称。

  6. 点击释放

  7. 点击分配 IP 范围

  8. 创建名称相同但范围不同的新范围

    名称很重要,因为已经使用该地址名称建立了专用连接。

gcloud services vpc-peerings update \
--network=VPC_NETWORK_NAME \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force

更改现有 Cloud SQL 实例的专用 IP 地址

如需更改现有 Cloud SQL 实例的专用 IP 地址,请将该实例从其原始网络移至临时 VPC 网络。然后,更改实例原始网络的专用服务访问通道配置,并将 Cloud SQL 实例移回其原始网络。

如需移至其他 VPC 网络,请按照以下过程中最后一步(移回实例)以外的所有步骤操作。在这种情况下,TEMPORARY_VPC_NETWORK_NAME 是新的 VPC 网络。此外,请删除旧的专用连接。被删除的专用连接可能需要几天时间才能从 Google Cloud 控制台中消失。

如果 Cloud SQL 实例托管在共享 VPC 网络中,则以下说明中使用的 VPC_NETWORK_NAME 变量必须是宿主项目的 VPC 网络名称。如需指定具有共享 VPC 网络的网络,请使用该网络的完整网址,例如 projects/HOST_PROJECT/global/networks/NETWORK_NAME

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 创建临时 VPC 网络
  3. 在临时 VPC 网络中创建 IP 分配
  4. 在临时 VPC 网络中创建专用连接
  5. 将 Cloud SQL 实例移动到临时 VPC 网络。

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/TEMPORARY_VPC_NETWORK_NAME \
      --no-assign-ip
    
  6. 更改原始网络中的专用服务访问通道配置,以添加新的已分配范围或删除现有已分配范围。

  7. 将 Cloud SQL 实例移回原始 VPC 网络。

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/ORIGINAL_VPC_NETWORK_NAME \
      --no-assign-ip