VPC 原生集群

本页面简要介绍 Google Kubernetes Engine (GKE) 中的 VPC 原生集群。

概览

在 GKE 中,系统可以根据集群将流量从一个 Pod 路由到另一个 Pod 的方式来区分集群。使用别名 IP 地址范围的集群称为“VPC 原生集群”。在 VPC 网络中使用自定义静态路由的集群称为“基于路由的集群”

VPC 原生集群的优势

VPC 原生集群具有多种优势:

  • Pod IP 地址可在集群的 VPC 网络和通过 VPC 网络对等互连与之相连的其他 VPC 网络中进行原生路由。

  • 在集群中创建 Pod 之前,Pod IP 会预留在 VPC 网络中。这可防止与 VPC 网络中其他资源发生冲突,让您更好地规划 IP 地址分配。

  • Pod IP 地址范围不依赖于自定义静态路由。它们不会消耗系统生成的路由配额和自定义静态路由配额。自动生成的子网路由处理 VPC 原生集群的路由。

  • 您可以创建仅应用于 Pod IP 地址范围而不是集群节点上任何 IP 地址的防火墙规则

  • 通常,Pod IP 地址范围和子网次要 IP 地址范围可以通过 Cloud Router 与连接到 Cloud VPN 或 Cloud Interconnect 的本地网络访问。

默认集群网络模式

VPC 原生是 GKE 1.21.0-gke.1500 及更高版本中所有集群的默认网络模式。对于早期版本,默认的集群网络模式取决于集群的创建方式。

下表列出了 GKE 集群版本的默认集群网络模式和集群创建方法。

GKE 版本 集群创建方法 集群网络模式
所有版本 Google Cloud Console VPC 原生
1.21.0-gke.1500 及更高版本 Kubernetes Engine API 或 Cloud SDK VPC 原生
1.21.0-gke.1500 之前的版本 Kubernetes Engine API 或 Cloud SDK 基于路由

您还可以在创建集群时指定 --no-enable-ip-alias 标志来创建基于路由的集群。

VPC 原生集群的 IP 地址范围

创建 VPC 原生集群时,您需要在 VPC 网络中指定子网。集群使用三个唯一的子网 IP 地址范围

  • 它将子网的主要 IP 地址范围用于所有节点 IP 地址。
  • 它将一个次要 IP 地址范围用于所有 Pod IP 地址。
  • 它将另一个次要 IP 地址范围用于所有 Service(集群 IP)地址。

下表汇总了节点、Pod 和 Service 的 IP 地址范围:

范围 说明 示例
节点

节点 IP 地址是从与您的集群关联的子网的主要 IP 地址范围中分配的。

节点 IP 地址和 Pod 的子网次要 IP 地址范围大小都会限制集群可支持的节点数量。如需了解详情,请参阅节点限制范围

如果您打算创建一个包含 900 个节点的集群,则该集群的子网的主要 IP 地址范围必须至少为 /22(2(32-22) = 210 = 1024 个地址)。在这 1024 个地址中,有 1020 个地址可用,因为每个主要 IP 地址范围内预留了 4 个 IP 地址

如需了解详情,请参阅子网主要 IP 地址范围Pod 的子网次要 IP 地址范围

pod

Pod IP 地址取自 Pod 的集群子网次要 IP 地址范围。除非设置的每个节点的最大 Pod 数不同,否则 GKE 会针对每个节点上运行的 Pod 向该节点分配一个 /24 别名 IP 范围(256 个地址)。在每个节点上,这 256 个别名 IP 地址用于最多支持 110 个 Pod。

对于一个包含 900 个节点、每个节点最多支持 110 个 Pod 的集群,Pod 需要 900 × 256 = 230400 个 IP 地址。(每个节点分配有一个网络掩码大小为 /24 的别名 IP 范围。)此集群需要一个子网,其 Pod 的次要 IP 范围的子网掩码不大于 /14。 该次要 IP 范围为 Pod 提供了 2(32-14) = 218 = 262144 个 IP 地址。

如需了解详情,请参阅 Pod 的子网次要 IP 地址范围

Service

Service(集群 IP)地址取自 Service 的集群子网次要 IP 地址范围。您必须确保此范围足够大,能够为您的集群中托管的所有 Kubernetes Service 提供地址。

对于运行最多 3000 个 Service 的集群,您需要 3000 个集群 IP 地址。您需要一个大小为 /20 或更大的次要范围。大小为 /20 的 IP 地址范围会生成 2(32-20) = 212 = 4096 个 IP 地址。

如需了解详情,请参阅 Service 的子网次要 IP 地址范围

内部 IP 地址

您用于 VPC 原生集群子网的 IP 地址必须来自有效子网范围。有效范围包括专用 IP 地址(RFC 1918 等)以及以不公开方式使用的公共 IP 地址。如需详细了解有效子网范围,请参阅 Virtual Private Cloud 文档中的有效范围受限范围

