向集群添加子网

本页面介绍了如何为 VPC 原生集群分配额外的子网。分配给集群的额外子网可让您创建新的节点池,其中节点和 Pod 的 IPv4 地址都来自额外的子网范围。

本页面面向为其组织设计和构建网络的网络专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

概览

创建新的 VPC 原生 GKE 集群时,您需要为集群选择一个默认子网。集群的默认子网 会按照 VPC 原生 集群的 IP 地址范围中所述为节点、Pod 和 Service 提供 IPv4 地址。

您可以为 VPC 原生集群分配最多八个额外的子网,从而实现集群的显著增长。每个新分配的额外子网都称为非默认子网。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

要求和限制

本部分介绍了在为集群分配和使用额外子网时适用的要求和限制。您必须满足所有要求,然后才能分配额外的子网。

  • 确保您的 GKE 集群是运行 GKE 1.30.3-gke.1211000 版或更高版本的 VPC 原生集群。 基于路由的集群和旧版网络 上的集群不支持额外的子网。
  • 每个集群最多可以分配八个额外的子网。
  • 额外的子网仅为节点和 Pod 提供 IPv4 地址。额外的子网不能用于为节点或 Pod 提供 IPv6 地址。
  • 只有新的节点池可以使用额外的子网,现有节点池不能使用。 默认情况下,GKE 会自动为节点池选择合适的子网。 您也可以在创建节点池时可选地手动指定 子网
  • 非默认子网中的子网次要 IPv4 地址范围只能由单个集群使用。
  • 额外的子网可能无法与 多集群网关搭配使用。
  • 如果您为 Pod 使用多网络支持,则额外子网的主要 IPv4 地址范围和 Pod IPv4 地址范围不得与多网络设置中配置的任何 CIDR 范围重叠。您配置的额外子网仅适用于默认网络。 此限制意味着节点和 Pod 上的任何额外网络接口都无法使用这些额外子网提供的 IP 地址。
  • 当您向启用了 Cloud Service Mesh 的集群添加子网时,网格无法将流量路由到非默认子网中的 Pod。

具有额外子网的集群的负载均衡器要求

本部分介绍了在集群中使用其他子网时适用的负载均衡器要求。每次创建外部 Ingress、外部Gateway或外部 LoadBalancer Service时,都必须满足这些要求。

  • 如需在具有额外子网的集群中使用外部 Ingress、Gateway 或 LoadBalancer Service,您的集群必须运行 GKE 1.33.2-gke.4780000 版或更高版本。
  • 使用 GKE Ingress 控制器的外部 Ingress 对象必须 使用 容器原生负载均衡
  • 为内部 LoadBalancer Service 启用 GKE 子集化 。GKE 子集化仅影响内部 LoadBalancer Service。因此,在启用 GKE 子集化后,您必须删除并重新创建集群中的所有现有 Service。
  • 如需创建基于后端服务的 外部直通式网络负载平衡器, 新的外部 LoadBalancer Service 必须包含设置为 networking.gke.io/l4-regional-externalspec.loadBalancerClass 字段。 此字段仅影响新的外部 LoadBalancer Service,不适用于现有的外部 LoadBalancer Service。 删除并重新创建所有在创建时未添加 spec.loadBalancerClass 字段的外部 LoadBalancer Service。 此字段需要 GKE 1.33.1-gke.1779000 版或更高版本。

    使用的后端类型(GCE_VM_IP NEG 后端或实例组后端)取决于您创建外部 LoadBalancer Service 时的 GKE 版本。如需了解详情,请参阅节点分组

添加具有一个 Pod IPv4 地址范围的新子网

  1. 创建新子网并添加新的子网次要 IPv4 地址范围。子网必须与集群位于同一区域和 VPC 网络中:

       gcloud compute networks subnets create SUBNET_NAME \
         --network=NETWORK \
         --region=REGION \
         --range=PRIMARY_RANGE \
         --secondary-range=POD_RANGE_NAME=SECONDARY_RANGE \
         --enable-private-ip-google-access
    

    替换以下内容:

    • SUBNET_NAME:新子网的名称。
    • NETWORK:包含新子网的 VPC 网络的名称。
    • REGION:子网所在的区域。
    • PRIMARY_RANGE:新子网的主要 IPv4 范围(采用 CIDR 表示法)。如需了解详情,请参阅 IPv4 子网范围
    • POD_RANGE_NAME:次要范围的名称。
    • SECONDARY_RANGE:次要 IPv4 地址范围(采用 CIDR 表示法)。如需了解有效范围,请参阅 IPv4 子网范围

    如需了解详情,请参阅使用子网

  2. 使用 gcloud CLI 更新集群以使用额外的子网:

       gcloud container clusters update CLUSTER_NAME \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME
    

    替换以下内容:

    • CLUSTER_NAME:现有集群的名称。
    • SUBNET_NAME:您创建的新子网的名称。
    • POD_RANGE_NAME:您要用于 Pod IPv4 地址范围的子网次要 IPv4 地址范围的名称。

