GKE 和其他 Kubernetes 实现使用的网络模型比较

GKE 和其他 Kubernetes 实现使用的网络模型比较

2024.09.10

本文档描述了 Google Kubernetes Engine (GKE) 使用的网络模型,以及它与其他 Kubernetes 环境中的网络模型有何不同。本文档介绍了以下概念:

典型的网络模型实现

您可以通过各种方式实现 Kubernetes 网络模型。但是,任何实现都始终需要满足以下要求:

20 多种不同的 Kubernetes 网络模型实现可以满足这些要求。

这些实现可以分为三种类型的网络模型。这三种模型的不同体现在以下方面:

每种成熟的云都实现了上述一个或多个模型类型。 下表列出了三种常用的模型类型,以及使用这些模型的 Kubernetes 实现:

网络模型名称用于这些实现
完全集成或平面GKEAmazon Elastic Kubernetes Service (EKS)使用 Azure CNI(高级)网络时的 Azure Kubernetes 服务 (AKS)
孤岛模式或网桥模式使用默认的 Kubenet(基本)网络时的 Azure Kubernetes Service (AKS)Oracle Container Engine for Kubernetes (OKE)许多本地 Kubernetes 实现
隔离或气隙隔离不常用于 Kubernetes 实现,但当集群部署在单独的网络或虚拟私有云 (VPC) 中时,可用于任何实现

本文档在介绍这些网络模型时会说明其对连接的本地网络的影响。但是,您可以将针对连接的本地网络描述的概念应用于通过虚拟专用网 (VPN) 或专用互连(包括与其他云提供商的连接)连接的网络。对于 GKE,这些连接包括通过 Cloud VPNCloud Interconnect 的所有连接。

完全集成的网络模型

完全集成的网络(或平面)模型可让您轻松地与 Kubernetes 外部以及其他 Kubernetes 集群中的应用进行通信。主要的云服务提供商通常会实现此模型,因为这些提供商可以将其 Kubernetes 实现与其软件定义网络 (SDN) 紧密集成。

使用完全集成的模型时,用于 Pod 的 IP 地址会在 Kubernetes 集群所在的网络中路由。此外,底层网络知道 Pod IP 地址位于哪个节点上。在许多实现中,同一节点上的 Pod IP 地址来自预先分配的特定 Pod IP 地址范围。但是,此预先分配的地址范围不是必需的。

下图展示了完全集成的网络模型中的 Pod 通信选项:

上面的完全集成的网络模型图表显示了以下通信模式:

该图还显示,不同集群的 Pod IP 地址范围也不同。

完全集成的网络模型可用于以下实现:

在 Azure 中,AKS 在使用 Azure CNI(高级网络)时实现此模型。此实现不是默认配置。在此实现中,每个 Pod 都会从子网获取 IP 地址。您还可以配置每个节点的最大 Pod 数量。因此,该节点上 Pod 的预留 IP 地址数量与每个节点的最大 Pod 数量相同。

使用完全集成的网络模型有以下优势:

使用完全集成的网络模型有以下缺点:

孤岛模式网络模型

孤岛模式网络模型(或网桥模式)通常用于无法与底层网络进行深度集成的本地 Kubernetes 实现。使用孤岛模式网络模型时,Kubernetes 集群中的 Pod 可以通过某种网关或代理与集群外部的资源进行通信。

下图展示了孤岛模式网络模型中的 Pod 通信选项:

上面的孤岛模式网络模型示意图展示了 Kubernetes 集群中的 Pod 如何直接相互通信。该图还显示,在与集群外部的应用或其他集群中的 Pod 通信时,集群中的 Pod 需要使用网关或代理。集群和外部应用之间的通信需要单个网关,而集群到集群的通信需要两个网关。两个集群之间的流量在离开第一个集群时通过网关,在进入另一个集群时通过另一个网关。

在隔离的网络模型中实现网关或代理有不同的方法。以下实现是两种最常见的网关或代理:


下图展示了将节点用作网关时的实现模式:

上图显示,在孤岛模式下使用代理不会影响集群内的通信。集群中的 Pod 仍然可以彼此直接通信。但是,该图还显示了从 Pod 到其他集群或非 Kubernetes 应用的通信如何通过可访问集群网络和目标网络的代理。此外,从外部进入集群的通信也会通过相同类型的代理。

孤岛模式网络模型可用于以下实现:

使用孤岛模式网络模型有以下优势:

使用孤岛模式网络模型有以下缺点:

隔离网络模型

隔离(或网闸隔离)网络模型最常用于不需要访问更大的公司网络的集群(除非通过面向公众的 API)。使用隔离网络模型时,每个 Kubernetes 集群都是独立的,并且无法使用内部 IP 地址与网络的其余部分通信。集群位于其专用网络上。如果集群中的任何 Pod 需要与集群外部的服务进行通信,则此通信需要为入站流量和出站流量使用公共 IP 地址。