如需了解如何启用这些范围,请参阅使用非 RFC 1918 专用 IP 地址范围

如需了解如何在专用集群中使用这些范围,请参阅启用以不公开方式使用的公共 IP 地址范围

次要范围分配方法

您可以使用以下两种方法之一将 Pod IP 地址范围和 Service (ClusterIP) 地址范围分配给 VPC 原生集群:

由 GKE 管理(默认)

GKE 可以为您创建和管理子网的次要范围。创建集群时,您需要为 Pod 和 Service 指定完整的 CIDR 范围或网络掩码大小。例如,您可以为 Pod 指定 10.1.0.0/16,为 Service 指定 10.2.0.0/20;或者为 Pod 指定 /16,为 Service 指定 /20

如果您同时创建集群和子网,则 Pod IP 地址范围和 Service IP 地址范围由 GKE 管理。

由用户管理

您可以创建子网的次要 IP 地址范围,然后创建使用这些范围的集群。如果您手动创建次要范围,则必须自行管理它们。

您可以创建的最小 IP 地址范围是 /28。但是,您使用的范围必须至少足以创建一个节点。最小可用范围取决于每个节点的最大 pod 数量。如需了解每个节点最大 pod 数量的不同值的最小可用 CIDR 范围,请参阅优化 IP 地址分配中的表格。

如果 pod 的 IP 地址范围耗尽,您必须创建一个 pod 地址范围更大的新集群,或者在降低节点池的 --max-pods-per-node 后重新创建节点池。

共享 IP 地址范围

主要范围、Pod 次要范围和 Service 次要范围可以在各集群之间共享,但不建议采用这种配置,原因如下:

  • 如果您为两个或多个 VPC 原生集群共享 Pod 次要范围,则一个集群可以使用很大一部分共享 Pod IP 地址范围,使其他集群没有足够的 IP 进行扩展。
  • 如果您共享 Service 次要范围,则集群的 Service IP 地址可能会重叠。VPC 范围 Cloud DNS for GKE 不支持共享 Service 的次要范围。

每个 VPC 原生集群都必须分配有一个用于其 Service 的次要 IP 地址范围(集群 IP 地址范围)。最好在子网上创建次要 IP 地址范围,使每个集群具有两个专用的次要范围:一个用于 Pod,一个用于 Service。

与基于路由的集群的差异

Pod 和 Service (ClusterIP) 地址的分配方案不同于基于路由的集群使用的方案。您必须在集群的子网中选择或创建两个次要 IP 地址范围(一个用于 Pod,另一个用于 Service),而不是为 Pod 和 Service 共同指定一个 CIDR。

共享 VPC 注意事项

共享 VPC 环境中创建 VPC 原生集群时,共享 VPC 宿主项目中的项目所有者、编辑者或具有 Network Admin 角色的 IAM 主帐号必须手动创建集群的子网 IP 地址范围和次要 IP 地址范围。创建集群的 Service Project Admin 必须至少拥有共享 VPC 网络宿主项目中所需子网的子网级权限

在共享 VPC 环境中,次要 IP 地址范围无法通过 GKE 管理。共享 VPC 宿主项目中的 Network Admin 必须先创建子网 IP 范围和次要 IP 地址范围,然后才能创建集群。有关如何在共享 VPC 网络中设置 VPC 原生集群的示例,请参阅设置使用共享 VPC 的集群

IP 地址范围规划

以下部分中的信息可以帮助您计算集群所用子网的主要和次要 IP 地址范围的大小。

子网主要 IP 地址范围

每个子网都必须具有一个主要 IP 地址范围。即使 Google Cloud 资源使用子网,您也可以随时扩展主要 IP 地址范围;但是,在创建子网后,您无法缩减或更改子网的主要 IP 地址方案。 主要 IP 地址范围的前两个 IP 地址和最后两个 IP 地址由 Google Cloud 预留。

下表显示了在特定的子网主要 IP 地址范围大小情况下,您可以在所有使用该子网的集群中创建的最大节点数。

子网主要 IP 范围 最大节点数
/29
子网主要 IP 范围的最小大小
4 个节点
/28 12 个节点
/27 28 个节点
/26 60 个节点
/25 124 个节点
/24 252 个节点
/23 508 个节点
/22 1020 个节点
/21 2044 个节点
/20
自动模式网络中的子网主要 IP 范围的默认大小
4092 个节点
/19 8188 个节点
/8
子网主要 IP 范围的最大大小
16777212 个节点

有用的公式

您可以使用如下公式进行以下计算:

  • 计算指定网络掩码可以支持的最大节点数 N。使用 S 表示网络掩码的大小,其有效范围介于 829 之间(含边界值)。

    N = 2(32 -S) - 4

  • 计算支持最多 N 个节点所需的网络掩码大小 S

    S = 32 - ⌈log2(N + 4)⌉

    ⌈⌉ceiling (最小整数) 函数,表示向上取整到下一个整数。网络掩码大小的有效范围 S 介于 829 之间(含边界值)。

