向集群添加子网

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

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

概览

创建新的 VPC 原生 GKE 集群时,您可以为该集群选择默认子网。集群的默认子网会为节点、Pod 和 Service 提供 IPv4 地址,如 VPC 原生集群的 IP 地址范围中所述。

您可以为 VPC 原生集群分配最多 8 个额外的子网,从而显著扩大集群规模。每个新分配的额外子网都称为非默认子网

准备工作

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

  • 启用 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 原生集群。 基于路由的集群和旧版网络上的集群不支持其他子网。
  • 每个集群最多可分配 8 个额外的子网。
  • 其他子网仅为节点和 Pod 提供 IPv4 地址。其他子网不能用于为节点或 Pod 提供 IPv6 地址。
  • 只有新节点池可以使用其他子网,现有节点池无法使用。 当您创建新的节点池并且有多个非默认子网可用时,GKE 会根据 IP 地址要求以及所有集群子网中 IP 地址的可用性,为节点池选择最佳子网。
  • 您无法控制新节点池使用哪个非默认子网。例如,如果您的集群有一个默认子网(在集群创建期间使用的子网)和两个非默认子网,您无法指定新节点池应使用哪个非默认子网。
  • 非默认子网中的子网次要 IPv4 地址范围只能由单个集群使用。
  • 其他子网可能无法与多集群网关搭配使用。
  • 如果您使用 Pod 的多网络支持,则附加子网的主要 IPv4 地址范围和 Pod IPv4 地址范围不得与多网络设置中配置的任何 CIDR 范围重叠。您配置的其他子网仅适用于默认网络。此限制意味着节点和 Pod 上的任何其他网络接口都无法使用这些额外子网提供的 IP 地址。
  • 如果默认子网中的 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必须包含 cloud.google.com/l4-rbs: "enabled" 注释。此注解仅影响的外部 LoadBalancer Service,不适用于现有的外部 LoadBalancer Service。删除并重新创建所有在创建时未添加 cloud.google.com/l4-rbs: "enabled" 注释的外部 LoadBalancer Service。

    所使用的后端类型(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 更新集群以使用其他子网。以下示例添加了一个子网,该子网具有两个子网次要 IPv4 地址范围(用于 Pod)。

       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

移除非默认子网

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

  • 非默认子网的主要 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 环境中使用其他子网了。

后续步骤