将环境连接到 VPC 网络

Managed Airflow(第 3 代) | Managed Airflow(第 2 代) | Managed Airflow(旧版第 1 代)

本页面介绍了您的环境如何在 Managed Airflow(第 3 代)中访问 VPC 网络,提供了将环境连接到 VPC 网络的说明,并介绍了如何停用之前配置的连接。

关于 VPC 网络访问权限

在 Managed Airflow(第 3 代)中,您可以为环境启用对 VPC 网络的访问权限。

如果您为环境启用对 VPC 网络的访问权限:

  • 环境的 Airflow 组件可以访问 VPC 网络中的专用网络端点 。例如, 您的 DAG 代码可以通过 配置的 Airflow 连接访问 VPC 网络中的资源。

  • 如果您的环境使用专用 IP 网络所有流量都会路由到您的 VPC 网络,但通过专用 Google 访问通道提供给专用 IP 环境的 Google API、服务和网域的流量除外。此方法还允许您的 Airflow 组件连接到以非公开方式使用的公共 IP (PUPI) (在 GKE 中配置), 因为流量将通过 VPC 网络路由, 而不是发送到公共互联网。

  • 根据您配置 VPC 网络的方式,专用 IP 环境可以通过 VPC 网络访问互联网

  • 在 VPC 网络中定义的专用 DNS 区域会自动提供给环境的 Airflow 组件。

  • 该环境会在 VPC 子网中预留两个 IP 地址,并在维护和升级期间使用两个额外的 IP 地址。请确保您的 VPC 子网中提供每个环境四个 IP 地址

Managed Airflow 使用 网络连接将您的 环境连接到 VPC 网络:

  • 如果您指定 VPC 网络和子网,则 Managed Airflow 会在您的项目中创建一个新的网络连接。在您删除环境、停用与 VPC 网络的连接或覆盖 VPC 连接参数后,此连接会被删除。

  • 如果您指定 现有网络连接, 则该连接必须与环境位于同一项目中。在您删除环境、停用连接或覆盖 VPC 连接参数后,此连接不会被删除。

  • 在共享 VPC 网络中:

    • 确保您已为 Managed Airflow 配置共享 VPC 网络。如需了解如何为 Managed Airflow 配置 项目和权限,请参阅 配置共享 VPC

    • 配置共享 VPC 网络后,您可以将环境连接到宿主项目中的 VPC 网络。如果您使用现有网络连接,则必须在服务项目(环境所在的项目)中创建该连接,并将其连接到共享 VPC 网络。

Managed Airflow(第 3 代)中传递性 DNS 对等互连的限制

传递性 DNS 对等互连的限制以以下方式应用于 Managed Airflow(第 3 代)环境:

  • Cloud DNS 具有一个传递跃点的限制,这意味着总共仅支持两个跃点。
  • 在 Managed Airflow(第 3 代)中,环境的组件在 租户项目中运行,并通过 DNS 对等互连与环境所在的 项目进行通信。传递跃点由租户项目的 DNS 对等互连使用,因此总共只能使用一个跃点。

作为一种解决方法,您可以在环境所在的项目中创建一个 DNS 对等互连区域,以充当快捷方式。如需了解详情,请参阅 Cloud DNS 文档中的 何时改用对等互连

关于环境的内部 IP 范围

Managed Airflow(第 3 代)环境需要多个 IP 地址,供在 租户项目中运行的 组件使用,例如环境的集群和 Cloud SQL 代理。这些 IP 地址 取自 环境的内部 IP 范围

  • 默认内部 IP 范围为 100.64.128.0/20

  • 您可以在创建环境时指定其他内部 IP 范围。此范围必须使用 /20 掩码。

  • 您无法更改现有环境的内部 IP 范围。

