Dataproc 集群网络配置

概览

Dataproc 集群中的 Compute Engine 虚拟机实例(包含主实例和工作器虚拟机)必须能够使用 ICMP、TCP(所有端口)和 UDP(所有端口)相互通信。

防火墙规则要求

Dataproc 要求您创建具有以下特征的入站允许防火墙规则:

  • 来源参数将 IP 地址范围指定为数据包的来源。在 Dataproc 中,集群中的所有虚拟机都必须能够相互通信。您可以通过挂接到虚拟机的 VPC 网络、来源标记或服务帐号来识别集群中的虚拟机。如果您省略来源 IP 范围规范,防火墙规则将使用 0.0.0.0/0 范围(任何 IP 地址)作为来源。如果您的 Dataproc 虚拟机具有外部 IP 地址,这意味着它们可以接受来自互联网任何地方的流量。因此,您应尽可能缩小来源的范围,以满足您的需求并保护您的集群。

  • 规则的目标必须标识集群的虚拟机。 目标可以是 VPC 网络中的所有虚拟机,或者,您也可以使用目标标记或目标服务帐号来标识特定的目标虚拟机。

  • 规则必须包含以下协议和端口:TCP(所有端口、0 到 65535)、UDP(所有端口、0 到 65535)和 ICMP。Dataproc 使用在多个端口上运行的服务,并且指定所有端口将有助于服务成功运行。

默认 Dataproc 防火墙规则概览

Dataproc 使用默认的 VPC 网络。如果未指定默认 VPC 网络,则需要创建自定义 VPC。如需创建自定义 VPC 网络,您可以在自动模式或自定义模式下创建 VPC 网络

如果您使用默认网络,它包括一个预填充的 default-allow-internal 防火墙规则,其允许来 VPC 网络上所有虚拟机中的 10.128.0.0/9 来源范围的入站流量(如需了解有关如何创建限制性更强的防火墙规则的信息,请参阅防火墙规则要求)。如果您删除这条预填充的防火墙规则或使用除默认网络之外的 VPC 网络,则隐式拒绝入站规则会禁止入站流量。在这些情况下,您必须创建一个入站允许防火墙规则,允许将流量传输到集群中实例的所有 TCP 和 UDP 端口。如需了解详情,您的网络或安全管理员可以参阅防火墙规则概览

诊断 Dataproc 防火墙规则

如需审核未由优先级较高的防火墙规则处理的数据包,您可以创建两条低优先级 (65534) 的拒绝防火墙规则。与隐式防火墙规则不同,您可以为以下每条低优先级规则启用防火墙规则日志记录

  1. 入站拒绝规则(来源 0.0.0.0/0、所有协议以及 VPC 网络中的所有目标)

  2. 出站拒绝规则(目的地为 0.0.0.0/0,所有协议,VPC 网络中的所有目标)

借助这些低优先级规则和防火墙规则日志记录,您可以记录未由更高优先级(可能更具体)的防火墙规则处理的数据包。这两个低优先级规则还通过实现“最终丢弃数据包”策略来遵循安全性最佳做法。

您可以检查这些规则的防火墙规则日志,以确定是否需要创建或修改更高优先级的规则以允许数据包。例如,如果 Dataproc 集群实例之间发送的数据包被丢弃,这可能表示需要配置您的 Dataproc 防火墙规则

创建自定义 VPC 网络

您可以在创建 Dataproc 集群时指定自己的 Virtual Private Cloud (VPC) 网络。要实现此目的,您必须首先创建一个使用防火墙规则的 VPC 网络。然后,当您创建集群时,将您的网络与集群进行关联。

创建 VPC 网络

您可以通过 Cloud Console 或使用 gcloud compute networks create 命令行工具命令创建 VPC 网络。您可以创建自动模式 VPC 网络或自定义模式 VPC 网络(下文中分别称为“自动”和“自定义”网络)。在每个 Compute Engine 区域中,系统会自动为自动网络配置子网,但不会自动为自定义网络配置子网;在创建自定义网络时,您必须在一个或多个 Compute Engine 区域中创建一个或多个子网。如需了解详情,请参阅 VPC 网络类型