Pod 的子网次要 IP 地址范围

仔细规划 Pod 的次要 IP 地址范围。尽管子网的次要 IP 地址范围可以替换,但不支持此操作,因为这可能会导致集群处于不稳定状态。

但是,您可以使用连续的多 Pod CIDR 创建其他 Pod IP 地址范围。

下表显示了在给定 Pod 使用的子网次要 IP 地址范围大小的情况下,您可以在所有使用该子网的集群中创建的最大节点数和 Pod 数。此表假定每个节点的最大 Pod 数110(默认的最大 Pod 密度)。

Pod 的子网次要 IP 范围 最大 Pod IP 地址数 最大节点数 最大 Pod 数
/24
次要范围分配方法由用户管理时的最小 Pod IP 范围
256 个地址 1 个节点 110 个 Pod
/23
仅在次要范围分配方法由用户管理时可用
512 个地址 2 个节点 220 个 Pod
/22
仅在次要范围分配方法由用户管理时可用
1024 个地址 4 个节点 440 个地址
/21
次要范围分配方法由 GKE 管理时的最小 Pod IP 范围
2048 个地址 8 个节点 880 个 Pod
/20 4096 个地址 16 个节点 1760 个 Pod
/19 8192 个地址 32 个节点 3520 个 Pod
/18 16384 个地址 64 个节点 7040 个 Pod
/17 32768 个地址 128 个节点 14080 个 Pod
/16 65536 个地址 256 个节点 28160 个 Pod
/15 131072 个地址 512 个节点 56320 个 Pod
/14
次要范围分配方法由 GKE 管理时用于 Pod 的子网次要 IP 范围的默认大小
262144 个地址 1024 个节点 112640 个 Pod
/13 524288 个地址 2048 个节点 225280 个 Pod
/12 1048576 个地址 4096 个节点 450560 个 Pod
/11
2097152 个地址 8192 个节点 901120 个 Pod
/10
4194304 个地址 16384 个节点 1802240 个节点
/9
最大 pod 地址范围
8388608 个地址 32768 个节点 3604480 个节点

如果您更改了每个节点的最大 Pod 数,您可以使用以下公式计算 Pod 的子网次要 IP 地址范围可以支持的最大节点数和最大 Pod 数:

  1. 计算每个节点 Pod 范围的网络掩码大小 M
    M = 31 - ⌈log2(Q)⌉ 其中:

    • Q 是每个节点的 Pod 数
    • ⌈⌉ 是 ceiling (最小整数) 函数,表示向上取整到下一个整数
  2. 计算用于 Pod 的子网次要 IP 地址范围可支持的最大节点数 N
    N = 2(M - S) 其中:

    • M 是第一步中计算得出的用于 Pod 的每个节点别名 IP 地址范围的网络掩码大小
    • S 是子网的次要 IP 地址范围的子网掩码大小
  3. 计算用于 Pod 的子网次要 IP 地址范围可支持的最大 Pod 数 P
    P = N × Q 其中:

    • N 是在上一步计算得出的最大节点数
    • Q 是每个节点的 Pod 数

Service 的子网次要 IP 地址范围

仔细规划 Service 的次要 IP 地址范围。由于这也是一个子网次要 IP 地址范围,因此您只能在没有 Google Cloud 资源使用它时进行替换。只要集群将此范围用于 Service(集群 IP 地址),此范围便无法更改。

如果您使用多集群服务,则 ServiceImport 对象会使用 Service 的次要 IP 范围内的 IP 地址。

下表显示了在给定了 Service 的子网次要 IP 地址范围大小的情况下,您可以在使用该子网的单个集群中创建的最大 Service 数。

Service 的次要 IP 范围 最大 Service 数
/27
最小 Service 地址范围
32 个 Service
/26 64 个 Service
/25 128 个 Service
/24 256 个 Service
/23 512 个 Service
/22 1024 个 Service
/21 2048 个 Service
/20
次要范围分配方法由 GKE 管理时用于 Service 的子网次要 IP 范围的默认大小
4096 个 Service
/19 8192 个 Service
/18 16384 个 Service
/17 32768 个 Service
/16
最大 Service 地址范围
65536 个 Service

节点限制范围

指定 GKE 集群的最大 Pod 数和最大 Service 数受集群次要范围的限制。集群中节点的最大数量受集群子网的主要 IP 地址范围大小和集群的 Pod 地址范围大小的限制

Cloud Console 会显示如下错误消息,指示子网的主要 IP 地址范围或集群的 Pod IP 地址范围(用于 Pod 的子网次要 IP 地址范围)已用尽:

Instance [node name] creation failed: IP space of [cluster subnet] is
exhausted

您可以通过扩展主要子网为节点添加更多 IP 地址,也可以使用不连续的多 Pod CIDR 为 Pod 添加新的 IP 地址。如需了解详情,请参阅pod 没有足够的可用 IP 空间

后续步骤