如需构建可伸缩且安全的 Google Kubernetes Engine (GKE) 集群,您必须有效管理 IP 寻址。本文档全面概述了 GKE 如何使用 IP 地址进行集群通信、支持的网络模型以及有效管理 IP 地址的最佳实践。
本文档适用于为组织设计和架构网络的云架构师和网络专家。如需详细了解 Google Cloud中的常见角色和示例任务,请参阅常见的 GKE Enterprise 企业用户角色和任务。
在继续操作之前,请确保您熟悉以下概念:
IP 地址如何连接 GKE 组件
GKE 基于 Kubernetes 网络模型构建,该模型要求每个组件都具有不同的 IP 地址才能进行通信。以下部分介绍了 GKE 如何为核心集群组件分配和使用 IP 地址:
节点:GKE 会从与节点池关联的子网的主要 IP 地址范围中为每个节点(即 Compute Engine 虚拟机实例)分配一个内部 IP 地址。此 IP 地址支持节点与 Kubernetes 控制平面之间的通信。节点还可以具有用于出站互联网访问的外部 IP 地址。
Pod:GKE 遵循 Kubernetes 的“每个 Pod 一个 IP”模型,为每个 Pod 分配一个来自节点 Pod CIDR 范围的唯一 IP 地址。在 GKE 中,VPC 网络以原生方式路由 Pod IP 地址。这种内置的可路由性可实现 Pod 之间的直接通信(即使跨不同节点),而无需进行网络地址转换 (NAT)。单个 Pod 内的所有容器共享同一个 IP 地址,并且可以通过
localhost进行通信。服务 (
ClusterIP):GKE 为每个ClusterIP、NodePort和LoadBalancer服务分配一个稳定的内部虚拟 IP 地址(即ClusterIP)。对于 IPv4 服务,GKE 会从专用次要 IP 地址范围(或从34.118.224.0/20范围)分配此地址。对于 IPv6 Service(在双栈和单栈 IPv6 集群中),GKE 不使用次要 IP 地址范围;而是从 Google 拥有的专用2600:2D00:0:4::0:0/64IPv6 地址范围中分配地址。此ClusterIP为一组 Pod 提供一个可靠的内部端点。当您向ClusterIP发送流量时,GKE 会自动将其负载均衡到该 Service 内的健康 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 所在节点的 Pod CIDR 范围中为每个 Pod 分配一个唯一的 IP 地址。 |
| Service (ClusterIP) | GKE 会为每个 Service 分配一个稳定的虚拟 IP 地址 (ClusterIP)。对于 IPv4 Service,GKE 会从集群 VPC 网络内的专用次要 IP 地址范围(或从 34.118.224.0/20)分配此地址。对于 IPv6 Service,GKE 不会使用次要 IP 地址范围。而是由 GKE 从 2600:2D00:0:4::0:0/64 范围分配地址。 |
| 控制平面 | 在专用集群中,GKE 控制平面在 Google 管理的租户项目中拥有自己的内部 IP 地址范围。此租户项目通常使用 Private Service Connect 连接到您的 VPC 网络。 |
| 负载均衡器 | 外部负载均衡器使用公共 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 寻址模型。在 IPv4 和双栈集群中,当您创建 Pod 时,GKE 会从 VPC 别名 IP 地址范围中分配其 IP 地址。在单栈 IPv6 集群中,GKE 不使用别名 IP 地址范围。相反,GKE 会直接从节点上的子范围分配 Pod IP 地址。这样一来,每个 Pod 的 IP 地址都可以在整个 VPC 网络中进行原生路由。这不仅能实现 Pod 之间的直接通信,还能实现 Pod 与其他Google Cloud 资源(如 Compute Engine 实例和 Cloud SQL 数据库)之间的直接通信。同样,GKE 会管理 VPC 网络中的 Kubernetes
ServiceIP 地址(例如ClusterIP)。当您创建用于外部公开的LoadBalancer服务时,GKE 会预配Google Cloud 负载均衡器。这些负载均衡器使用 VPC 网络中的公共或内部 IP 地址。GKE 使用 Google Cloud强大的 IP 寻址和网络基础设施,以可伸缩且安全的方式实现基于 Kubernetes IP 的网络概念。
GKE 网络模型:VPC 原生集群
GKE 通过使用 VPC 原生网络(一项核心 Google Cloud 功能)来实现 Kubernetes 网络模型。
在 IPv4 和双栈集群中,此模型使用别名 IP 地址范围:在 VPC 原生集群中,Kubernetes 会将 Pod IP 地址配置为节点虚拟网络接口上的别名 IP 地址范围。单栈 IPv6 集群直接从子网 CIDR 块分配节点和 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 的客户端和服务兼容。
您可以在创建集群时启用双栈网络,也可以将现有 IPv4 单栈集群更新为双栈。
单栈 IPv6(预览版)
单栈 IPv6 集群仅在整个集群数据平面(Pod、节点和 Service)中分配 IPv6 地址。此模型可绕过专用 IPv4 地址耗尽瓶颈 (RFC 1918),同时保持安全的内部或外部入站和出站连接。与使用别名 IP 地址范围的 IPv4 和双栈集群不同,单栈 IPv6 集群直接从子网 (/64) 为每个节点分配一个 /96 IPv6 地址子范围,并为每个节点上的 Pod 分配一个 /112 地址范围。服务 (ClusterIP) 会从 Google 拥有的专用 IPv6 地址范围 (2600:2D00:0:4::0:0/64) 接收地址。单栈 IPv6 集群还支持使用 BYOIPv6 EAP 流程配置的 BYOIP IPv6 地址范围。
如需详细了解单栈 IPv6 地址分配和行为,请参阅创建和管理单栈 IPv6 集群。
后续步骤
- 如需详细了解 GKE 默认网络模式的优势,请参阅关于 VPC 原生集群。
- 如需开始使用,请了解如何创建 VPC 原生集群。
- 如需创建仅 IPv6 集群,请参阅创建和管理单栈 IPv6 集群。
- 如需有关调整集群 IP 地址范围大小的指导,请参阅 VPC 原生集群的 IP 地址范围规划。
- 如需有关常见问题的帮助,请参阅排查 IP 伪装代理问题。