本页面介绍了如何为 VPC 原生集群配置额外的 Pod IPv4 地址范围,以及如何为 VPC 原生集群的节点池指定自定义 Pod IPv4 地址范围。
VPC 原生集群中的 Pod IPv4 地址范围始终来自子网次要 IPv4 地址范围。创建新集群时,您需要为集群分配默认的 Pod IPv4 地址范围。
- 对于 Autopilot 集群和 Standard 集群,您可以将集群配置为使用额外的 Pod IPv4 地址范围。GKE 会将这些额外的 Pod IPv4 地址范围用于在未来节点池中创建的节点上的 Pod IPv4 地址。
- 对于 Standard 集群,您可以创建节点池,每个节点池都将自定义子网次要 IPv4 地址范围用于其 Pod IPv4 地址。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 确保您拥有包含集群子网的项目的 Compute Network Admin Identity and Access Management (IAM) 角色。此角色是创建新的子网次要 IPv4 地址范围所必需的。使用共享 VPC 时,您需要与共享 VPC 宿主项目的网络管理员协调。
- 确保 GKE 集群是一个 VPC 原生集群。基于路由的集群不支持额外的 Pod IPv4 地址范围或节点池自定义 Pod IPv4 地址范围。
- 查看后续步骤部分。
创建新的子网次要 IPv4 地址范围
如需创建新的子网次要 IPv4 地址范围,请使用 Google Cloud 控制台或 Google Cloud CLI。每个子网最多支持 30 个次要 IPv4 地址范围。如需了解详情,请参阅 VPC 文档中的修改次要 IPv4 范围。
控制台
转到 Google Cloud 控制台中的 VPC 网络页面。
在 VPC 网络列表中,选择您要扩展的网络。
在子网列表中,选择所需的子网。
点击修改。
点击添加 IP 范围。
在子网范围名称字段中,输入新的子网次要 IPv4 地址范围的名称。例如
pod-range-2
。在次要 IP 范围字段中,以 CIDR 格式输入 IPv4 地址范围。例如
10.2.204.0/22
。点击保存。
gcloud
gcloud compute networks subnets update SUBNET_NAME \
--region=REGION \
--add-secondary-ranges=SECONDARY_RANGE_NAME=SECONDARY_RANGE_CIDR
替换以下内容:
SUBNET_NAME
:集群子网(创建集群时分配给集群的同一子网)的名称。REGION
:集群子网的区域。集群子网的区域是 GKE 集群所在的区域。SECONDARY_RANGE_NAME
:充当集群的额外 Pod IPv4 地址范围的新子网次要 IPv4 地址范围的名称。例如pod-range-2
。SECONDARY_RANGE_CIDR
:供新的子网次要 IPv4 地址范围使用的 CIDR。例如10.2.204.0/22
。
通过在 --add-secondary-ranges
标志后指定额外的 SECONDARY_RANGE_NAME
=SECONDARY_RANGE_CIDR
对(以英文逗号分隔),您可以添加两个或更多新的子网次要 IPv4 地址范围。
为集群分配额外的 Pod IPv4 范围
您可以在集群级层分配额外的 Pod IPv4 地址范围,该地址范围适用于在集群中创建的新节点池中创建的新节点。如需为集群分配额外的 Pod IPv4 地址范围,您必须先创建新的子网次要 IPv4 地址范围。
以下集群支持为集群分配额外的 Pod IPv4 地址范围:
- 运行 GKE 1.26 版及更高版本的 Autopilot 集群
- Standard 集群
控制台
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在要修改的集群旁边,点击 more_vert 操作,然后点击 edit 修改。
在网络部分中,点击集群 Pod IPv4 范围(额外)旁边的 edit 修改。
在修改额外集群 Pod IPv4 范围对话框中,点击 Pod 次要 CIDR 范围,然后选择集群子网中的一个或多个现有子网次要 IPv4 地址范围的名称。如果没有额外的子网次要 IPv4 地址范围可用,请先创建新的子网次要 IPv4 地址范围,然后重复这些步骤。
点击保存更改。
gcloud
使用
--additional-pod-ipv4-ranges
标志更新集群:gcloud container clusters update CLUSTER_NAME \ --additional-pod-ipv4-ranges=SECONDARY_RANGE_NAME \ --location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:集群的名称。SECONDARY_RANGE_NAME
:集群子网中的一个或多个现有子网次要 IPv4 地址范围的名称,以英文逗号分隔。如果没有子网次要 IPv4 地址范围可用,请先创建新的子网次要 IPv4 地址范围。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
查询集群 Pod IPv4 范围
如需查询集群的默认 Pod IPv4 地址范围以及已分配给集群的任何额外 Pod IPv4 地址范围,请使用以下命令:
gcloud container clusters describe CLUSTER_NAME \
--location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
输出类似于以下内容,其中包括集群的 IPAllocationPolicy:
ipAllocationPolicy:
clusterSecondaryRangeName: cluster-pods
clusterIpv4CidrBlock: 10.10.0.0/23
additionalPodRangesConfig:
podRangeNames:
- pod-range-1
- pod-range-2
其中:
clusterSecondaryRangeName
:用作集群的默认 Pod IPv4 地址范围的子网次要 IPv4 地址范围的名称(创建集群时定义)。clusterIpv4CidrBlock
:Pod IPv4 地址的子网次要 IPv4 地址范围的 CIDR(创建集群时定义)。additionalPodRangesConfig.podRangeNames
:Pod IPv4 地址的任何额外分配的子网次要 IPv4 地址范围的列表。
节点池自定义 Pod IPv4 地址范围
对于运行 GKE 1.20.4-gke.500 或更高版本的 Standard 集群,您可以使用以下方法之一为新节点池分配自定义 Pod IPv4 范围:
GKE 管理的节点池自定义 Pod IPv4 地址范围:使用此选项,您可以创建新的节点池,并为 GKE 提供在集群子网中创建新的子网次要 IPv4 地址范围所需的信息。在新节点池中创建的每个新节点都分配有一个用于其 Pod IPv4 地址的别名 IP 地址范围,并且每个别名 IP 地址范围都来自 GKE 创建的新子网次要 IPv4 地址范围。只有集群和包含集群子网的 VPC 网络位于同一项目中时,才可以使用此选项。
用户管理的节点池自定义 Pod IPv4 地址范围:使用此选项,您可以创建新的节点池,其中 GKE 使用现有的子网次要 IPv4 地址范围。在新节点池中创建的每个新节点都分配有一个用于其 Pod IPv4 地址的别名 IP 地址范围,并且每个别名 IP 地址范围都来自您指示 GKE 使用的子网次要 IPv4 地址范围。如果集群位于共享 VPC 服务项目中,并且集群的子网位于宿主项目的共享 VPC 网络中,则您必须使用此选项。
节点池的自定义 Pod IPv4 地址范围会替换在集群级层定义的所有 Pod IPv4 地址范围,包括分配给集群的额外 Pod IPv4 地址范围。分配给节点池的自定义 Pod IPv4 地址范围也称为“不连续的多 Pod CIDR”。
节点池自定义 Pod IPv4 地址范围示例
下图展示了一个包含用户管理的 Pod IPv4 地址范围的 VPC 原生集群:
在上图中:
- 集群中每个节点池的每个节点的 Pod 数量上限设置为
64
。为了让每个节点最多容纳 64 个 Pod,GKE 会使用/25
别名 IP 地址范围创建每个节点,并为每个节点提供128
Pod IPv4 地址。 - 集群的默认 Pod IPv4 地址范围为
/24
。由于每个节点需要对 Pod IPv4 地址使用/25
,因此集群的默认 Pod IPv4 地址范围仅支持两个节点。 - 为了支持额外节点,集群管理员创建了一个额外的节点池,以使每个节点的 Pod 数上限保持在
64
。额外的节点池使用自定义/20
Pod IPv4 地址范围,该地址范围支持 32 个额外节点。
由 GKE 管理的节点池自定义 Pod IPv4 地址范围
如需创建具有 GKE 管理的自定义 Pod IPv4 地址范围的节点池,请使用 gcloud CLI 或 GKE API,如下所示:
gcloud
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--create-pod-ipv4-range=name=SECONDARY_RANGE_NAME,range=CIDR_OR_NETMASK
请替换以下内容:
POOL_NAME
:新节点池的名称。CLUSTER_NAME
:集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。SECONDARY_RANGE_NAME
:GKE 创建的子网次要 IPv4 地址范围的名称。如果省略name=SECONDARY_RANGE_NAME
,GKE 会自动生成新的子网次要 IPv4 地址范围的名称。CIDR_OR_NETMASK
:以 CIDR 格式(例如10.12.4.0/20
)或子网掩码(例如/20
)表示的 Pod IPv4 地址范围。- 如果您仅提供了子网掩码,则 GKE 会尝试创建与包含集群子网的 VPC 网络中的现有子网 IPv4 地址范围不冲突的新子网次要 IPv4 地址范围。
- 如果您省略
range=CIDR_OR_NETMASK
,则 GKE 会尝试创建与包含集群子网的 VPC 网络中的现有子网 IPv4 地址范围不冲突的新/14
子网次要 IPv4 地址范围。
API
"nodePool": {
"name": "POOL_NAME",
...
"networkConfig": {
"createPodRange": true,
"podRange": "SECONDARY_RANGE_NAME",
"podIpv4CidrBlock": "CIDR_OR_NETMASK"
}
}
替换以下内容:
POOL_NAME
:新节点池的名称。SECONDARY_RANGE_NAME
:(可选)GKE 创建的子网次要 IPv4 地址范围的名称。如果您使用""
作为networkConfig.podRange
的值,或者在请求中省略podRange
参数,则 GKE 会自动生成新的子网次要 IPv4 地址范围的名称。CIDR_OR_NETMASK
:以 CIDR 格式(例如10.12.4.0/20
)或子网掩码(例如/20
)表示的 Pod IPv4 地址范围。- 如果您仅提供了子网掩码,则 GKE 会尝试创建与包含集群子网的 VPC 网络中的现有子网 IPv4 地址范围不冲突的新子网次要 IPv4 地址范围。
- 如果您使用
""
作为networkConfig.podIpv4CidrBlock
的值,则 GKE 会尝试创建与包含集群子网的 VPC 网络中的现有子网 IPv4 地址范围不冲突的新/14
子网次要 IPv4 地址范围。
用户管理的节点池自定义 Pod IPv4 地址范围
如需创建具有用户管理的自定义 Pod IPv4 地址范围的节点池,请使用 gcloud CLI 或 GKE API,如下所示:
gcloud
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--pod-ipv4-range SECONDARY_RANGE_NAME
请替换以下内容:
POOL_NAME
:新节点池的名称。CLUSTER_NAME
:集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。SECONDARY_RANGE_NAME
:集群子网中的现有子网次要 IPv4 地址范围的名称。如有必要,请先创建新的子网次要 IPv4 地址范围。
API
"nodePool": {
"name": "POOL_NAME",
...
"networkConfig": {
"createPodRange": false,
"podRange": "SECONDARY_RANGE_NAME"
}
}
替换以下内容:
POOL_NAME
:新节点池的名称。SECONDARY_RANGE_NAME
:集群子网中的现有子网次要 IPv4 地址范围的名称。如有必要,请先创建新的子网次要 IPv4 地址范围。
查询节点池 Pod IPv4 范围
如需查询节点池的 Pod IPv4 地址范围,请使用以下命令:
gcloud container node-pools describe POOL_NAME \
--cluster=CLUSTER_NAME \
--location=COMPUTE_LOCATION
替换以下内容:
POOL_NAME
:节点池的名称。CLUSTER_NAME
:集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
输出类似于以下内容,其中包括节点池的 NodeNetworkConfig:
networkConfig:
podRange: podrange
podIpv4CidrBlock: 192.168.0.0/18
其中:
podRange
:节点池的 Pod IPv4 地址的子网次要 IPv4 地址范围的名称。podIpv4CidrBlock
:节点池的 Pod IPv4 地址的子网次要 IPv4 地址范围的 CIDR。
如果节点池使用的是自定义 Pod IPv4 地址范围,则 podRange
和 podIpv4CidrBlock
值与集群的默认 Pod IPv4 地址范围不同。
后续步骤
为集群分配额外的 Pod IPv4 地址范围或配置节点池自定义 Pod IPv4 地址范围后,GKE 会更新自动创建的 gke-[cluster-name]-[cluster-hash]-all
VPC 防火墙规则,以使其来源范围包含所有 Pod IPv4 地址。
您可能还需要:
更新集群的 IP 伪装代理配置。有效的非伪装 CIDR 集必须包含集群(及其节点池)使用的所有 Pod IPv4 地址范围。 如需了解详情,请参阅检查
ip-masq-agent
状态以及配置和部署ip-masq-agent
。查看集群的
NetworkPolicy
配置。您可能需要更新引用 Pod IPv4 地址范围的ipBlock
属性。
后续步骤
- 详细了解如何优化 IP 地址分配。