配置互联网访问权限和防火墙规则

本文档介绍如何配置 Dataflow 虚拟机实例进行互联网访问、如何创建网络标记,以及如何为与 Dataflow 作业关联的网络定义防火墙规则。

本文档假定您具备 Google Cloud 网络的基本知识。如需为 Dataflow 作业定义网络,请参阅指定网络和子网。如需详细了解如何排查网络问题,请参阅排查 Dataflow 网络问题

Dataflow 的互联网访问权限

Dataflow 工作器虚拟机 (VM) 必须能够访问 Google Cloud API 和服务。根据您的使用场景,您的虚拟机可能还需要访问 Google Cloud 外部的资源。使用以下任一方法为 Dataflow 配置互联网访问权限:

  • 工作器虚拟机配置外部 IP 地址,使其满足互联网访问要求

  • 配置专用 Google 访问通道。 专用 Google 访问通道可让仅具有内部 IP 地址的虚拟机访问 Google Cloud 和服务的 IP 地址。

  • 配置 Private Service Connect 端点 IP 地址以访问 Google Cloud API 和服务。

  • 配置 NAT 解决方案,例如 Cloud NAT。此选项用于运行访问 Google Cloud 外部需要访问互联网的 API 和服务的作业。例如,Python SDK 作业可能需要访问 Python Package Index (PyPI) 才能下载流水线依赖项。在这种情况下,您必须为工作器虚拟机配置外部 IP 地址,或者必须使用 Cloud NAT。您还可以在作业提交期间提供 Python 流水线依赖项。例如,您可以使用自定义容器来提供 Python 流水线依赖项,这样就无需在运行时访问 PyPI。

    如需了解详情,请参阅 Apache Beam 文档中的管理 Python 流水线依赖项

关闭外部 IP 地址

默认情况下,Dataflow 服务会为工作器分配外部和内部 IP 地址。关闭公共 IP 地址后,Dataflow 流水线只能访问以下位置的资源:

如果没有外部 IP 地址,您仍可以执行管理和监控任务。您可以通过上面列出的选项使用 SSH 访问您的工作器。但是,流水线无法访问互联网,并且互联网主机无法访问您的 Dataflow 工作器。

不使用外部 IP 地址有助于更好地保护数据处理基础架构。此外,您还可以减少 Google Cloud 项目配额中使用的外部 IP 地址数量。

如果您关闭外部 IP 地址,则 Dataflow 作业将无法访问 Google Cloud 外部需要互联网访问权限的 API 和服务。

如需了解如何为具有内部 IP 地址的作业设置互联网访问权限,请参阅上一部分。

如需关闭外部 IP 地址,请执行以下操作之一:

Java

  1. 为您的网络或子网启用专用 Google 访问通道
  2. 在 Dataflow 作业的参数中,指定 --usePublicIps=false--network=NETWORK-NAME--subnetwork=SUBNETWORK-NAME

    根据您的选择,替换以下项之一:

    • NETWORK-NAME:您的 Compute Engine 网络的名称
    • SUBNETWORK-NAME:您的 Compute Engine 子网的名称

Python

  1. 如需暂存所有 Python 软件包依赖项,请按照 Apache Beam 流水线依赖项说明进行操作。
  2. 为您的网络或子网启用专用 Google 访问通道
  3. 在 Dataflow 作业的参数中,指定 --no_use_public_ips--network=NETWORK--subnetwork=SUBNETWORK
  4. 根据您的选择,替换以下项之一:

    • NETWORK-NAME:您的 Compute Engine 网络的名称
    • SUBNETWORK-NAME:您的 Compute Engine 子网的名称

Go

  1. 为您的网络或子网启用专用 Google 访问通道
  2. 在 Dataflow 作业的参数中,指定 --no_use_public_ips--network=NETWORK--subnetwork=SUBNETWORK
  3. 根据您的选择,替换以下项之一:

    • NETWORK-NAME:您的 Compute Engine 网络的名称
    • SUBNETWORK-NAME:您的 Compute Engine 子网的名称

Dataflow 的网络标记

