服务网络概览


本页面介绍如何在 Google Kubernetes Engine (GKE) 中部署 Service。您可以参考本页面,以便更好地全面了解 Service 网络以及 GKE 中存在的 Service 网络功能。

服务网络概览

Service 网络让您无需操心客户端所使用的应用的底层所有权、实现或环境即可发布应用。形式最简单的 Service 是一个安全、一致且可用的端点,您可以透过该端点来访问应用。

客户端和应用在通信方式方面的需求各不相同,可能简单至在 Kubernetes 集群中公开您的应用以供 Pod 使用,也可能复杂至将来自全球的流量从互联网客户端路由到您的应用。GKE 提供了多种将应用以符合您独特使用场景的 Service 形式进行公开的方法。

Service 的元素

向客户端公开应用涉及 Service 的三个关键元素:

  • 前端:负载平衡器前端定义了客户端可以访问流量并将流量发送到负载平衡器的范围。这是侦听流量的网络位置。它具有网络、特定区域(或网络中的子网)、网络中的一个或多个 IP 地址、端口、特定协议以及用于建立安全连接的传输层安全协议 (TLS) 证书。

  • 路由和负载平衡:路由和负载平衡用于定义您处理和路由流量的方式。您可以根据协议、HTTP 标头和 HTTP 路径等参数将流量路由到 Service。根据您使用的负载均衡器,它可能会均衡流量,从而为客户缩短延迟时间并提高弹性。

  • 后端:负载平衡器后端由端点类型、应用平台和后端服务发现集成来定义。GKE 使用服务发现集成在 GKE 端点启动和关闭时动态更新负载平衡器后端。

下图针对内部和外部流量介绍了这些概念:

在该图中,外部应用负载均衡器通过世界各地数百个 Google 入网点在公共互联网上监听流量。该全球性前端允许流量在边缘处(靠近客户端)终止,然后对流量进行负载平衡并路由到其在 Google 数据中心的后端。

内部应用负载均衡器在 VPC 网络的范围内监听,从而允许在内部进行私密通信。这些负载平衡器属性使其适用于不同类型的应用使用场景。

了解 GKE 负载平衡

为了在 GKE 集群外部公开应用,GKE 提供了内置的 GKE Ingress 控制器GKE Service 控制器,用来代表 GKE 用户部署负载均衡器。它与虚拟机负载平衡基础架构相同,只不过它的生命周期由 GKE 完全自动化并进行控制。GKE 网络控制器使用符合 Ingress 和 Service API 标准的更高层级的专业接口,为容器原生 Pod 提供 IP 地址负载平衡。

下图说明了 GKE 网络控制器如何自动创建负载均衡器:

如图所示,基础架构或应用管理员根据其 GKE 集群部署声明式清单。Ingress 和 Service 控制器会监控 GKE 网络资源(例如 Ingress 对象),并根据清单部署负载均衡器(以及 IP 寻址、防火墙规则等)。

控制器继续根据环境和流量的变化情况来管理负载均衡器和后端。由于上述机制,GKE 负载均衡将成为一个动态且自立的负载均衡器,其中包含面向开发者的界面。

选择公开应用的方法

当您选择在 GKE 中公开应用的方法时,需要考虑的关键因素包括客户端网络、协议和应用区域性。借助 GKE 的 Ingress 和 Service 控制器套件,您可以在考虑这些因素的前提下公开应用。

虽然以下各部分并未全方位介绍应用网络,但了解以下各个因素可以帮助您确定最适合您的应用的解决方案。大多数 GKE 环境都可以托管许多不同类型的应用,且都具有独特要求,因此您可能要在任何给定的集群中使用多个应用。

如需查看 Ingress 功能的详细比较,请参阅 Ingress 配置

客户端网络

客户端网络是指您的应用客户端从中访问应用的网络。这会影响负载平衡器的前端的侦听位置。例如,客户端可以与应用位于同一 GKE 集群中。在这种情况下,它们将从集群网络内部访问您的应用,从而能够使用 Kubernetes 原生 ClusterIP 负载均衡

客户端也可以是内部网络客户端,从 Virtual Private Cloud (VPC) 内部或从跨 Cloud Interconnect 的本地网络访问您的应用。

客户端也可以是外部客户端,通过公共互联网访问您的应用。每种类型的网络决定不同的负载平衡拓扑。

在 GKE 中,您可以选择内部负载平衡器或外部负载平衡器。“内部”是指 VPC 网络,它是无法直接从互联网访问的内部专用网络。“外部”是指公共互联网。ClusterIP Service 是单个 GKE 集群的内部 Service,因此其限定使用的网络范围小于 VPC 网络。

下表简要介绍了适用于内部和外部网络的解决方案。

网络类型 可用的解决方案
内部 ClusterIP Service
NodePort Service
内部 LoadBalancer Service
内部 Ingress
外部 NodePort Service1
外部 LoadBalancer Service
外部 Ingress
多集群 Ingress