添加具有多个 Pod IPv4 地址范围的新子网

  1. 在与集群相同的区域和 VPC 网络中创建新子网 。将子网主要 IPv4 地址范围设置为节点的额外 IPv4 地址范围。

  2. 对于所需的每个额外 Pod IPv4 地址范围,请向在上一步中 创建的子网添加新的子网 次要 IPv4 地址 范围

  3. 使用 gcloud CLI 更新集群以使用额外的子网。以下示例添加了一个子网,该子网具有两个用于 Pod 的子网次要 IPv4 地址范围。

       gcloud container clusters update CLUSTER_NAME \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_1 \
         --additional-ip-ranges=subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME_2
    

    替换以下内容:

    • CLUSTER_NAME:现有集群的名称。
    • SUBNET_NAME:您创建的新子网的名称。
    • POD_RANGE_NAME_1POD_RANGE_NAME_2:您要用于 Pod IPv4 地址范围的子网次要 IPv4 地址范围的名称。

验证子网

按集群:如需查看与集群关联的所有子网的详细信息,请运行 以下命令:

   gcloud container clusters describe CLUSTER_NAME

CLUSTER_NAME 替换为您的集群名称。

输出类似于以下内容:

ipAllocationPolicy:
  additionalIPRangesConfig:
  - podIpv4RangeNames:
    - pod-range-1
    subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets

按节点池:如需查看与节点池关联的所有子网的详细信息, 请运行以下命令:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \

替换以下内容:

  • POOL_NAME:节点池的名称。
  • CLUSTER_NAME:集群的名称。

输出类似于以下内容:

name: pool-1
networkConfig:
  podRange: pod-range-1
  subnetwork: projects/user-gke-dev-2/regions/us-central1/subnetworks/shared-msc-subnets

节点池如何选择子网

默认情况下,当您创建新节点池并且有多个子网可用时,GKE 会根据 IP 地址的要求以及所有集群子网中 IP 地址的可用性,自动为节点池选择合适的子网。

在创建节点池期间手动指定子网

如需在创建节点池时指定子网,请将 --subnetwork 标志与 gcloud container node-pools create 命令搭配使用。您指定的子网必须已分配给集群(作为默认子网或额外子网)。如果您未指定 Pod IPv4 范围,GKE 会自动从指定的子网中选择可用的次要范围。如果指定的子网或 Pod 范围没有足够的可用 IP 地址供节点池使用,GKE 会返回错误。

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --subnetwork=SUBNET_NAME

指定 Pod IPv4 地址范围以及子网

如果指定的子网具有多个次要 IPv4 地址范围,您可以同时使用 --pod-ipv4-range 标志和 --subnetwork 标志来指定要用于节点池中 Pod 的范围。

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --subnetwork=SUBNET_NAME \
    --pod-ipv4-range=POD_RANGE_NAME

替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:集群的名称。
  • LOCATION:集群的区域或可用区。
  • SUBNET_NAME:您要使用的子网的名称或完整资源路径。
  • POD_RANGE_NAME:要用于此节点池中 Pod 的子网次要范围的名称。

移除非默认子网

从集群中移除非默认子网会指示集群不再在任何集群节点池中使用该子网的范围。移除操作具有以下影响:

  • 非默认子网的主要 IPv4 地址范围不能用于节点 IPv4 地址范围。
  • 非默认子网中的子网次要 IPv4 范围不能用于 Pod IPv4 范围。

在移除非默认子网之前,您必须删除使用此子网的所有节点池。建议您首先将子网设置为排空状态。处于排空状态的子网不会被新创建的节点池考虑使用。这样可以防止集群自动扩缩器操作(如节点池扩容)选择您打算移除的子网,而无需为整个集群停用自动扩缩。

移除子网的步骤:

  1. 将非默认子网设置为排空状态。这样可以防止新节点池选择此子网,这在您为集群启用自动扩缩时非常有用。
  2. 删除使用此子网的所有节点池。
  3. 从集群中移除子网。

如需从集群中移除非默认子网,请运行以下命令:

   gcloud container clusters update CLUSTER_NAME \
     --remove-additional-ip-ranges=subnetwork=SUBNET_NAME

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • SUBNET_NAME:您要从集群中移除的子网的名称。

