指定网络和子网

本文档介绍如何在运行 Dataflow 作业时指定网络和/或子网选项。

若要按照这些步骤操作,您需要了解如何创建 Google Cloud 网络和子网。您还需要熟悉下一部分中介绍的网络术语。

default 网络配置为允许运行 Dataflow 作业,但其他服务也可能会使用此网络。请确保对 default 网络的任何更改与所有服务兼容。或者,您也可以为 Dataflow 创建单独的网络。

如需详细了解如何排查网络问题,请参阅排查 Dataflow 网络问题

Google Cloud 网络术语

  • VPC 网络。VPC 网络是物理网络的虚拟版本,在 Google 的生产网络内实现。VPC 有时称为“网络”,可为项目中的资源提供连接。

    如需详细了解 VPC,请参阅 VPC 网络

  • 共享 VPC 网络。在使用共享 VPC 时,您将项目指定为宿主项目,并将一个或多个其他服务项目连接到该项目。宿主项目中的 VPC 网络称为“共享 VPC 网络”。如果 Shared VPC Admin 将您定义为 Service Project Admin,则您有权在宿主项目的网络中至少使用部分子网。

    如需详细了解共享 VPC,请参阅共享 VPC

  • VPC Service Controls。 Dataflow VPC Service Controls 有助于防止外部实体或内部实体的意外或针对性操作,从而有助于最大限度地减少数据渗漏的风险。您可以使用 VPC Service Controls 创建边界,该边界可保护您明确指定的服务的资源和数据。

    如需详细了解 VPC Service Controls,请参阅 VPC Service Controls 概览。如需了解将 Dataflow 与 VPC Service Controls 结合使用的限制,请参阅支持的产品和限制

  • 防火墙规则。使用防火墙规则允许或拒绝传入和传出虚拟机的流量。如需了解详情,请参阅配置互联网访问权限和防火墙规则

Dataflow 作业的网络和子网

创建 Dataflow 作业时,您可以指定网络和/或子网选项。

请考虑以下准则:

  • 如果您不确定要使用哪个参数,请仅指定子网参数。然后,系统会隐式为您指定网络参数。

  • 如果同时省略子网和网络参数,Google Cloud 会假定您打算使用名为 default自动模式 VPC 网络。 如果您的项目中没有名为 default 的网络,则必须指定备用网络或子网。

指定网络参数的准则

  • 如需在项目中选择自动模式 VPC 网络,请使用网络参数。如需了解详情,请参阅创建自动模式 VPC 网络

  • 您只能使用网络名称来指定网络,而不能通过完整的网址来指定网络。

  • 如果同时满足以下两个条件,您只能使用网络参数选择共享 VPC 网络:

    • 您选择的共享 VPC 网络是自动模式 VPC 网络。

    • 您是 Service Project Admin,对整个共享 VPC 宿主项目具有项目级权限。共享 VPC 管理员已授予您整个宿主项目的 Compute Network User 角色,因此您可以使用其所有网络和子网。

  • 对于所有其他情况,您必须指定子网。

指定子网参数的准则

  • 如果指定子网,则 Dataflow 会为您选择网络。因此,在指定子网时可以省略网络参数。

  • 如需在网络中选择特定子网,请使用子网参数。

  • 使用完整网址或缩写路径指定子网。如果子网位于共享 VPC 网络中,则必须使用完整的网址。

  • 您必须选择与运行 Dataflow 工作器的可用区位于同一区域的子网。

  • 在以下情况下,您必须指定子网参数:

    • 您指定的子网位于自定义模式 VPC 网络中。

    • 您是服务项目管理员,具有对共享 VPC 宿主项目中特定子网的子网级权限

  • 子网大小会根据可用 IP 地址数量限制实例数。此大小不会影响 Dataflow VPC Service Controls 的性能。

为共享 VPC 指定子网参数的准则

  • 为共享 VPC 指定子网网址时,请确保 HOST_PROJECT_ID 是在其中托管 VPC 的项目。

  • 如果子网位于共享 VPC 网络中,则必须使用完整的网址。请参阅指定子网的完整网址示例

  • 确保共享 VPC 子网与 Dataflow 服务账号共享,并且在指定子网上分配了 Compute Network User 角色。必须向宿主项目中的 Dataflow 服务账号分配 Compute Network User 角色。

    1. 在 Google Cloud 控制台中,进入共享 VPC 页面。

      转到“共享 VPC”页面

    2. 选择宿主项目。

    3. 单独子网访问权限部分中,选择您的子网。子网级权限窗格会显示此子网的权限。您可以查看 VPC 子网是否已分配 Compute Network User 角色。

    4. 如需授予权限,请在子网级权限窗格中点击添加主账号

    如果网络未共享,当您尝试运行作业时,系统会显示以下错误消息:Error: Message: Required 'compute.subnetworks.get' permission。如需了解详情,请参阅“排查 Dataflow 权限问题”中的所需的“compute.subnetworks.get”权限

网络和子网规范示例

以下示例展示了指定子网的完整网址:

https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION_NAME/subnetworks/SUBNETWORK_NAME

替换以下内容:

  • HOST_PROJECT_ID:宿主项目 ID
  • REGION_NAME:您的 Dataflow 作业的区域
  • SUBNETWORK_NAME:您的 Compute Engine 子网的名称

以下是一个示例网址,其中宿主项目 ID 为 my-cloud-project,区域为 us-central1,子网名称为 mysubnetwork

 https://www.googleapis.com/compute/v1/projects/my-cloud-project/regions/us-central1/subnetworks/mysubnetwork

