如需构建可扩缩且安全的 Google Kubernetes Engine (GKE) 集群,您必须有效地管理 IP 地址。本文档全面介绍了 GKE 如何使用 IP 地址进行集群通信、支持的网络模型,以及有效管理 IP 地址的最佳实践。
本文档适用于为组织设计和架构网络的云架构师和网络专家。如需详细了解 Google Cloud中的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
在继续操作之前,请确保您熟悉以下概念:
IP 地址如何连接 GKE 组件
GKE 基于 Kubernetes 网络模型构建,该模型要求每个组件都具有不同的 IP 地址才能进行通信。以下部分介绍了 GKE 如何为核心集群组件分配和使用 IP 地址:
节点:GKE 会为每个节点(即 Compute Engine 虚拟机实例)分配一个内部 IP 地址,该地址来自与其节点池关联的子网的主要 IP 地址范围。此 IP 地址可实现节点与 Kubernetes 控制平面之间的通信。节点还可以具有外部 IP 地址,以实现出站互联网访问。
Pod:按照 Kubernetes 的“每个 Pod 一个 IP 地址”模型,GKE 会从分配给节点的 Pod CIDR 范围中为每个 Pod 分配一个唯一的 IP 地址。在 GKE 中,VPC 网络以原生方式路由 Pod IP 地址。这种内置的可路由性可实现 Pod 之间的直接通信,即使是跨不同节点的 Pod 也是如此,而无需进行网络地址转换 (NAT)。单个 Pod 内的所有容器共享同一 IP 地址,并且可以通过
localhost进行通信。服务:GKE 会从专用的次要 IP 地址范围中为每个 Kubernetes 服务分配一个稳定的虚拟 IP 地址 (
ClusterIP)。此ClusterIP为一组 Pod 提供了一个可靠的端点。当您将流量发送到ClusterIP时,GKE 会自动将其负载均衡到相应服务中运行状况良好的 Pod。控制平面:在专用集群中,控制平面位于 Google 管理的租户项目中,并使用自己的内部 IP 地址范围。此租户项目会连接到您的 VPC 网络,从而在控制平面与集群的 VPC 网络中的节点之间实现安全通信。此连接通常使用 Private Service Connect。
负载均衡器:如需将应用公开给互联网或在 VPC 网络内公开应用,您可以将 GKE 配置为使用Google Cloud 负载均衡器。外部负载均衡器使用公共 IP 地址。 内部负载均衡器使用 VPC 网络的主要子网范围中的内部 IP 地址。
下表总结了 GKE 如何为集群组件分配 IP 地址:
| 组件 | IP 地址的分配方式 |
|---|---|
| 节点 | GKE 会为每个节点分配一个内部 IP 地址。 GKE 会从与节点所属节点池关联的子网的主要 IP 地址范围中分配此 IP 地址。此子网可以是集群的默认子网,也可以是其他子网。 |
| Pod | GKE 会从分配给每个节点的 Pod CIDR 范围中为每个 Pod 分配一个唯一的 IP 地址。 |
| 服务 (ClusterIP) | GKE 会从集群 VPC 网络内的专用次要 IP 地址范围中为每项服务分配一个稳定的虚拟 IP 地址 (ClusterIP)。 |
| 控制平面 | 在专用集群中,GKE 控制平面在 Google 管理的租户项目中具有自己的内部 IP 地址范围。此租户项目会连接到您的 VPC 网络,通常使用 Private Service Connect。 |
| 负载均衡器 | 外部负载均衡器使用公共 IP 地址。内部负载均衡器使用集群子网的主要 IP 地址范围中的内部 IP 地址。 |
Kubernetes IP 地址和 GKE 实现
如需有效使用 GKE,您必须了解抽象的 Kubernetes 网络模型与 GKE 在 Google Cloud上实现此模型的方式之间的区别。
Kubernetes IP 地址分配模型:开源 Kubernetes 项目规定,每个 Pod 都会获得一个唯一的 IP 地址。所有 Pod IP 地址都可以直接通信,而无需进行网络地址转换 (NAT)。这可确保 Pod 可以使用其分配的 IP 地址相互访问,从而实现扁平网络空间。
GKE IP 地址分配实现:GKE 通过与 VPC 原生网络集成,在 Google Cloud 上实现 Kubernetes IP 地址分配模型。创建 Pod 时,GKE 会从 VPC 别名 IP 地址范围中为其分配 IP 地址。这样一来,每个 Pod 的 IP 地址都可以在整个 VPC 网络中以原生方式路由。这样一来,不仅 Pod 之间可以进行直接通信,Pod 还可以与 Compute Engine 实例和 Cloud SQL 数据库等其他 Google Cloud 资源进行直接通信。同样,GKE 会管理 VPC 网络内的 Kubernetes
ServiceIP 地址(例如ClusterIP)。当您创建用于外部公开的LoadBalancer服务时,GKE 会预配Google Cloud 负载均衡器。这些负载均衡器使用 VPC 网络中的公共或内部 IP 地址。GKE 利用 Google Cloud强大的 IP 地址分配和网络基础设施,以可扩缩且安全的方式实现基于 Kubernetes IP 的网络概念。
GKE 网络模型:VPC 原生集群
GKE 通过使用 VPC 原生网络(一项核心 Google Cloud 功能)来实现 Kubernetes 网络模型。
此模型使用别名 IP 地址范围。在 VPC 原生集群中,Kubernetes 会将 Pod IP 地址配置为节点虚拟网络接口上的别名 IP 地址范围。
此实现具有以下几项关键优势:
- VPC 原生可路由性:Pod IP 地址可以直接在 VPC 网络中路由。这简化了网络设计,并实现了 Pod 与其他 Google Cloud 资源(例如 Compute Engine 实例和 Cloud SQL 实例)之间的直接低延迟通信。
- 节省路由配额:通过为 Pod 使用别名 IP 地址,GKE 不会为每个节点创建自定义静态路由。这样可以节省 VPC 路由配额,与旧版基于路由的集群相比,这是一个重大改进,对于大规模部署非常重要。
- 增强安全性:借助 VPC 原生可路由性,您可以将 VPC 原生防火墙规则直接应用于 Pod 流量,从而增强网络级安全性。
VPC 原生是所有 GKE 集群的默认和推荐网络模式。
为何有效的 IP 地址管理至关重要
为确保集群能够扩缩并保持应用运行状况,您必须有效地规划 IP 地址空间:
- 确保可扩缩性:有效规划节点、Pod 和 Service IP 地址范围,以防止 IP 地址用尽,并允许集群扩缩,而无需进行中断性网络重新架构。
- 保证可靠性:避免 GKE 集群与其他网络(例如通过 Cloud VPN 连接的本地环境)之间的 IP 地址范围重叠。重叠的范围可能会导致路由冲突、不可预测的行为和服务中断。
- 增强安全性:有效管理 IP 地址,以增强网络安全性。定义 Kubernetes 网络政策以控制 Pod 之间的流量,并配置防火墙规则以在网络级层实现工作负载隔离。
为集群选择 IP 寻址模型
GKE 支持多种网络堆栈配置,以满足您的网络需求,包括仅限 IPv4、双栈(IPv4 和 IPv6)以及即将推出的仅限 IPv6 的选项。
仅 IPv6(单栈)
这是标准且最常见的配置,其中所有集群组件都使用 IPv4 地址。即使在仅限 IPv4 的模型中,GKE 也提供了灵活性:
- RFC 1918 专用 IP 地址:为集群使用 RFC 1918 专用 IP 地址范围(例如
10.0.0.0/8)。 - 以非公开方式使用的公共 IP 地址 (PUPI):如果您的组织缺乏足够的专用 IP 地址空间,您可以使用公共 IP 地址范围在 VPC 网络中进行内部使用。使用 PUPI 时,您必须配置 IP 伪装代理。此代理会对来自 Pod 的出站流量执行来源网络地址转换 (SNAT)。如果不使用 SNAT,返回到使用 PUPI 的 Pod 的流量会通过公共互联网路由,并会失败。IP 伪装代理会通过将出站数据包的来源 IP 地址从 Pod 的 PUPI 更改为节点的内部 IP 地址来防止这种情况。这可确保返回流量正确路由回节点,然后转发到原始 Pod。
双栈(IPv4 和 IPv6)
双栈集群同时使用 IPv4 和 IPv6 协议。GKE 会为双栈集群中的节点、Pod 和 Service 同时分配 IPv4 和 IPv6 地址。此模型非常适合以下情况:
- 有助于逐步过渡到 IPv6。
- 确保与支持 IPv6 的工作负载以及现有的仅限 IPv4 的客户端和服务兼容。
您可以在创建集群时启用双栈网络,也可以将现有的单栈集群更新为双栈集群。
后续步骤
- 如需详细了解 GKE 默认网络模式的优势,请参阅关于 VPC 原生集群。
- 如需开始使用,请了解如何创建 VPC 原生集群。
- 如需有关确定集群 IP 地址范围大小的指南,请参阅 VPC 原生集群的 IP 地址范围规划。
- 如需有关常见问题的帮助,请参阅排查 IP 伪装代理的问题。