内部 IP 范围与 VPC 网络之间的交互方式如下:

  • 内部 IP 范围不得与 Managed Airflow 环境所连接的 VPC 子网冲突。无法启用与内部 IP 范围重叠的 VPC 子网的连接。

  • 如果环境的内部 IP 范围与 VPC 网络范围重叠,则VPC 网络中具有重叠 IP 地址的端点无法从该环境访问

    例如,如果内部范围为 100.64.128.0/20,则对 VPC 网络中 100.64.128.1 端点的任何请求都会失败,因为该请求不会离开租户项目。

  • 内部 IP 范围未预留。您可以为多个环境使用相同的内部 IP 范围,而无需进行任何额外设置,因为不同环境使用的内部 VPC 网络是分开的。

  • 您可以将内部范围 IP 地址用于其他用途,只要环境中的 DAG 和任务不向其发出请求即可。

连接到 VPC 网络

控制台

  1. 在 Google Cloud 控制台中,前往 环境 页面。

    转到“环境”

  2. 在环境列表中,点击您的环境名称。环境详情 页面会打开。

  3. 转到环境配置 标签页。

  4. 网络配置 部分中,找到网络连接 项,然后点击修改

  5. 网络连接 对话框中:

    • 如需创建新的网络连接,请在网络连接 列表中选择创建新的网络连接 。在网络子网 列表中,选择 VPC 网络和子网。

    • 如需使用现有网络连接,请在网络连接 列表中选择一个连接。

  6. 点击保存

gcloud

以下 Google Cloud CLI 实参用于指定 VPC 网络连接参数:

  • --network:VPC 网络 ID。
  • --subnetwork:VPC 子网 ID。
  • --network-attachment:改用现有网络连接。

新网络连接

如需通过新的网络连接将环境连接到 VPC 网络,请运行以下 Google Cloud CLI 命令:

gcloud beta composer environments update ENVIRONMENT_NAME \
  --location LOCATION \
  --network NETWORK_ID \
  --subnetwork SUBNETWORK_ID

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称
  • LOCATION:环境所在的区域
  • NETWORK_ID:VPC 网络 ID
  • SUBNETWORK_ID:VPC 子网 ID

示例:

gcloud beta composer environments update example-environment \
  --location us-central1 \
  --network projects/example-project/global/networks/example-network \
  --subnetwork projects/example-project/regions/us-central1/subnetworks/example-subnetwork

现有网络连接

如需通过新的网络连接将环境连接到 VPC 网络,请运行以下 Google Cloud CLI 命令:

gcloud beta composer environments update ENVIRONMENT_NAME \
  --location LOCATION \
  --network-attachment NETWORK_ATTACHMENT_ID

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称
  • LOCATION:环境所在的区域
  • NETWORK_ATTACHMENT_ID:格式为 projects/{project}/regions/{region}/networkAttachments/{networkAttachment} 的网络连接。

示例:

gcloud beta composer environments update example-environment \
  --location us-central1 \
  --network-attachment projects/example-project/regions/us-central1/networkAttachments/example-network-attachment

API

  1. 创建 environments.patch API 请求。

  2. 在此请求中:

    • 如需创建新的网络连接,请执行以下操作:

      1. updateMask 参数中,指定 config.node_config.network,config.node_config.subnetwork 掩码。

      2. 在请求正文的 networksubnetwork 字段中,指定 VPC 网络和子网 ID。

    • 如需使用现有网络连接,请执行以下操作:

      1. updateMask 参数中,指定 config.node_config.composer_network_attachment 掩码。

      2. 在请求正文中,以 projects/{project}/regions/{region}/networkAttachments/{networkAttachment} 格式为现有网络连接提供值。

示例(新网络连接):

// PATCH https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.node_config.network,config.node_config.subnetwork

"config": {
  "nodeConfig": {
    "network": "projects/example-project/global/networks/example-network",
    "subnetwork": "projects/example-project/regions/us-central1/subnetworks/example-subnetwork"
  }
}

示例(现有网络连接):

