設定私人使用的公開 IP 範圍

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本頁說明如何在私人 IP 環境中使用私人使用的公開 IP 範圍。如要進一步瞭解如何建立私人 IP 環境,請參閱「設定私人 IP 環境」一文。

關於 Cloud Composer 中私人使用的公開 IP 範圍

Google Kubernetes Engine 需要許多 IP 位址來提供資源:每個節點、Pod 和服務都必須有一個不重複的 IP 位址。這可能導致現有的私人 IP 範圍無法容納足夠的 IP 位址。

Cloud Composer 環境可以使用非 RFC 1918 位址空間中的部分 IP 範圍,無須額外設定。

如果您想使用更多 IP 位址,環境可以私下使用特定公開 IP 位址範圍,做為 Pod 和服務的內部子網路 IP 位址範圍。這類範圍稱為私人使用的公開 IP (PUPI) 範圍

您可以私下使用任何公開 IP 位址,但特定受限範圍除外。

事前準備

  • 您只能在建立新環境時指定公用 IP 範圍。您無法變更現有環境的 IP 範圍。

  • 您的環境必須是私人 IP 環境。

  • 您只能使用 gcloud、Terraform 和 REST API 建立含有 PUPI 範圍的環境。

  • 只有 GKE Pod 和服務可以使用公開 IP 範圍。其他環境元件 (例如 Cloud SQL、網頁伺服器和 GKE 控制層) 無法在私人 IP 環境中使用公開 IP 範圍。

  • 建立 GKE 叢集時,預設 SNAT 會停用。

在建立環境時啟用 PUPI 範圍

gcloud

如要建立含有 PUPI 範圍的環境,請在建立私人 IP 環境時使用 --enable-privately-used-public-ips 引數。接著,請為 Pod 和服務指定公開 IP 範圍。

由 GKE 管理的子網路範圍

如要建立由 GKE 管理的子網路範圍,請按照下列步驟操作:

gcloud composer environments create ENVIRONMENT_NAME \
    --location LOCATION \
    --image-version composer-1.20.12-airflow-1.10.15 \
    --enable-ip-alias \
    --enable-private-environment \
    --enable-privately-used-public-ips \
    --cluster-ipv4-cidr POD_IP_RANGE \
    --services-ipv4-cidr SERVICES_IP_RANGE

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。
  • POD_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍會新增為環境的子網路次要 IP 位址範圍,並用於 Pod 的 IP 位址範圍。
  • SERVICES_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍是環境子網路中服務的次要 IP 位址範圍。

範例:

gcloud composer environments create example-environment \
    --location us-central1 \
    --image-version composer-1.20.12-airflow-1.10.15 \
    --enable-ip-alias \
    --enable-private-environment \
    --enable-privately-used-public-ips \
    --cluster-ipv4-cidr 10.3.192.0/20 \
    --services-ipv4-cidr 172.16.194.0/23

使用者管理的子網路範圍

如要建立由使用者管理的範圍,請按照下列步驟操作:

gcloud composer environments create ENVIRONMENT_NAME \
    --location LOCATION \
    --image-version composer-1.20.12-airflow-1.10.15 \
    --enable-ip-alias \
    --enable-private-environment \
    --enable-privately-used-public-ips \
    --cluster-secondary-range-name POD_IP_RANGE_NAME \
    --services-secondary-range-name SERVICES_IP_RANGE_NAME

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。
  • POD_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。這個範圍由 Pod 使用。
  • SERVICES_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。服務會使用這個範圍。

範例:

gcloud composer environments create example-environment \
    --location us-central1 \
    --image-version composer-1.20.12-airflow-1.10.15 \
    --enable-ip-alias \
    --enable-private-environment \
    --enable-privately-used-public-ips \
    --cluster-secondary-range-name "public-1" \
    --services-secondary-range-name "public-2"

API

建構 environments.create API 要求。在 Environment 資源中,為含有 PUPI 範圍的環境指定設定參數。

由 GKE 管理的子網路範圍

如要建立由 GKE 管理的子網路範圍,請按照下列步驟操作:

// POST https://composer.googleapis.com/v1/{parent=projects/*/locations/*}/environments

{
  "name": "ENVIRONMENT_NAME",
  "config": {
    "nodeConfig": {
      "ipAllocationPolicy": {
        "useIpAliases": true,
        "clusterIpv4CidrBlock":"POD_IP_RANGE",
        "servicesIpv4CidrBlock":"SERVICES_IP_RANGE"
      }
    },
    "privateEnvironmentConfig": {
      "enablePrivateEnvironment": true,
      "enablePrivatelyUsedPublicIps": true
    }
  }
}

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • POD_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍會新增為環境的子網路次要 IP 位址範圍,並用於 Pod 的 IP 位址範圍。
  • SERVICES_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍是環境子網路中服務的次要 IP 位址範圍。

範例:

