本页面介绍了如何为 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 地址池已耗尽,即使您使用其他子网,也无法自动扩缩集群。
具有额外子网的集群的负载均衡器要求
本部分介绍了在集群中使用其他子网时适用的负载均衡器要求。每次创建外部 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_IPNEG 后端或实例组后端)取决于您创建外部 LoadBalancer Service 时的 GKE 版本。如需了解详情,请参阅节点分组。
添加具有一个 Pod IPv4 地址范围的新子网
- 创建新的子网并添加新的子网次要 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 子网范围。
 - 如需了解详情,请参阅使用子网。 
- 使用 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 地址范围的新子网
- 在与集群相同的区域和 VPC 网络中创建新的子网。将子网主要 IPv4 地址范围设置为节点的其他 IPv4 地址范围。 
- 对于您需要的每个额外的 Pod IPv4 地址范围,请向您在上一步中创建的子网添加新的子网次要 IPv4 地址范围。 
- 使用 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_1和- POD_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 范围。
在移除非默认子网之前,您必须删除使用该子网的所有节点池。您可能需要暂时停用自动扩缩功能,因为节点池扩容操作可能会自动选择您要移除的子网。
如需从集群中移除非默认子网,请运行以下命令:
   gcloud container clusters update CLUSTER_NAME \
     --remove-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 原生集群。
- 详细了解如何添加 Pod IPv4 地址范围。
- 如需详细了解如何通过配置每个节点的最大 Pod 数来优化 IP 地址分配,请参阅相关文档。