// PATCH https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.node_config.composer_network_attachment

"config": {
  "nodeConfig": {
    "composerNetworkAttachment": "projects/example-project/regions/us-central1/networkAttachments/example-network-attachment"
  }
}

Terraform

node_config 块中的以下字段用于指定 VPC 网络连接参数:

  • network:VPC 网络 ID。
  • subnetwork:VPC 子网 ID。
  • composer_network_attachment:改用现有网络连接。

新网络连接

resource "google_composer_environment" "example" {
  provider = google-beta
  name = "ENVIRONMENT_NAME"
  region = "LOCATION"

  config {

    node_config {
      network = NETWORK_ID
      subnetwork = SUBNETWORK_ID
    }

  }
}

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称。
  • LOCATION:环境所在的区域。
  • NETWORK_ID:VPC 网络 ID
  • SUBNETWORK_ID:VPC 子网 ID

示例(新网络连接):

resource "google_composer_environment" "example" {
  provider = google-beta
  name = "example-environment"
  region = "us-central1"

  config {

    node_config {
      network = "projects/example-project/global/networks/example-network"
      subnetwork = "projects/example-project/regions/us-central1/subnetworks/example-subnetwork"
    }

    ... other configuration parameters
  }
}

现有网络连接

因此,该环境将不再使用该连接。为解决此问题,请确保 Terraform 忽略对连接的 producer_accept_lists 参数所做的更改,如下所示:

resource "google_compute_network_attachment" "NETWORK_ATTACHMENT_ID" {
  lifecycle {
    ignore_changes = [producer_accept_lists]
  }
  # ... other configuration parameters
}

然后,为环境指定此连接。您还可以指定未在 Terraform 中管理的连接,请参阅示例。

resource "google_composer_environment" "example" {
  name = "example-environment"
  region = "us-central1"
  config {
    node_config {
      composer_network_attachment = google_compute_network_attachment.NETWORK_ATTACHMENT_ID.id
    }
    # ... other configuration parameters
  }
}

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称。
  • LOCATION:环境所在的区域。
  • NETWORK_ATTACHMENT_ID:网络连接 ID。

示例(现有网络连接):

resource "google_compute_network_attachment" "example" {
  lifecycle {
    ignore_changes = [producer_accept_lists]
  }
  # ... other configuration parameters
}

resource "google_composer_environment" "example" {
  provider = google-beta
  name = "example-environment"
  region = "us-central1"

  config {

    node_config {
      # Attachment is managed in Terraform:

      composer_network_attachment = google_compute_network_attachment.NETWORK_ATTACHMENT_ID.id

      # Attachment is not managed in Terraform:

      # composer_network_attachment = projects/example-project/regions/us-central1/networkAttachments/example-network-attachment
    }
    # ... other configuration parameters
  }
}

停用与 VPC 网络的连接

控制台

  1. 在 Google Cloud 控制台中,前往 环境 页面。

    转到“环境”

  2. 在环境列表中,点击您的环境名称。环境详情 页面会打开。

  3. 转到环境配置 标签页。

  4. 网络配置 部分中,找到网络连接 项,然后点击修改

  5. 网络连接 对话框中,选择 ,然后点击保存

gcloud

--disable-vpc-connectivity 实参会停用环境的 VPC 网络连接:

gcloud beta composer environments update ENVIRONMENT_NAME \
  --location LOCATION \
  --disable-vpc-connectivity

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称
  • LOCATION:环境所在的区域

示例:

gcloud beta composer environments update example-environment \
  --location us-central1 \
  --disable-vpc-connectivity

API

  1. 创建 environments.patch API 请求。

  2. 在此请求中:

    1. updateMask 参数中,指定 config.node_config.network,config.node_config.subnetwork 掩码。

    2. 在请求正文的 networksubnetwork 字段中, 指定空值。

示例:

// PATCH https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.node_config.network,config.node_config.subnetwork