// POST https://composer.googleapis.com/v1/{parent=projects/*/locations/*}/environments

{
  "name": "example-environment",
  "config": {
    "nodeConfig": {
      "ipAllocationPolicy": {
        "useIpAliases": true,
        "clusterIpv4CidrBlock":"10.3.192.0/20",
        "servicesIpv4CidrBlock":"172.16.194.0/23"
      }
    },
    "privateEnvironmentConfig": {
      "enablePrivateEnvironment": true,
      "enablePrivatelyUsedPublicIps": true
    }
  }
}

使用者管理的子網路範圍

如要建立由使用者管理的範圍,請按照下列步驟操作:

// POST https://composer.googleapis.com/v1/{parent=projects/*/locations/*}/environments

{
  "name": "ENVIRONMENT_NAME",
  "config": {
    "nodeConfig": {
      "ipAllocationPolicy": {
        "useIpAliases": true,
        "clusterSecondaryRangeName":"POD_IP_RANGE",
        "servicesSecondaryRangeName": "SERVICES_IP_RANGE"
      }
    },
    "privateEnvironmentConfig": {
      "enablePrivateEnvironment": true,
      "enablePrivatelyUsedPublicIps": true
    }
  }
}

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • POD_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。這個範圍由 Pod 使用。
  • SERVICES_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。服務會使用這個範圍。

範例:

// POST https://composer.googleapis.com/v1/{parent=projects/*/locations/*}/environments

{
  "name": "example-environment",
  "config": {
    "nodeConfig": {
      "ipAllocationPolicy": {
        "useIpAliases": true,
        "clusterSecondaryRangeName":"public-1",
        "servicesSecondaryRangeName": "public-2"
      }
    },
    "privateEnvironmentConfig": {
      "enablePrivateEnvironment": true,
      "enablePrivatelyUsedPublicIps": true
    }
  }
}

Terraform

建立環境時,private_environment_config 區塊中的 enable_privately_used_public_ips 欄位會啟用 PUPI 範圍。您也必須為 Pod 和服務指定 PUPI 範圍。

由 GKE 管理的子網路範圍

如要建立由 GKE 管理的子網路範圍,請按照下列步驟操作:

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

  config {

    node_config {

      ip_allocation_policy = [{
        
        use_ip_aliases = true
        cluster_ipv4_cidr_block = "POD_IP_RANGE"
        services_ipv4_cidr_block = "SERVICES_IP_RANGE"
        cluster_secondary_range_name = null
        services_secondary_range_name = null
      }]
    }

    private_environment_config {
      enable_privately_used_public_ips = true
      // Other private ip environment parameters
    }

  }
}

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。
  • POD_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍會新增為環境的子網路次要 IP 位址範圍,並用於 Pod 的 IP 位址範圍。
  • SERVICES_IP_RANGE 與 CIDR 標記法中的 IP 位址範圍。這個範圍是環境子網路中服務的次要 IP 位址範圍。

範例:

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

  config {

    node_config {

      // Specify your network and subnetwork
      network    = google_compute_network.example_network.id
      subnetwork = google_compute_subnetwork.example_subnet.id

      ip_allocation_policy = [{
        
        use_ip_aliases = true
        // Specify PUPI addresses
        cluster_ipv4_cidr_block = "10.3.192.0/20"
        services_ipv4_cidr_block = "172.16.194.0/23"
        cluster_secondary_range_name = null
        services_secondary_range_name = null
      }]
    }

    private_environment_config {
      enable_privately_used_public_ips = true
      // Other private environment parameters
    }

  }
}

使用者管理的子網路範圍

如要建立由使用者管理的範圍,請按照下列步驟操作:

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

  config {

    node_config {

      ip_allocation_policy = [{
        
        use_ip_aliases = true
        cluster_ipv4_cidr_block = null
        services_ipv4_cidr_block = null
        cluster_secondary_range_name = POD_IP_RANGE_NAME
        services_secondary_range_name = SERVICES_IP_RANGE_NAME
      }]
    }

    private_environment_config {
      enable_privately_used_public_ips = true
      // Other private ip environment parameters
    }

  }

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。
  • POD_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。這個範圍由 Pod 使用。
  • SERVICES_IP_RANGE_NAME指定子網路中現有次要 IP 位址範圍的名稱。服務會使用這個範圍。

範例:

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

  config {

    node_config {

      // Specify your network and subnetwork
      network    = google_compute_network.example_network.id
      subnetwork = google_compute_subnetwork.example_subnet.id

      ip_allocation_policy = [{
        
        use_ip_aliases = true
        cluster_ipv4_cidr_block = null
        services_ipv4_cidr_block = null
        // Specify existing ranges
        cluster_secondary_range_name = "public-1"
        services_secondary_range_name = "public-2"
      }]
    }
    private_environment_config {
      enable_privately_used_public_ips = true
      // Other private environment parameters
    }

  }
}

後續步驟