下面让我们来看看您通过 Cloud Console 创建自动和自定义网络时可用的选项。

自动

下面的 Cloud Console 屏幕截图显示的是为了自动创建子网(自动模式 VPC 网络)而填充的 Cloud Console 字段)。您必须选择一个或多个防火墙规则。您应该选择打开 udp:0-65535;tcp:0-65535;icmp 端口的 network-name-allow-internal 规则,以便在网络中的虚拟机实例之间启用完整的内部 IP 网络访问权限。您还可以选择 network-name-allow-ssh 规则来打开标准 SSH 端口 22,以允许通过 SSH 连接到网络:

自定义

如果在创建网络(自定义模式 VPC 网络)时选择自定义子网,您必须为每个子网指定区域和专用 IP 地址范围。要在网络中的虚拟机之间启用完整的内部访问权限,您可以指定以下 IP 地址范围:10.0.0.0/8(在适当的情况下,您还可以指定限制性更高的范围,例如 10.128.0.0/16)。

请注意,在创建网络为自定义子网提供防火墙规则。同样地,如需在网络中的虚拟机之间启用完整的网络访问权限,请选择或创建打开 udp:0-65535;tcp:0-65535;icmp 端口的防火墙规则(如下面的 Cloud Console 屏幕截图所示)。

创建使用您的 VPC 网络的集群

gcloud 命令

您可以搭配 ‑‑network‑‑subnet 标志使用 Cloud SDK gcloud dataproc clusters create 命令来创建将使用自动子网或自定义子网的集群。

使用 ‑‑network 标志
您可以使用 ‑‑network 标志来创建一个集群,该集群使用的子网与要创建集群的区域中的网络同名。

gcloud dataproc clusters create my-cluster \
    --network network-name \
    --region=region \
    ... other args ...

例如,由于创建的自动网络在每个区域中具有与该自动网络同名的子网,因此,您可以将自动网络名称传递给 ‑‑network 标志 (‑‑network auto-net-name) 以创建一个集群,该集群将使用集群区域中的自动子网。

使用 ‑‑subnet 标志
您可以使用 ‑‑subnet 标志来创建一个集群,该集群将使用要创建集群的区域中的自动或自定义子网。您必须向 ‑‑subnet 标志传递集群将使用的子网的完整资源路径。

gcloud dataproc clusters create cluster-name \
    --subnet projects/project-id/regions/region/subnetworks/subnetwork-name \
    --region=region \
    ... other args ...

REST API

您可以将 networkUri 或 subnetworkUri GceClusterConfig 字段指定为 clusters.create 请求的一部分。

示例

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "custom-subnet-1",
      "zoneUri": "us-central1-b"
    },
    ...

控制台

在创建 VPC 网络(该网络使用的防火墙规则允许虚拟机通过网络的专用 IP 地址范围获得完整访问权限)之后,您可以从 Cloud Console 的 Dataproc 创建集群 页面创建集群。在“自定义集群”面板的“网络配置”部分中选择您的主要网络。选择网络后,子网选择器将显示您为了创建集群而选择的区域中可用的子网。

创建使用另一个项目中的 VPC 网络的集群

Dataproc 集群可以作为服务项目加入,从而使用共享 VPC 网络。使用共享 VPC 时,共享 VPC 网络是在另一个项目中定义的,此项目被称为宿主项目。主项目可供附加的服务项目中的 IAM 成员使用。如需了解背景信息,请参阅共享 VPC 概览

您将在一个项目中创建 Dataproc 集群。在共享 VPC 场景中,该项目将作为服务项目。您需要参考该项目的项目编号。您可以通过以下方法查找项目编号:

  1. 导航到“IAM 和管理”页面上的“设置”标签页

  2. 从页面顶部的项目下拉列表中,选择要用于创建 Dataproc 集群的项目。

  3. 记下项目编号。