1 公共 GKE 集群为每个 GKE 节点提供公共 IP 地址和专用 IP 地址,因此可以从内部和外部访问 NodePort Service。

协议

协议是指客户端与应用通信时所用的语言。语音、游戏和低延迟时间应用通常直接使用 TCP 或 UDP,需要具备精细控制权的第 4 层负载平衡器。其他应用使用 HTTP、HTTPS、gRPC 或 HTTP2,并且需要明确支持这些协议的负载平衡器。协议要求将进一步定义最适合使用的应用公开方法类型。

在 GKE 中,您可以配置第 4 层负载平衡器和第 7 层负载平衡器,前者将根据网络信息(如端口和协议)路由流量,后者用于了解客户端会话等应用信息。每个不同的负载平衡器都包含特定的协议支持,如下表所示:

协议 可用的解决方案
L4 TCP
UDP
ClusterIP Service
NodePort Service
内部 LoadBalancer Service
外部 LoadBalancer Service
L7 HTTP
HTTPS
HTTP2
内部 Ingress
外部 Ingress
多集群 Ingress

应用区域性

应用区域性是指您的应用在多个区域或 GKE 集群中的分布程度。与在两个独立 GKE 集群之间托管冗余的应用实例相比,托管单个应用实例需要满足不同的要求。在五个 GKE 集群之间托管分布于不同地理位置的应用,从而将工作负载置于最终用户附近以降低延迟时间,这要求负载平衡器对多集群和多区域有更多的了解。

您可以将 GKE 负载平衡解决方案的区域性细分为两个方面:

  • 后端范围(也称为集群范围):此范围指定负载均衡器是否可以将流量发送到多个 GKE 集群中的后端。 多集群 Ingress 能够公开单个虚拟 IP 地址,用于将来自不同集群和不同区域的流量定向到各个 Pod。

  • 前端范围:此范围指定负载均衡器 IP 地址在单个区域内侦听还是在多个区域中侦听。所有外部负载平衡器都在互联网上侦听,互联网在本质上是多区域,但某些内部负载平衡器只会在单个区域内侦听。

下表跨两个维度对 GKE 负载均衡解决方案进行了细分。

后端范围
(集群范围)
可用的解决方案
单集群 ClusterIP Service
NodePort Service
内部 LoadBalancer Service
外部 LoadBalancer Service
内部 Ingress
外部 Ingress
多集群 多集群 Ingress
前端范围 可用的解决方案
区域级 ClusterIP Service
内部 Ingress
Global ClusterIP Service
NodePort Service
内部 LoadBalancer Service
外部 LoadBalancer Service
外部 Ingress
多集群 Ingress

用于公开应用的其他解决方案

上述解决方案并非可用于公开应用的唯一解决方案。以下解决方案还可以取代 GKE 负载均衡器或对其进行补充。

集群内 Ingress

集群内 Ingress 是指软件的 Ingress 控制器,其 Ingress 代理托管在 Kubernetes 集群本身当中。它与 GKE Ingress 控制器不同,后者与 Kubernetes 集群分开托管和管理其负载均衡基础架构。这些第三方解决方案通常由集群操作员自行部署和自行管理。istio-ingressgatewaynginx-ingress 是常用开源集群内 Ingress 控制器的两个示例。

集群内 Ingress 控制器通常符合 Kubernetes Ingress 规范,并提供不同的功能和易用性。这些开源解决方案可能需要进行更密切的管理以及更高水平的技术专业知识,但如果它们可以提供应用所需的特定功能,或许可以满足您的需要。围绕开源社区还构建了一个庞大的企业 Ingress 解决方案生态系统,用于提供高级功能和企业支持。

独立网络端点组 (NEG)

GKE 的 Ingress 控制器和 Service 控制器提供了自动化的声明式 Kubernetes 原生方法来部署 Cloud Load Balancing。此外,还存在手动为 GKE 后端部署负载平衡器的有效使用场景,例如,对负载平衡器进行直接且更精细的控制,或者在容器与虚拟机后端之间实现负载平衡。

独立 NEG 通过为 NEG 动态更新 Pod 后端 IP 地址来提供此功能,但允许手动部署负载均衡器的前端。这样做可以最大程度且直接控制负载均衡器,同时保留由 GKE 集群控制动态后端。

Service Mesh

Service Mesh 通过一个集中式控制层面提供客户端负载平衡。通过 Traffic DirectorAnthos Service Mesh,可在 GKE 集群之间、区域之间以及容器与虚拟机之间实现内部流量负载平衡。这会导致内部负载平衡(东西向流量)与公开应用(南北向流量)之间的界线模糊。借助现代服务网格控制层面的灵活性和可达性,在同一服务网格范围内同时拥有客户端和服务器的可能性要大得多。上述 GKE Ingress 解决方案和 Service 解决方案通常会为本身没有边车代理的客户端部署中间代理负载均衡器。但是,如果客户端和服务器位于同一网格中,则可以使用网格而不是中间代理负载均衡来处理对应用的公开。

后续步骤