"config": {
  "nodeConfig": {
    "network": "",
    "subnetwork": ""
  }
}

Terraform

无法使用 Terraform 分离 VPC 网络。不过,您可以改为连接其他 VPC 网络,或使用其他工具(例如 Google Cloud CLI)分离网络。

通过网络连接路由 Cloud Run 流量

如果您限制 Cloud Run 服务的入站流量只能流向内部端点,则无法从 Managed Airflow 环境 访问此端点。访问受限,因为 环境的 租户项目 中的 Airflow 工作器与环境不 属于同一 VPC 网络。

作为一种选择,您可以将流量通过网络连接路由到函数的端点,而不是路由到 Google API 的默认路由,从而启用访问权限。

更改后,流向以下两个网域的流量将通过环境的网络连接路由:

  • .run.app
  • .cloudfunctions.net

如果您的应用使用自定义网域,并且您使用的是连接了 VPC 网络的专用 IP 环境,那么默认情况下,流向非 Google 地址的流量已通过环境的网络连接。

以下限制适用于以这种方式配置连接的环境:

如需配置 Cloud Run 的流量路由,请执行以下操作:

gcloud

创建或更新环境时,请使用 --cloud-run-functions-routing 实参:

  • (默认)direct:以与其他 Google API 和服务相同的方式将流量路由到 Cloud Run。
  • via-network-attachment:通过环境的网络连接将流量路由到 Cloud Run。

您可以在同一操作中使用此实参来 连接 VPC 网络

如需通过环境的网络连接启用路由,请在 gcloud CLI 中运行以下命令:

gcloud beta composer environments update ENVIRONMENT_NAME \
  --location LOCATION \
  --cloud-run-functions-routing via-network-attachment

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称
  • LOCATION:环境所在的区域

示例:

gcloud beta composer environments update example-environment \
  --location us-central1 \
  --cloud-run-functions-routing via-network-attachment

API

  1. 创建 environments.patch API 请求。

  2. 在此请求中:

    1. updateMask 参数中,指定 node_config.TrafficRoutingConfig 掩码。

    2. 在请求正文的 cloud_run_functions_routing 字段中,指定必须如何路由到 Cloud Run 的流量:

      • (默认)DIRECT:以与其他 Google API 和服务相同的方式将流量路由到 Cloud Run。
      • VIA_NETWORK_ATTACHMENT:通过环境的网络连接将流量路由到 Cloud Run。

您可以在同一操作中使用此实参来 连接 VPC 网络

示例:

// PATCH https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.node_config.TrafficRoutingConfig

{
  "config": {
    "nodeConfig": {
      "trafficRoutingConfig": {
        "cloudRunFunctionsRouting": "VIA_NETWORK_ATTACHMENT"
      }
    }
  }
}

Terraform

config.node_config.traffic_routing_config 块中的 cloud_run_functions_routing 字段用于确定必须如何路由到 Cloud Run 的流量:

  • (默认)DIRECT:以与其他 Google API 和服务相同的方式将流量路由到 Cloud Run。
  • VIA_NETWORK_ATTACHMENT:通过环境的网络连接将流量路由到 Cloud Run。

如需使用 VIA_NETWORK_ATTACHMENT 选项,请配置以下内容:

  • enable_private_environment 设置为 true,以将环境配置为使用 专用 IP 配置
  • 通过指定 networksubnetwork 字段,或在 composer_network_attachment 字段中指定现有网络连接,来配置 VPC 连接

示例:

resource "google_composer_environment" "example" {
  name   = "..."
  region = "us-central1"
  config {
    node_config {
      network    = "..."
      subnetwork = "..."
      traffic_routing_config {
        cloud_run_functions_routing = "VIA_NETWORK_ATTACHMENT"
      }
    }
    software_config {
      image_version = "composer-3-airflow-2"
    }
    enable_private_environment = true
  }
}

后续步骤