指定网络和子网

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

本文档要求您了解如何创建 Google Cloud 网络和子网。本文档还要求您熟悉下一部分中介绍的网络术语。

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

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

Google Cloud 网络术语

  • 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 概览。如需了解将 Dataflow 与 VPC Service Controls 结合使用的限制,请参阅支持的产品和限制

Dataflow 作业的网络和子网

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

请考虑以下准则:

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

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

指定网络参数的准则

  • 您可以使用网络参数在项目中选择自动模式 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 角色。

网络和子网规范示例

指定子网的完整网址示例:

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 地址,请参阅配置互联网访问权限和防火墙规则