如需将非默认子网的状态设置为排空,请运行以下命令:

   gcloud container clusters update CLUSTER_NAME \
     --drain-additional-ip-ranges=subnetwork=SUBNET_NAME

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • SUBNET_NAME:您要设置为排空状态的子网的名称。

如需取消排空非默认子网,请运行以下命令:

   gcloud container clusters update CLUSTER_NAME \
     --undrain-additional-ip-ranges=subnetwork=SUBNET_NAME

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • SUBNET_NAME:您要取消排空的子网的名称。

从集群中移除非默认子网后,您可以删除该 非默认子网

移除非默认子网次要 IPv4 范围

从集群中移除非默认子网次要 IPv4 范围时,GKE 会指示集群不要在任何节点池中将该范围用于 Pod IPv4 范围。如果您移除的非默认子网次要 IPv4 范围是此集群使用的非默认子网的唯一范围,GKE 还会指示集群停止将此子网的主要 IPv4 地址用于节点 IPv4 地址。

在移除非默认子网次要 IPv4 范围之前,您必须删除使用该范围作为 Pod IPv4 地址的所有节点池。

如需从集群中移除非默认子网次要 IPv4 范围,请运行以下命令:

   gcloud container clusters update CLUSTER_NAME \
     --remove-additional-ip-ranges=\
       subnetwork=SUBNET_NAME,pod-ipv4-range=POD_RANGE_NAME

替换以下内容:

  • CLUSTER_NAME:集群的名称。
  • SUBNET_NAME:非默认子网的名称。
  • POD_RANGE_NAME:您要从集群中移除的非默认子网次要 IPv4 范围的名称。

从集群中移除非默认子网次要 IPv4 范围后,您 可以删除该非默认子网次要 IPv4 范围

在共享 VPC 中使用额外的子网

在开始之前,请确保您已执行以下操作:

  • 一个正常运行的共享 VPC 环境,其中宿主项目和服务项目已附加。如需了解相关说明,请参阅使用共享 VPC 设置集群
  • 一个位于服务项目中的正在运行的 GKE 集群。
  • 宿主项目和服务项目中均已启用所有必需的 API。
  1. 在宿主项目中,在 GKE 集群的同一网络下创建额外的子网:

    gcloud compute networks subnets create ADDITIONAL_SUBNET_NAME \
      --project HOST_PROJECT_ID \
      --network shared-net \
      --range 172.16.4.0/22 \
      --region COMPUTE_REGION \
      --secondary-range ADDITIONAL_SUBNET_NAME-services=172.16.16.0/20,ADDITIONAL_SUBNET_NAME-pods=172.20.0.0/14
    
  2. 获取 IAM 政策。如需让服务项目中的 GKE 集群访问宿主项目的共享 VPC 中的额外子网,您必须配置必要的 IAM 权限。如果尚未配置权限,请继续执行以下步骤。如果权限已存在,则无需执行任何操作。

    gcloud compute networks subnets get-iam-policy ADDITIONAL_SUBNET_NAME \
        --project HOST_PROJECT_ID \
        --region COMPUTE_REGION
    

    输出包含 etag 字段。记下 etag 值。

  3. 创建一个名为 ADDITIONAL_SUBNET_NAME-policy.yaml 的文件,其中包含以下内容:

      bindings:
      - members:
        - serviceAccount:SERVICE_PROJECT_NUM@cloudservices.gserviceaccount.com
        - serviceAccount:service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com
        role: roles/compute.networkUser
      etag: ETAG_STRING
    

    ETAG_STRING 替换为您之前记下的 etag 值。

  4. 设置 ADDITIONAL_SUBNET_NAME 子网的 IAM 政策:

      gcloud compute networks subnets set-iam-policy ADDITIONAL_SUBNET_NAME \
          ADDITIONAL_SUBNET_NAME-policy.yaml \
          --project HOST_PROJECT_ID \
          --region COMPUTE_REGION
    
  5. 验证可用的子网和次要 IP 地址范围,如 共享 VPC 验证可用的子网中所述。

  6. 更新额外子网的共享 VPC 集群:

    gcloud container clusters update CLUSTER_NAME \
        --project=SERVICE_PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --additional-ip-ranges=subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/ADDITIONAL_SUBNET_NAME,pod-ipv4-range=ADDITIONAL_SUBNET_NAME-pods

替换以下内容:

  • CLUSTER_NAME:服务项目中的 GKE 集群的名称。
  • ADDITIONAL_SUBNET_NAME:您在宿主项目中创建的额外子网的名称(例如 tier-2)。
  • HOST_PROJECT_ID:宿主项目 ID。
  • SERVICE_PROJECT_NUM:服务项目名称。
  • COMPUTE_REGION:子网所在的区域。

这样,您就可以在共享 VPC 环境中使用额外的子网了。

后续步骤