以下是指定子网的简写形式示例:

regions/REGION_NAME/subnetworks/SUBNETWORK_NAME

替换以下内容:

  • REGION_NAME:您的 Dataflow 作业的区域
  • SUBNETWORK_NAME:您的 Compute Engine 子网的名称

使用指定的网络运行流水线

如果您要使用 Google Cloud 创建的默认网络以外的网络,则在大多数情况下,您需要指定子网。系统会根据您指定的子网自动推断网络。如需了解详情,请参阅本文档中的指定网络参数的指南

以下示例展示了如何从命令行或使用 REST API 运行流水线。此示例指定了一个网络。

Java

mvn compile exec:java \
    -Dexec.mainClass=INPUT_PATH \
    -Dexec.args="--project=HOST_PROJECT_ID \
        --stagingLocation=gs://STORAGE_BUCKET/staging/ \
        --output=gs://STORAGE_BUCKET/output \
        --region=REGION \
        --runner=DataflowRunner \
        --network=NETWORK_NAME"

Python

python -m INPUT_PATH \
    --project HOST_PROJECT_ID \
    --region=REGION \
    --runner DataflowRunner \
    --staging_location gs://STORAGE_BUCKET/staging \
    --temp_location gs://STORAGE_BUCKET/temp \
    --output gs://STORAGE_BUCKET/output \
    --network NETWORK_NAME

Go

wordcount
    --project HOST_PROJECT_ID \
    --region HOST_GCP_REGION \
    --runner dataflow \
    --staging_location gs://STORAGE_BUCKET/staging \
    --temp_location gs://STORAGE_BUCKET/temp \
    --input INPUT_PATH \
    --output gs://STORAGE_BUCKET/output \
    --network NETWORK_NAME

API

如果您使用 REST API 运行 Dataflow 模板,请将 network 和/或 subnetwork 添加到 environment 对象。

POST https://dataflow.googleapis.com/v1b3/projects/[YOUR_PROJECT_ID]/templates:launch?gcsPath=gs://dataflow-templates/wordcount/template_file
{
    "jobName": "JOB_NAME",
    "parameters": {
       "inputFile" : "INPUT_PATH",
       "output": "gs://STORAGE_BUCKET/output"
    },
    "environment": {
       "tempLocation": "gs://STORAGE_BUCKET/temp",
       "network": "NETWORK_NAME",
       "zone": "us-central1-f"
    }
}

请替换以下内容:

  • JOB_NAME:您的 Dataflow 作业的名称(仅限 API)
  • INPUT_PATH:来源的路径
  • HOST_PROJECT_ID:宿主项目 ID
  • REGIONDataflow 区域,例如 us-central1
  • STORAGE_BUCKET:存储桶
  • NETWORK_NAME:您的 Compute Engine 网络的名称

使用指定的子网运行流水线

如果您是服务项目管理员并且仅有权使用共享 VPC 网络中的特定子网,则必须使用您有权使用的子网指定 subnetwork 参数。

以下示例展示了如何从命令行或使用 REST API 运行流水线。该示例指定了子网。您还可以指定网络。

Java

mvn compile exec:java \
    -Dexec.mainClass=INPUT_PATH \
    -Dexec.args="--project=HOST_PROJECT_ID \
        --stagingLocation=gs://STORAGE_BUCKET/staging/ \
        --output=gs://STORAGE_BUCKET/output \
        --region=REGION \
        --runner=DataflowRunner \
        --subnetwork=https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME"

Python

python -m INPUT_PATH \
    --project HOST_PROJECT_ID \
    --region=REGION \
    --runner DataflowRunner \
    --staging_location gs://STORAGE_BUCKET/staging \
    --temp_location gs://STORAGE_BUCKET/temp \
    --output gs://STORAGE_BUCKET/output \
    --subnetwork https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME

Go

wordcount
    --project HOST_PROJECT_ID \
    --region HOST_GCP_REGION \
    --runner dataflow \
    --staging_location gs://STORAGE_BUCKET/staging \
    --temp_location gs://STORAGE_BUCKET/temp \
    --input INPUT_PATH \
    --output gs://STORAGE_BUCKET/output \
    --subnetwork https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME

API

如果您使用 REST API 运行 Dataflow 模板,请将 network 和/或 subnetwork 添加到 environment对象。

POST https://dataflow.googleapis.com/v1b3/projects/[YOUR_PROJECT_ID]/templates:launch?gcsPath=gs://dataflow-templates/wordcount/template_file
{
    "jobName": "JOB_NAME",
    "parameters": {
       "inputFile" : "INPUT_PATH",
       "output": "gs://STORAGE_BUCKET/output"
    },
    "environment": {
       "tempLocation": "gs://STORAGE_BUCKET/temp",
       "subnetwork": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNETWORK_NAME",
       "zone": "us-central1-f"
    }
}

替换以下内容:

  • JOB_NAME:您的 Dataflow 作业的名称(仅限 API)
  • INPUT_PATH:来源的路径
  • HOST_PROJECT_ID:宿主项目 ID
  • REGIONDataflow 区域,例如 us-central1
  • STORAGE_BUCKET:存储桶
  • SUBNETWORK_NAME:您的 Compute Engine 子网的名称

关闭外部 IP 地址

如需关闭外部 IP 地址,请参阅配置互联网访问权限和防火墙规则