网络标记是您可以关联到 Compute Engine 虚拟机的文本特性。借助网络标记,您可以将 VPC 网络防火墙规则和某些自定义静态路由应用于特定虚拟机实例。Dataflow 支持将网络标记添加到运行特定 Dataflow 作业的所有工作器虚拟机。

即使您不使用网络参数,Dataflow 也始终会将默认网络标记 dataflow 添加到其创建的每个工作器虚拟机。

启用网络标记

只有在运行 Dataflow 作业模板来创建作业时,才能指定网络标记。作业启动后,您无法向作业添加更多网络标记。如需将其他网络标记应用于作业,必须使用所需的网络标记重新创建作业模板。

无论您使用 Java 还是 Python 运行,都请将以下命令添加到流水线代码中:

--experiments=use_network_tags=TAG-NAME

TAG-NAME 替换为您的标记名称。 如果您添加多个标记,请用英文分号 ; 分隔每个标记,格式如下所示:TAG-NAME-1;TAG-NAME-2;TAG-NAME-3;...

即使您不使用此参数,Dataflow 也始终在其所创建的每个工作器虚拟机中添加网络标记 dataflow

为 Flex 模板虚拟机启用网络标记

使用 Flex 模板时,如需为 Dataflow 工作器虚拟机启用网络标记,请使用 --additional-experiments 选项,如以下示例所示:

--additional-experiments=use_network_tags=TAG-NAME

如需同时为工作器虚拟机和启动器虚拟机启用网络标记,您需要使用以下两个选项:

--additional-experiments=use_network_tags=TAG-NAME
--additional-experiments=use_network_tags_for_flex_templates=TAG-NAME

TAG-NAME 替换为您的标记名称。 如果您添加多个标记,请用英文分号 ; 分隔每个标记,格式如下所示:TAG-NAME-1;TAG-NAME-2;TAG-NAME-3;...

启用网络标记后,系统会解析这些标记并将其附加到虚拟机。

请参阅适用于网络标记的限制

Dataflow 的防火墙规则

防火墙规则可让您允许或拒绝传入和传出虚拟机的流量。 如果您的 Dataflow 作业使用 Dataflow ShuffleStreaming Engine,则无需配置任何防火墙规则。否则,您必须配置防火墙规则,以便 Dataflow 虚拟机可以在 TCP 端口 12345(适用于流处理作业)和 TCP 端口 12346(适用于批量作业)上发送和接收网络流量。 项目所有者、编辑者或安全管理员必须在 Dataflow 虚拟机使用的 VPC 网络中创建必要的防火墙规则。

在为 Dataflow 配置防火墙规则之前,请先参阅以下文档:

为 Dataflow 创建防火墙规则时,请指定 Dataflow 网络标记。否则,防火墙规则适用于 VPC 网络中的所有虚拟机。

如果适用,分层防火墙政策会先进行评估,并且这些规则会抢占 VPC 防火墙规则。如果 Dataflow 作业属于在其中使用分层防火墙政策的文件夹或组织中的项目,则需要 compute.orgFirewallPolicyAdmin 角色才能修改政策。

如果您在运行流水线代码时未创建自定义网络标记,则 Dataflow 虚拟机会使用默认 dataflow 标记。如果没有自定义网络标记,请使用默认 dataflow 标记创建防火墙规则。

如果您在运行流水线代码时创建了自定义网络标记,则 Dataflow 虚拟机会使用这些标记。使用自定义标记创建防火墙规则。

某些 VPC 网络(例如自动创建的 default 网络)包含符合 Dataflow 防火墙要求的 default-allow-internal 规则。

防火墙入站规则示例

入站防火墙规则允许 Dataflow 虚拟机相互接收数据包。您必须始终创建入站允许防火墙规则,或者始终禁止流量,即使出站规则允许此类流量也是如此。

在以下示例中,系统会为 Dataflow 创建防火墙入站规则,其中所有工作器虚拟机都具有默认网络标记 dataflow。项目所有者、编辑者或安全管理员可以使用以下 gcloud 命令来创建入站允许规则,以允许 TCP 端口 1234512346 上具有网络标记 dataflow 的虚拟机到具有相同标记的其他虚拟机的流量:

