添加 Pod IP 地址范围


本页面介绍如何在 VPC 原生 Google Kubernetes Engine (GKE) 集群中启用连续的多 Pod CIDR。

概览

使用不连续的多 Pod CIDR,您可以向 GKE 集群添加新的或现有的次要 Pod IP 地址范围。

创建新的节点池时,默认情况下,节点池使用集群的默认 Pod IP 地址范围(也称为集群 CIDR)。通过此功能,您可以在创建节点池期间指定 Pod IP 地址范围,并且节点池会使用该范围而不是集群的默认 Pod IP 地址范围。

下图显示了一个用户管理的集群,该集群使用 /24 CIDR 地址块作为次要 Pod IP 地址范围(256 个 IP 地址)和两个使用 /25 的节点 Pod IP 地址(每个 128 个 IP 地址)的 CIDR 地址块。次要 Pod IP 地址范围已用尽,您无法再向集群添加其他节点。您可以使用不连续的多 Pod CIDR 创建节点池,而不是删除并重新创建集群。集群会扩展为包含第三个节点,该节点对 Pod IP 地址使用 /28 CIDR 块。

使用不连续的多 Pod CIDR 将节点池添加到已用尽次要 Pod IP 地址范围的集群
图表 :使用不连续的多 Pod CIDR

优势

  • 您无需在创建集群前规划未来的增长,从而更高效地进行 IP 分配。
  • 您可以将集群容纳到分段的 IP 地址空间。
  • 您可以根据业务需求的变化重新分配 IP 地址。

限制

  • 不连续的多 Pod CIDR 仅在 VPC 原生集群中提供。
  • 集群中的所有节点池都必须位于 1.19.8-gke.1000 版到 1.20 版或 1.20.4-gke.500 及更高版本中。
  • 不连续的多 Pod CIDR 需要 Cloud SDK 版本 353 或更高版本。
  • 节点池一经创建,便无法更改次要 Pod IP 地址范围。但是,您可以使用新范围创建节点池,并将工作负载轮替至新节点池。

注意事项

  • 如果您使用配置了 nonMasqueradeCIDRs 参数的 ip-masq-agent,则必须更新 nonMasqueradeCIDRs 以包括所有 Pod CIDR 范围。
  • 如果您使用配置了 ipBlockNetworkPolicy 来指定流量,则必须更新 cidr 值以包含所有 Pod CIDR 范围。

修改后的防火墙规则

在 GKE 创建集群时,它会创建防火墙规则以启用 Pod 到 Pod 的通信 gke-[cluster-name]-[cluster-hash]-all

在创建或删除启用了连续的多 Pod CIDR 的节点池时,GKE 会将此防火墙规则的来源值更新为集群用于 Pod IP 地址的所有 CIDR。

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

使用新的次要 Pod IP 地址范围创建节点池

在本部分中,您将创建一个具有次要 Pod IP 地址范围的节点池。

您可以使用 gcloud 命令行工具或 GKE API。

gcloud

gcloud container node-pools create POOL_NAME \
  --cluster CLUSTER_NAME \
  --create-pod-ipv4-range name=RANGE_NAME,range=RANGE

请替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:集群的名称。
  • RANGE_NAME:新的次要 Pod IP 地址范围的可选名称。
  • RANGE:作为网络掩码 (/20) 或 CIDR 范围 (10.12.4.0/20) 提供的可选 pod IP 地址范围。如果您提供网络掩码,则 GKE 会从集群网络中的可用范围中分配一个范围。如果您没有为 range 提供值,GKE 会自动分配 /14 网络掩码,这是子网的 pod 次要 IP 范围的默认大小。

API

"nodePool": {
  "name": "POOL_NAME",
  ...
  "networkConfig": {
    "createPodRange": true,
    "podRange": "RANGE_NAME",
    "podIpv4CidrBlock": "RANGE"
  }
}

请替换以下内容:

  • POOL_NAME:新节点池的名称。
  • RANGE_NAME:新的次要 Pod IP 地址范围的可选名称。
  • RANGE:作为网络掩码 (/20) 或 CIDR 范围 (10.12.0.0/20) 提供的可选 Pod IP 地址范围。如果指定了网络掩码,则系统会自动从集群网络中的可用空间分配 IP 地址范围。如果未提供值,则 GKE 会自动分配 /14 网络掩码,也就是子网 Pod 的次要 IP 范围的默认大小。

使用现有的次要 Pod IP 地址范围创建节点池

在本部分中,您将创建一个包含现有次要 Pod IP 地址范围的节点池。

您可以使用 gcloud 工具或 GKE API。

gcloud

gcloud container node-pools create POOL_NAME \
  --cluster CLUSTER_NAME \
  --pod-ipv4-range RANGE_NAME

请替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:集群的名称。
  • RANGE_NAME:集群子网中现有次要 Pod IP 地址范围的名称。

API

"nodePool": {
  "name": "POOL_NAME",
  ...
  "networkConfig": {
    "podRange": "RANGE_NAME"
  }
}

请替换以下内容:

  • POOL_NAME:新节点池的名称。
  • RANGE_NAME:集群子网中现有次要 Pod IP 地址范围的名称。

验证节点池的 Pod CIDR 地址块

要确定给定节点池中的 Pod 使用哪个 Pod CIDR 地址块,请使用以下命令:

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

输出内容类似如下:

...
networkConfig:
  podIpv4CidrBlock: 192.168.0.0/18
  podRange: podrange
...

如果节点池使用不连续的多 pod CIDR,则 podRangepodIpv4CidrBlock 会显示此节点池的配置值。

如果节点池未使用不连续的多 Pod CIDR,则 podRangepodIpv4CidrBlock 会显示集群的默认值,即 IPAllocationPolicy 中的 clusterSecondaryRangeNameclusterIpv4CidrBlock

问题排查

您可以启用 VPC 流日志以确定数据包是否已正确发送到节点。

后续步骤