本页面介绍了如何通过在 Google Kubernetes Engine (GKE) 上配置 Standard 集群中每个节点的 Pod 数量上限来优化集群资源,以确保 Pod 具有足够的调度容量。本页面可帮助您了解 Pod、CIDR 地址块大小和节点数量之间的关系如何影响 GKE 在集群中调度 Pod 和分配 IP 地址的方式。本页面还包括有关每个节点的 Pod 数上限的限制和默认值的详细信息。
本页面可帮助预配和配置云资源、部署应用和服务以及管理云部署的网络运维人员、云架构师、开发者和网络工程师。如需详细了解我们在 Google Cloud内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
在阅读本页面之前,请先熟悉何时使用 GKE Standard 而不是 Autopilot 集群,以及 Kubernetes 网络模型。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
限制
- 您只能在 VPC 原生集群中配置每个节点的 Pod 数量上限。
- 节点创建受 Pod 地址范围中可用地址数量的限制。请参阅 IP 地址范围规划表,了解 Pod 地址范围的默认大小、最小大小和最大大小。您还可以使用不连续的多 Pod CIDR 来添加其他 Pod IP 地址。
每个集群都需要在
kube-system
命名空间中创建 kube-system Pod(例如 kube-proxy)。在减少每个节点的最大 Pod 数量时,请务必同时考虑工作负载 Pod 和系统 Pod。如需列出集群中的系统 Pod,请运行以下命令:kubectl get pods --namespace kube-system
配置每个节点的 Pod 数上限
您可以在创建集群或创建节点池时,配置 Standard 集群中每个节点的 Pod 数上限。创建集群或节点池后,无法更改此设置。对于 Autopilot 集群,节点数上限已预先配置,并且不可变。
但是,如果耗尽 Pod 的 IP 地址,您可以使用连续的多 Pod CIDR 创建其他 Pod IP 地址范围。
您可以在创建集群时使用 gcloud CLI 或 Google Cloud 控制台设置 Pod 地址范围的大小。
gcloud
如需使用 gcloud CLI 设置每个节点的默认 Pod 数量上限,请运行以下命令:
gcloud container clusters create CLUSTER_NAME \
--enable-ip-alias \
--cluster-ipv4-cidr=10.0.0.0/21 \
--services-ipv4-cidr=10.4.0.0/19 \
--create-subnetwork=name='SUBNET_NAME',range=10.5.32.0/27 \
--default-max-pods-per-node=MAXIMUM_PODS \
--location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:新集群的名称。SUBNET_NAME
:集群的新子网的名称。MAXIMUM_PODS
:集群的每个节点的默认 Pod 数上限,最多可以配置为256
。如果省略,Kubernetes 会分配默认值110
。COMPUTE_LOCATION
:新集群的 Compute Engine 位置。
控制台
在 Google Cloud 控制台中,前往创建 Kubernetes 集群页面。
配置新集群。
在导航窗格的集群下,点击网络。
确保选中启用 VPC 原生流量路由(使用别名 IP)复选框。
在导航窗格的节点池下,点击节点。
将每个节点的最大 Pod 数量字段设置为
110
。GKE 使用此值来调整分配给节点的 IP 地址范围的大小。点击创建。
为集群配置每个节点的 Pod 数量上限时,Kubernetes 会使用此值为节点分配 CIDR 范围。您可以根据集群的 Pod 次要 IP 地址范围和节点分配到的 CIDR 范围来计算集群中的节点数上限。
例如,如果您将默认最大 Pod 数设置为 110
并将 Pod 的次要 IP 地址范围设置为 /21
,Kubernetes 会为集群中的节点分配 /24
CIDR 范围。CIDR 范围分配允许集群中最多有 2(24-21) = 23 = 8
个节点。
同样,如果您将最大 Pod 数设置为 8
并将集群的 Pod 次要 IP 地址范围设置为 /21
,Kubernetes 会为节点分配 /28
CIDR 范围。CIDR 范围分配允许集群中最多有 2(28-21) = 27 = 128
个节点。
设置现有集群的新节点池中的 Pod 数上限
您也可以在现有 Standard 集群中创建节点池时指定每个节点的 Pod 数上限。通过创建新节点池,您可以优化 IP 地址分配,即使在未在集群级层为每个节点配置默认 Pod 数上限的现有集群中也是如此。
在节点池级层设置的 Pod 数量上限会替换集群级层的默认 Pod 数量上限。如果您在创建节点池时未配置每个节点的 Pod 数量上限,则系统会应用集群级层的最大值。
gcloud
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--max-pods-per-node=MAXIMUM_PODS
替换以下内容:
POOL_NAME
:新节点池的名称。CLUSTER_NAME
:要在其中创建节点池的集群的名称。MAXIMUM_PODS
:节点池中的 Pod 数量上限。
控制台
进入 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
点击 add_box 添加节点池。
在导航窗格中,点击节点。
在网络下,输入每个节点的 Pod 数上限字段的值。GKE 使用此值来调整分配给节点的 IP 地址范围的大小。
Pod 次要范围和每个节点的 Pod 数上限
配置每个节点的 Pod 数上限时,会间接影响所需的 Pod 次要范围大小。GKE 要求每个节点池的 CIDR 地址块至少为 /24。在创建节点池时尝试指定小于 /24 的 Pod 次要范围会导致以下错误:
Pod secondary range 'Pod' must have a CIDR block of at least /24
如果整个集群的范围需要小于 /24,您可以使用 Google Cloud CLI 通过 --cluster-ipv4-cidr 参数在集群级指定此范围。如需了解详情,请参阅创建具有特定 CIDR 范围的集群。您还可以使用不连续的多 Pod CIDR 向集群添加更多 Pod IP 地址范围。
每个集群都需要在 kube-system 命名空间中创建 kube-system Pod(例如 kube-proxy)。在配置每个节点的最大 Pod 数量时,请务必同时考虑工作负载 Pod 和系统 Pod。
关于每个节点的默认 Pod 数上限
默认情况下,GKE 允许标准集群上的每个节点最多有 110 个 Pod,但标准集群本身可以配置为允许每个节点最多有 256 个 Pod。Autopilot 集群会根据预期的工作负载 Pod 密度,选择每个节点的 Pod 数量上限。范围介于 8 到 256 之间。Kubernetes 为每个节点分配一个 IP 地址范围,即 CIDR 地址块,以便每个 Pod 可以拥有唯一的 IP 地址。CIDR 地址块的大小对应于每个节点的最大 Pod 数量。
Standard 集群中的 Pod CIDR 范围
标准集群的每个节点默认最多 110 个 Pod,Kubernetes 为每个节点分配一个 /24 CIDR 地址块(256 个地址)。通过使用可用 IP 地址的数量是在节点上可以创建的 Pod 数量上限的两倍,Kubernetes 可以减少将 Pod 添加到节点或从节点移除 Pod 的 IP 地址重复使用情况。
尽管每个节点的 Pod 数量上限硬性限制为 256 个,但您可以减少节点上的 Pod 数量。分配给节点的 CIDR 地址块的大小取决于每个节点的 Pod 数上限值。该地址块包含的地址数量始终至少是每个节点的 Pod 数上限的两倍。
下表列出了 CIDR 块的大小以及 Kubernetes 根据每个节点的 Pod 数量上限分配给节点的可用 IP 地址的相应数量:
每个节点的最大 Pod 数量 | 每个节点的 CIDR 范围 | IP 地址数量 |
---|---|---|
8 | /28 | 16 |
9 - 16 | /27 | 32 |
17 - 32 | /26 | 64 |
33 - 64 | /25 | 128 |
65 – 128 | /24 | 256 |
129 - 256 | /23 | 512 |
Pod 的次要 IP 地址范围的集群大小调整注意事项
创建集群后,Pod 的次要 IP 地址范围大小便无法再更改。您必须仔细规划此范围的大小,以满足当前和未来的工作负载需求。Pod 的 IP 地址空间不足可能会导致调度失败,并阻止集群伸缩。
如果您不确定所需的大小,建议您从较大的范围开始,例如 /21
,这是使用 Google Cloud CLI 创建的集群的默认范围。较大的范围可为中等规模的集群提供足够的 IP 地址,并让您能够灵活应对未来的增长。如果 Pod IP 地址耗尽,您可以使用不连续的多 Pod CIDR 添加更多 Pod IP 地址范围。
不过,如果您在 IP 地址空间受限的环境中工作,可能需要使用较小的范围。在这种情况下,您可以减少每个节点的最大 Pod 数量。减少每个节点的最大 Pod 数量可使每个节点拥有更小的 Pod CIDR 范围,从而使更多节点能够适应整个集群的更小 Pod 次要范围。此配置需要在每个节点的 Pod 密度与集群中的节点总数之间做出权衡。
如需计算集群可支持的最大 Pod 数,您需要为每个节点的 Pod 数和 CIDR 范围提供输入值。GKE 会使用这些输入来确定节点和 Pod 的地址范围大小。
用户指定的值
这些是您在创建集群或节点池时提供的值。
Q
:每个节点的 Pod 数上限。- 对于 Autopilot 集群,
Q
是固定的(目前为 32)。 - 对于标准集群,您可以配置
Q
。
- 对于 Autopilot 集群,
DS
:Pod 子网的前缀长度。例如,对于 CIDR 范围/17
,前缀长度为17
。S
:主子网的前缀长度。例如,对于 CIDR 范围/24
,前缀长度为24
。
计算值
GKE 会根据您的输入计算以下值。
M
:每个节点 Pod 范围的网络掩码大小。none M = 31 - ⌈log₂(Q)⌉
使用 ceiling 函数 (⌈ ⌉
) 向上舍入到最接近的整数。HM
:节点 Pod 范围网络掩码的主机位数。none HM = 32 - M
HD
:所选 CIDR Pod 子网网络掩码的主机位数。none HD = 32 - DS
MN
:Pod 子网可支持的节点数上限。none MN = 2^(HD - HM)
MP
:Pod 子网可支持的 Pod 数量上限。none MP = MN * Q
N
:主要范围内的可用 IP 地址数量。none N = 2^(32-S) - 4
重要说明:
- 次要范围中的所有 IP 地址都可用于 Pod。
- 这些计算结果是理论上的最大值。实际性能可能会受到其他因素的影响。
示例:
假设您要创建具有以下配置的 GKE Autopilot 集群:
- Pod 子网 CIDR 为
/17
(DS
= 17)。 - 每个节点最多 32 个 Pod (
Q
= 32)。
计算 Pod 数上限:
M = 31 - ⌈log₂(32)⌉ = 26
HM = 32 - 26 = 6
HD = 32 - 17 = 15
MN = 2(15 - 6) = 512
MP = 512 * 32 = 16,384
此集群最多可支持 512 个节点和 16,384 个 Pod。
减少 Pod 数上限
减少每个节点的最大 Pod 数量可以使集群拥有更多节点,因为每个节点所需的总 IP 地址空间较小。或者,您可以通过在创建集群时为 Pod 指定较小的 IP 地址空间来支持集群中相同数量的节点。
减少每个节点的最大 Pod 数量也可以创建需要较少 IP 地址的较小集群。例如,每个节点有 8 个 Pod,每个节点分配一个 /28 CIDR。这些 IP 地址范围加上您定义的子网和次要范围决定了成功创建集群所需的 IP 地址数量。
您可以在创建集群和节点池时配置每个节点的最大 Pod 数量。
后续步骤
- 了解如何创建 VPC 原生集群。
- 了解如何向集群添加更多 Pod IP 地址。
- 了解迁移到 GKE 时的 IP 地址管理策略。
- 了解 GKE IP 地址利用率数据分析。