gcloud compute firewall-rules create FIREWALL_RULE_NAME_INGRESS \
    --action=allow \
    --direction=ingress \
    --network=NETWORK  \
    --target-tags=CUSTOM_TAG \
    --source-tags=CUSTOM_TAG \
    --priority=PRIORITY_NUM \
    --rules tcp:12345-12346

替换以下内容:

  • FIREWALL_RULE_NAME_INGRESS:防火墙规则的名称。

  • NETWORK:工作器虚拟机使用的网络的名称

  • CUSTOM_TAG:以英文逗号分隔的网络标记列表

    下表列出了网络标记使用准则:

    • 如果省略 --target-tags,则规则将应用于 VPC 网络中的所有虚拟机。

    • 如果省略 --source-tags 以及其他所有来源规范,则允许来自任何来源的流量。

    • 如果您未指定自定义网络标记,并且您希望规则特定于 Dataflow 虚拟机,请使用 dataflow 作为网络标记。

    • 如果您已指定自定义网络标记,并且您希望规则特定于 Dataflow 虚拟机,请使用自定义网络标记。

  • PRIORITY_NUM:防火墙规则的优先级

    这个数字越小,优先级就越高,0 表示最高优先级。

防火墙出站规则示例

出站防火墙规则允许 Dataflow 虚拟机相互发送数据包。如果您已创建任何出站拒绝防火墙规则,则可能需要在 VPC 网络中创建自定义出站允许防火墙规则。

在此示例中,系统会为 Dataflow 创建防火墙出站规则,其中所有工作器虚拟机都具有默认网络标记 dataflow。项目所有者、编辑者或安全管理员可以使用以下 gcloud 命令来创建出站允许规则,以允许 TCP 端口 1234512346 上具有网络标记 dataflow 的虚拟机到具有相同标记的其他虚拟机的流量:

gcloud compute firewall-rules create FIREWALL_RULE_NAME_EGRESS \
    --network=NETWORK \
    --action=allow \
    --direction=egress \
    --target-tags=CUSTOM_TAG \
    --source-tags=CUSTOM_TAG \
    --destination-ranges=DESTINATION-RANGES\
    --priority=PRIORITY_NUM  \
    --rules tcp:12345-12346

替换以下内容:

  • FIREWALL_RULE_NAME_EGRESS:防火墙规则的名称。

  • NETWORK:工作器虚拟机使用的网络的名称

  • CUSTOM_TAG:以英文逗号分隔的网络标记列表

    下表列出了网络标记使用准则:

    • 如果省略 --target-tags,则规则将应用于 VPC 网络中的所有虚拟机。

    • 如果省略 --source-tags 以及其他所有来源规范,则允许来自任何来源的流量。

    • 如果您未指定自定义网络标记,并且您希望规则特定于 Dataflow 虚拟机,请使用 dataflow 作为网络标记。

    • 如果您已指定自定义网络标记,并且您希望规则特定于 Dataflow 虚拟机,请使用自定义网络标记。

  • DESTINATION-RANGES:以英文逗号分隔的 CIDR 列表

    包括所选子网的主要 IP 地址范围。

  • PRIORITY_NUM:防火墙规则的优先级

    这个数字越小,优先级就越高,0 表示最高优先级。

对于 Dataflow 使用的特定 TCP 端口,您可以查看项目容器清单。该容器清单会明确指定端口,以便将主机端口映射到容器。

通过 SSH 访问工作器虚拟机

Dataflow 不要求使用 SSH;但是,SSH 在排查问题时会相当实用。

如果工作器虚拟机具有外部 IP 地址,则您可以通过 Google Cloud 控制台或使用 Google Cloud CLI 连接到虚拟机。要使用 SSH 进行连接,您必须具有相应的防火墙规则,该规则至少要允许 TCP 端口 22 上来自以下 IP 地址的传入连接:运行 gcloud 的系统或运行用于访问 Google Cloud 控制台的网络浏览器的系统的 IP 地址。

您可以通过在一个工作器上打开 SSH 会话,并运行 iproute2 来查看网络配置和活动。如需了解详情,请参阅 iproute2 页面

如果您需要连接到仅具有内部 IP 地址的工作器虚拟机,请参阅为内部专用的虚拟机选择连接选项

后续步骤