本文档介绍了如何完成以下任务:
- 配置 Dataflow 虚拟机 (VM) 实例进行互联网访问
- 使用标记来保护工作器虚拟机网络。
- 为与 Dataflow 作业关联的网络定义防火墙规则
本文档假定您具备 Google Cloud 网络的基本知识。如需为 Dataflow 作业定义网络,请参阅指定网络和子网。 如需详细了解如何排查网络问题,请参阅排查 Dataflow 网络问题。
访问用于 Dataflow 的 Google Cloud API
Dataflow 工作器虚拟机 (VM) 必须能够访问Google Cloud API 和服务。依赖的 Google Cloud 端点集可能会随时间而变化,但都支持 VPC Service Controls。使用以下方法之一配置对 Google Cloud API 的访问权限:
配置专用 Google 访问通道。专用 Google 访问通道可让仅具有内部 IP 地址的虚拟机访问 Google Cloud 和服务的 IP 地址。
配置 Private Service Connect 端点 IP 地址以访问 Google Cloud API 和服务。
使用外部 IP 地址配置工作器虚拟机。
默认情况下,防火墙规则和 DNS 配置允许访问Google Cloud API。不过,您可能会主动限制对部分 Google Cloud API 的访问,例如,如果您使用的是 VPC Service Controls。
在这种情况下,至少要提供对 restricted.googleapis.com
的访问权限。如果您使用的是 Private Service Connect,请提供对 vpc-sc
软件包的访问权限。提供对更宽松的网域(例如 private.googleapis.com
)的访问权限,也可以提供所需的功能。
如需允许通过给定网域访问必要的 Google Cloud API,您的环境必须满足以下要求:
防火墙规则必须允许所选网域下所有地址范围的出站流量。
DNS 必须将
*.googleapis.com
解析为您选择的网域。
例如,如果您的防火墙规则将出站流量限制在 restricted.googleapis.com
地址范围内,则 *.googleapis.com
必须解析为该范围内的地址。
如需了解详情,请参阅为 googleapis.com 配置 DNS。
同样,如果您使用的是 Private Service Connect,则必须为 googleapis.com
默认网域创建 DNS 记录,以确保至少可以访问 vpc-sc
软件包中的所有服务。
Dataflow 的互联网访问权限
根据您的应用场景,您的虚拟机可能还需要访问Google Cloud外部的资源。使用以下方法之一为 Dataflow 配置互联网访问权限:
配置 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 作业只能访问以下位置中的资源:
- 同一 VPC 网络中的另一个实例
- 共享 VPC 网络
- 启用了 VPC 网络对等互连的网络
如果没有外部 IP 地址,您仍可以执行管理和监控任务。您可以通过上面列出的选项使用 SSH 访问您的工作器。但是,流水线无法访问互联网,并且互联网主机无法访问您的 Dataflow 工作器。
不使用外部 IP 地址有助于更好地保护数据处理基础架构。您还可以减少 Google Cloud项目配额中消耗的外部 IP 地址数量。
如果您关闭外部 IP 地址,则 Dataflow 作业将无法访问 Google Cloud 外部需要互联网访问权限的 API 和服务。
如需关闭外部 IP 地址,请执行以下操作之一:
Java
- 为您的网络或子网启用专用 Google 访问通道。
- 在 Dataflow 作业的参数中,指定
--usePublicIps=false
和--network=NETWORK-NAME
或--subnetwork=SUBNETWORK-NAME
。根据您的选择,替换以下项之一:
- NETWORK-NAME:您的 Compute Engine 网络的名称
- SUBNETWORK-NAME:您的 Compute Engine 子网的名称
Python
- 如需暂存所有 Python 软件包依赖项,请按照 Apache Beam 流水线依赖项说明进行操作。
- 为您的网络或子网启用专用 Google 访问通道。
-
在 Dataflow 作业的参数中,指定
--no_use_public_ips
和--network=NETWORK
或--subnetwork=SUBNETWORK
。根据您的选择,替换以下项之一:
- NETWORK-NAME:您的 Compute Engine 网络的名称
- SUBNETWORK-NAME:您的 Compute Engine 子网的名称
Go
- 为您的网络或子网启用专用 Google 访问通道。
-
在 Dataflow 作业的参数中,指定
--no_use_public_ips
和--network=NETWORK
或--subnetwork=SUBNETWORK
。根据您的选择,替换以下项之一:
- NETWORK-NAME:您的 Compute Engine 网络的名称
- SUBNETWORK-NAME:您的 Compute Engine 子网的名称
使用标记来保护工作器虚拟机网络
借助标记,您可以将网络防火墙规则应用于特定虚拟机实例。运行 Dataflow 作业时,您可以为执行该作业的 Dataflow 工作器虚拟机指定标记。适用于这些标记的任何防火墙规则随后都会应用于 Dataflow 工作器虚拟机。
Dataflow 支持将两种类型的标记用于虚拟机网络:
将安全标记与 Dataflow 搭配使用
安全标记也称为由 Identity and Access Management (IAM) 治理的标记,是您在 Resource Manager 中创建和管理的键值对。与网络标记不同,安全标记支持使用 IAM 进行访问权限控制。
使用安全标记(而非网络标记)的优势包括:
安全标记可防止未经授权的标记修改,以及由此导致的防火墙规则意外更改。
全球和区域级网络防火墙政策支持安全标记。通过使用安全标记,您可以对多个防火墙规则进行分组并同时更新这些规则,更新由 IAM 访问权限控制管理。
安全标记继承自 Google Cloud 层次结构中的父级资源,这使您可以在更高级别(例如组织级)定义标记。如需了解详情,请参阅标记继承。
借助安全标记,入站流量防火墙规则可以包含使用 VPC 网络对等互连连接的 VPC 网络中的来源。对于 Dataflow 作业,这意味着防火墙规则可以包含工作器虚拟机网络和对等互连 VPC 网络中的来源。
如需详细了解安全标记和网络标记之间的区别,请参阅标记和网络标记对比。
如需将安全标记应用于 Dataflow 作业,请执行以下步骤:
为防火墙政策配置安全标记。如需了解详情,请参阅配置安全标记。
针对资源(标记值),向 Dataflow 服务账号授予 Tag User 角色 (
roles/resourcemanager.tagUser
)。如需详细了解所需的权限,请参阅管理资源上的标记。创建 Dataflow 作业时,请使用以下格式的
use_vm_tags
实验:
Java
--experiments=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2
Python
--experiments=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2
Flex 模板
--additional-experiments=use_vm_tags=tagKeys/KEY1:tagValues/VALUE1;tagKeys/KEY2:tagValues/VALUE2
将网络标记与 Dataflow 搭配使用
网络标记是您可以针对防火墙规则设置并关联到 Compute Engine 虚拟机的文本属性。与安全标记不同,网络标记是文本字符串,而不是由 Resource Manager 管理的资源。
如需将网络标记应用于 Dataflow 作业,请使用 use_network_tags
实验,如下所示:
Java
--experiments=use_network_tags=TAG_NAME
Python
--experiments=use_network_tags=TAG_NAME
Flex 模板
如需为 Dataflow 工作器虚拟机启用网络标记,请使用 use_network_tags
实验:
--additional-experiments=use_network_tags=TAG_NAME
如需为 Flex 模板启动器虚拟机启用网络标记,请使用 use_network_tags_for_flex_templates
实验:
--additional-experiments=use_network_tags_for_flex_templates=TAG_NAME
指定网络标记还会将默认网络标记 Dataflow
添加到 Flex 模板启动器虚拟机。
将 TAG_NAME 替换为您的标记名称。如果您添加多个标记,请用英文分号 (;
) 分隔每个标记,如下所示:TAG_NAME_1;TAG_NAME_2;TAG_NAME_3;...
。
作业启动后,您无法向作业添加更多网络标记。
Dataflow 始终会将默认网络标记 dataflow
添加到其创建的每个工作器虚拟机。
请参阅适用于网络标记的限制。
Dataflow 的防火墙规则
防火墙规则可让您允许或拒绝传入和传出虚拟机的流量。如果您的 Dataflow 作业使用 Dataflow Shuffle 或 Streaming Engine,则只需确保防火墙规则允许访问 Google Cloud API。否则,您必须配置额外防火墙规则,以便 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 端口 12345
和 12346
上具有网络标记 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 端口 12345
和 12346
上具有网络标记 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 控制台的网络浏览器的系统。
您可以通过在一个工作器上打开 SSH 会话,并运行 iproute2
来查看网络配置和活动。如需了解详情,请参阅 Linux Foundation Wiki 中的 iproute2
页面。
如果您需要连接到仅具有内部 IP 地址的工作器虚拟机,请参阅为内部专用的虚拟机选择连接选项。
后续步骤
- 了解 Connectivity Tests。Connectivity Tests 是一个诊断工具,可让您检查网络端点之间的连接。
- 创建和运行 Connectivity Tests 测试。