如需构建可伸缩且安全的 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 分配一个唯一的 IP 地址,该地址来自分配给节点的 Pod CIDR 范围。在 GKE 中,VPC 网络以原生方式路由 Pod IP 地址。这种内置的可路由性可实现 Pod 之间的直接通信(即使跨不同节点也是如此),而无需进行网络地址转换 (NAT)。单个 Pod 中的所有容器共享同一个 IP 地址,并且可以通过
localhost进行通信。Service:GKE 会从专用次要 IP 地址范围为每个 Kubernetes Service 分配一个稳定的 虚拟 IP 地址(
ClusterIP)。此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 分配一个唯一的 IP 地址,该地址来自分配给其节点的 Pod CIDR 范围。 |
| Service (ClusterIP) | GKE 会从集群 VPC 网络中的专用次要 IP 地址
范围为每个 Service 分配一个稳定的虚拟 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 之间的直接通信,还实现了与 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 地址空间,您可以在 VPC 网络内使用公共 IP 地址范围 以供内部使用。使用 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 地址范围大小的指南,请参阅 IP 地址范围规划(适用于 VPC 原生 集群)。
- 如需解决常见问题,请参阅排查 IP 伪装 代理的问题。