作为共享 VPC 管理员和 IAM 的 IAM 成员必须执行以下步骤。如需了解背景信息,请参阅关于设置共享 VPC 的说明

  1. 请确保已启用 共享 VPC 宿主项目。

  2. 将 Dataproc 项目附加到宿主项目。

  3. 对以下任一服务帐号进行配置(或同时配置这两个帐号),使其拥有宿主项目的网络用户角色。Cloud Dataproc 会尝试使用第一个服务帐号(必要时,会回退到 Google API 服务帐号)。

    • service-[project-number]@dataproc-accounts.iam.gserviceaccount.com
    • Google API 服务帐号[project-number]@cloudservices.gserviceaccount.com
  4. 导航到“IAM 和管理”页面上的 IAM 标签页

  5. 使用页面顶部的项目下拉列表选择宿主项目。

  6. 点击添加。重复以下步骤以同时添加两个服务帐号:

    1. 将服务帐号添加到成员字段。

    2. 从“角色”菜单中选择 Compute Engine > 计算网络用户

    3. 点击添加

两个服务帐号都具有宿主项目的“网络用户”角色后,您可以创建一个使用您的 VPC 网络的集群

创建仅使用内部 IP 地址的 Dataproc 集群

您可以创建与公共互联网隔离的 Cloud Dataproc 集群,该集群的虚拟机实例通过专用 IP 子网进行通信(这些虚拟机实例不具有公共 IP 地址)。为了实现此目的,集群的子网必须启用专用 Google 访问通道,这样集群节点才能通过内部 IP 访问 Google API 和服务,例如 Cloud Storage

gcloud 命令

您可以使用带有 ‑‑no-address 标志的 gcloud dataproc clusters create 命令,创建仅使用内部 IP 地址的 Dataproc 集群。

使用 ‑‑no-address 和 ‑‑network 标志
使用 ‑‑no-address 标志和 ‑‑network 标志来创建一个集群,该集群使用的子网与要创建集群的区域中的网络同名。

gcloud dataproc clusters create my-cluster \
    --no-address \
    --network network-name \
    --region=region \
    ... other args ...

例如,由于创建的自动网络在每个区域中具有与该自动网络同名的子网,因此,您可以将自动网络名称传递给 ‑‑network 标志 (‑‑network auto-net-name) 以创建一个集群,该集群将使用集群区域中的自动子网。

使用 ‑‑no-address 和 ‑‑subnet 标志
使用 ‑‑no-address 标志和 ‑‑subnet 标志来创建一个集群,该集群将使用要创建集群的区域中的自动或自定义子网。您必须向 ‑‑subnet 标志传递集群将使用的子网的完整资源路径。

gcloud dataproc clusters create cluster-name \
    --no-address \
    --subnet projects/project-id/regions/region/subnetworks/subnetwork-name \
    --region=region \
    ... other args ...

REST API

您可以在 clusters.create请求中将 GceClusterConfig internalIpOnly 字段设置为“true”,以仅启用内部 IP 地址。

示例

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "custom-subnet-1",
      "zoneUri": "us-central1-b",
      "internalIpOnly": true
    },
    ...

控制台

您可以通过 Cloud Console 中 Dataproc 创建集群页面创建启用了专用 Google 访问通道的 Dataproc 集群。点击“自定义集群”面板上的“内部 IP”,为您的集群启用此功能。

由于默认情况下仅限内部 IP 的集群无法访问互联网,因此从互联网下载依赖项的作业(例如从 Maven Central 下载 Spark 依赖项软件包)将失败。可通过多种解决方法避免此问题:

  1. 使用 Cloud NAT 启用对互联网的集群访问权限。

  2. 创建包含依赖项(例如 /usr/lib/spark/jars/ 中的 Spark 依赖项软件包)的自定义映像

  3. 将依赖项上传到 Cloud Storage 存储分区,然后使用初始化操作在创建集群期间从存储分区下载依赖项。

Dataproc 和 VPC-SC 网络

借助 VPC Service Controls,管理员可以为 Google 托管式服务的资源定义安全边界,以控制与这些服务的通信以及这些服务之间的通信。

请注意,当 VPC-SC 网络与 Dataproc 集群搭配使用时,存在以下限制和策略: