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 控制台 VPC 原生
1.21.0-gke.1500 及更高版本 Kubernetes Engine API 或 Google Cloud CLI VPC 原生
1.21.0-gke.1500 之前的版本 Kubernetes Engine API 或 Google Cloud CLI 基于路由

您还可以在创建集群时指定 --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 地址。如需详细了解有效子网范围,请参阅 VPC 文档中的有效范围受限范围

如需了解如何启用这些范围,请参阅使用非 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 地址范围,然后创建使用这些范围的集群。如果您手动创建次要范围,则必须自行管理它们。

在不使用非连续性多 Pod CIDR 的情况下,您可以创建的最小 IP 地址范围为 /28,但该范围仅允许创建 1 个节点(最多包含 8 个 Pod)。您应该使用足够大的范围,以满足您的最大节点数需求。最小可用范围还取决于每个节点的 Pod 数上限

如需了解不同的每节点 Pod 数上限值对应的最小可用 CIDR 范围,请参阅优化 IP 地址分配中的表格。

如果您用尽 Pod 的 IP 地址范围,则必须执行以下任一操作:

与基于路由的集群的差异

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

共享 VPC 注意事项

共享 VPC 环境中创建 VPC 原生集群时,共享 VPC 宿主项目中的项目所有者、编辑者或具有 Network Admin 角色的 Identity and Access Management (IAM) 主帐号必须手动创建集群的子网 IP 地址范围和次要 IP 地址范围。创建集群的服务项目管理员必须至少拥有共享 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 地址范围,因此一旦创建集群,此范围便无法更改。

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

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

Service 的次要 IP 范围 最大 Service 数
/28
次要范围分配方法由用户管理时的最小 Service 地址范围
16 个 Service
/27
次要范围分配方法由 GKE 管理时的最小 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 集群共享 IP 地址范围

您可以在同一子网中的集群之间共享主要范围、Pod 的次要 IP 地址范围以及 Service 的次要 IP 地址范围。此行为适用于标准集群和 Autopilot 集群。

如果您有集中管理集群基础架构的团队,则可能需要共享 IP 地址范围。您可以为 Pod、Service 和节点创建三个范围,并重复使用或共享这些范围(尤其是在共享 VPC 模型中),从而减少开销。这样由于不需要网络管理员为每个集群创建特定子网,因而能够更轻松地管理 IP 地址。

共享节点的主要 IP 地址范围

如果您在子网中创建多个集群,则系统默认会共享节点的主要 IP 地址范围。

共享节点的主要 IP 地址时具有以下限制:

  • 如果您对两个或更多 VPC 原生集群共享节点的主要 IP 地址范围,则一个集群可能会使用大部分共享的 Pod IP 地址范围,让没有足够 IP 地址的其他集群进行扩展。

共享 Pod 的次要 IP 地址范围

当您共享 Pod 的次要范围时,每个 Pod 仍会获得唯一的 IP 地址。共享 Pod 的次要 IP 地址范围时具有以下限制:

  • 如果您对两个或更多 VPC 原生集群共享 Pod 的次要 IP 地址范围,则一个集群可能会使用大部分共享的 IP 地址范围,让没有足够 IP 地址的其他集群进行扩展。

共享 Service 的次要 IP 地址范围

使用用户管理的次要范围时,您可以在同一子网中的多个集群之间共享 Service 的次要 IP 地址范围。

如果您路由到此范围内的 Service IP 地址,GKE 会将该 IP 地址解析为来源节点或主机节点上的后端 Pod IP 地址。这意味着 Service IP 地址无法路由,但可以在不同的集群中使用地址。

共享 Service 的次要 IP 地址范围具有以下优势:

  • 减少在子网上为 Service 创建的唯一次要 IP 地址范围的数量
  • 使用较少的 IP 地址

共享 Service 的次要 IP 地址范围时具有以下限制:

节点限制范围

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

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

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

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

双栈网络

通过双栈网络,您可以定义 GKE 如何将 IP 地址 (ipFamilies) 分配给以下对象:

  • 对于 Pod 和节点,GKE 会同时分配 IPv4 和 IPv6 地址。
  • 对于 Service,GKE 会分配单栈(仅 IPv4 或仅 IPv6)或双栈地址。

在最新版本的 GKE 1.24 中,您可以为独立和共享 VPC 网络上的 GKE 集群启用双栈网络。您还可以应用启用了双栈网络的网络政策。

优势

双栈网络具有以下优点:

  • 启用端到端 IPv6 通信。
  • 与 NAT 或 IP 隧道相比,性能更佳;这是因为没有 IPv6 到 IPv4 的转换。

限制和局限

对 GKE 使用双栈网络具有以下限制和局限:

  • 双栈网络仅适用于启用了 GKE Dataplane V2VPC 原生集群
  • 双栈网络仅支持自定义模式 VPC 中的子网。如需了解详情,请参阅 Google Cloud 中的 VPC 网络类型
  • Pod 或节点不支持单栈 IPv6 地址。
  • LoadBalancer Service 不支持 IPv6。
  • Windows 节点不支持 IPv6。
  • 现有集群不支持 IPv6。

在创建公共或专用 IPv6 集群之前,请考虑上述限制和局限。如需了解详情,请参阅如何创建具有双栈网络的 VPC 原生集群

公共和专用 IPv6 集群

下表总结了具有双栈网络行为的公共和专用 IPv6 集群及其配置:

集群类型 IP 地址分配 子网范围 配置
公开

GKE 会分配:

  • 可路由到互联网的外部 IPv6 地址。
  • 连接到节点的专用和公共 IPv4 地址。
2600:1900/28 创建一个子网,并将 --ipv6-access-type 标志设置为 EXTERNAL
专用

GKE 会分配:

  • 不会路由到互联网的内部 IPv6 地址。
  • 仅连接到节点的专用 IPv4 地址。

专用集群可以使用 Cloud NAT 来访问公共互联网。但是,Cloud NAT 不支持 IPv6 地址。

来自 fd20::/20(它是整个 ULA 范围的一部分:fc00::/7)。

创建一个子网,并将 --ipv6-access-type 标志设置为 INTERNAL

专用 IPv6 子网访问类型只能在使用唯一本地 IPv6 单播地址 (ULA) 的自定义模式 VPC 网络上创建。如需了解详情,请参阅如何使用 VPC 网络

架构

当您创建具有双栈网络的集群时,Google Cloud 和 GKE 会分配以下范围:

  • Google Cloud 会将每个子网的 /64 范围预留为主要范围。
  • Google Cloud 会从主要范围中预留一个 /96 每节点范围,用作主节点 IP 地址范围。
  • GKE 会从主节点 IP 地址范围中预留一个 /112 每节点范围,用作该节点的 Pod IP 地址范围。通过双栈网络,Pod 会从整体 Pod IP 地址范围获取其 IPv6 地址(类似于节点),而不是从预留给 IPv4 地址的 Pod 次要范围中获取。

    整体 Pod IP 地址范围由主节点 IP 范围内的非重叠范围组成。因此,此 Pod IP 地址范围是不连续的。

  • 每个集群都分配有一个 /112 范围以用于服务。此范围来自为 GKE 的次要 Service IP 地址范围预留的 Google 专用地址范围内的 /64 范围。

下图展示了 Google Cloud 和 GKE 如何分配 IPv6 地址:

在该图中,VPC 子网的主要范围为 2600:1900:0:1::/64,而 GKE Service 的预留范围为 2600:2D00:0:4::0:0/64。集群中的每个节点都有一个 /96 范围(主节点 IP 地址范围)和一个 /112 范围(Pod IP 地址范围)。此外,集群还具有一个 /112 次要 Service IP 地址范围。

服务

您可以创建 ClusterIPNodePort 类型的 IPv6 Service。

您可以使用 ClusterIP 或 NodePort 类型的 Service 公开 Deployment。对于每个 Deployment,您可以将 ipFamiliesipFamilyPolicy 字段定义为 IPv4、IPv6 或双栈 Service。如需了解详情,请参阅有关如何设置 Deployment 的示例

后续步骤