下图展示了隔离网络模型中的 Pod 通信选项:

上面的隔离网络模型示意图展示了 Kubernetes 集群中的 Pod 可以直接相互通信。该图还显示,Pod 无法使用内部 IP 地址与其他集群中的 Pod 通信。此外,Pod 只有在满足以下条件时才能与集群外部的应用通信:

最后,上图显示了如何在不同的环境之间重复使用 Pod 和节点的同一 IP 地址空间。

Kubernetes 实现通常不使用隔离网络模型。但是,您可以在任何实现中实施隔离网络模型。您只需在单独的网络或 VPC 中部署 Kubernetes 集群,而无需连接到其他服务或企业网络。生成的实现具有与隔离网络模型相同的优缺点。

使用隔离网络模式有以下优势:

使用隔离网络模型有以下缺点:

无私密通信。不允许使用内部 IP 地址与网络中的其他集群或其他服务进行通信。

GKE 网络模型

GKE 使用完全集成的网络模型,在该模型中,集群部署在 Virtual Private Cloud (VPC) 网络中,该网络也可以包含其他应用。如需创建 GKE 集群,您可以使用 VPC 原生集群基于路由的集群。这两种情况下,Pod IP 地址在 VPC 网络中以原生方式路由。

我们建议您为 GKE 环境使用 VPC 原生集群。您可以在标准模式或 Autopilot 模式下创建 VPC 原生集群。如果您选择 Autopilot 模式,VPC 原生模式始终处于启用状态,且无法关闭。以下段落介绍了标准模式下的 GKE 网络模型,以及有关 Autopilot 模式差异的说明。

使用 VPC 原生集群时,Pod IP 地址是每个节点上的次要 IP 地址。此外,每个节点都分配有一个 Pod IP 地址范围的特定子网,该子网是您在创建集群时从内部 IP 地址空间中选择的。默认情况下,VPC 原生集群会为每个节点分配一个 /24 子网,以用作 Pod IP 地址。/24 子网对应于 256 个 IP 地址。在 Autopilot 模式下,集群使用对应于 64 个地址的 /26 子网,您无法更改此子网设置。

由于 Pod IP 地址在 VPC 网络中可路由,因此默认情况下 Pod 可以从以下资源接收流量:

从 Pod 与集群外部的服务进行通信时,IP 地址伪装代理会控制流量对这些服务的显示方式。IP 地址伪装代理处理专用和外部 IP 地址的方式不同,如以下项目符号列表所述:

您还可以在 VPC 网络或连接的网络中使用以非公开方式使用的公共 IP (PUPI) 地址。如果您使用 PUPI 地址,您仍然可以从完全集成的网络模型中受益,并直接将 Pod IP 地址视为来源。如需实现这两个目标,您必须在 nonMasqueradeCIDRs 列表中添加 PUPI 地址

下图展示了 Pod 如何在 GKE 网络模型中进行通信:

您还可以在 VPC 网络或连接的网络中使用以非公开方式使用的公共 IP (PUPI) 地址。如果您使用 PUPI 地址,您仍然可以从完全集成的网络模型中受益,并直接将 Pod IP 地址视为来源。如需实现这两个目标,您必须在 nonMasqueradeCIDRs 列表中添加 PUPI 地址

下图展示了 Pod 如何在 GKE 网络模型中进行通信:

您还可以在 VPC 网络或连接的网络中使用以非公开方式使用的公共 IP (PUPI) 地址。如果您使用 PUPI 地址,您仍然可以从完全集成的网络模型中受益,并直接将 Pod IP 地址视为来源。如需实现这两个目标,您必须在 nonMasqueradeCIDRs 列表中添加 PUPI 地址

下图展示了 Pod 如何在 GKE 网络模型中进行通信:

上图显示了 GKE 环境中的 Pod 如何使用内部 IP 地址直接与以下资源进行通信:

该图还显示了当 Pod 需要使用外部 IP 地址与应用通信时会发生什么情况。当流量离开节点时,Pod 所在的节点会使用 SNAT 将 Pod 的 IP 地址映射到节点的 IP 地址。流量离开节点后,Cloud NAT 会将节点的 IP 地址转换为外部 IP 地址。

为了获得本文档前面介绍的优势(尤其是使 Pod IP 地址在所有遥测数据中可见的优势),Google 选择了完全集成的网络模型。在 GKE 中,Pod IP 地址在 VPC 流日志(包括元数据中的 Pod 名称)、数据包镜像防火墙规则日志记录以及您自己的应用日志中对非伪装目标公开。

相關文章