此参考架构展示了通过在服务网格中的多个 GKE 集群上运行的 Google Kubernetes Engine (GKE) 网关在外部公开应用的优势。本指南适用于平台管理员。
您可以通过跨多个 GKE 集群一致部署应用来提高服务的弹性和冗余,其中每个集群都会成为额外的故障域。例如,如果某个服务的计算基础架构在部署在单个 GKE 集群中时可以实现 99.9% 的服务等级目标 (SLO),那么在将该服务跨两个 GKE 集群进行部署时,则可实现 99.9999% 的 SLO (1 - (0.001)2)。您还可以将传入请求自动定向到延迟时间最短的可用网格入站流量网关,从而提升用户体验。
如需了解公开在单个集群上运行的支持服务网格的应用的优势,请参阅从边缘到网格:通过 GKE 网关公开服务网格应用。
架构
以下架构图展示了数据如何流经 Cloud Ingress 和网格 Ingress:
上图显示了以下数据流场景:
- 从客户端起始到使用自己的 Google 管理的 TLS 证书的 Google Cloud 负载均衡器处终止。
- 从 Google Cloud 负载均衡器到使用自己的自签名 TLS 证书的网格入站流量代理。
- 从网格入站流量网关代理到使用支持服务网格的 mTLS 的工作负载边车代理。
此参考架构包含以下两个入站流量层:
- Cloud Ingress:在此参考架构中,您将使用 Kubernetes Gateway API(以及 GKE Gateway Controller)来编排外部多集群 HTTP(S) 负载均衡层。负载均衡器会检查多个区域的网格入站流量代理,并将请求发送到健康状况良好的最近集群。它还会实施 Google Cloud Armor 安全政策。
- 网格 Ingress:在网格中,您可以直接对后端执行健康检查,以便在本地实现负载均衡和流量管理。
当您将这些入站流量层结合使用时,它们之间是相辅相成的关系。为实现以下目标,Google Cloud 优化了 Cloud Ingress 层和网格 Ingress 层中相应的功能:
- 提供低延迟时间。
- 提高可用性。
- 使用 Cloud Ingress 层的安全功能。
- 使用网格 Ingress 层的安全、授权和可观测性功能。
Cloud Ingress
与网格入站流量搭配使用时,Cloud Ingress 层最适合用于边缘安全和全球负载均衡。由于 Cloud Ingress 层与以下服务集成,因此它擅长在边缘(网格外)运行这些服务:
- DDoS 攻击防护
- Cloud 防火墙
- 身份验证和授权
- 加密
路由逻辑在 Cloud Ingress 层通常很简单。但是,对于多集群和多区域环境,它可能更复杂。
由于面向互联网的负载均衡器的关键功能,Cloud Ingress 层可能由平台团队管理,该团队对应用在互联网上的公开和保护方式具有独占控制权。较之开发者驱动的基础架构,此控制机制会降低此层的灵活性和动态性。在确定对此层的管理员权限以及如何提供该访问权限时,需考虑这些因素。
网格 Ingress
与 Cloud Ingress 搭配使用时,网格 Ingress 层为流量提供进入服务网格的入口点。该层还提供后端 mTLS、授权政策和灵活的正则表达式匹配。
使用网格 Ingress 层在网格外部署外部应用负载均衡具有明显的优势,尤其是在网络流量管理方面。虽然服务网格和 Istio 入站流量网关在网格中提供了高级路由和流量管理,但某些功能可以在网络边缘得到更好的服务。通过 Google Cloud 的外部应用负载均衡器利用互联网边缘网络,较之基于网格的入站流量,可在性能、可靠性或安全性方面获得显著的优势。
使用的产品和功能
下面的列表总结了此参考架构使用的所有 Google Cloud 产品和功能:
- GKE Enterprise:一项代管式 Kubernetes 服务,可用来使用 Google 的基础架构大规模部署和操作容器化应用。在本参考架构中,应用的每个 GKE 集群都必须位于同一舰队中。
- 舰队和多集群网关:这些服务可用来使用 Google 的基础架构和 GKE Enterprise 创建企业级容器化应用。
- Google Cloud Armor:该服务可帮助您保护应用和网站免遭拒绝服务攻击和 Web 攻击。
- Cloud Service Mesh:基于 Envoy 和 Istio 的全托管式服务网格
- 应用负载均衡器:一种基于代理的 L7 负载均衡器,可让您运行和扩缩服务。
- Certificate Manager:该服务可让您获取和管理 TLS 证书以用于 Cloud Load Balancing。
舰队
为了管理多集群部署,GKE Enterprise 和 Google Cloud 使用舰队对 Kubernetes 集群进行逻辑分组和标准化处理。
使用一个或多个舰队可以帮助您将管理级别从单个集群升级到整组集群。为了减少集群管理方面的麻烦,请使用命名空间相同性舰队原则。对于舰队中的每个 GKE 集群,请确保以相同的方式配置所有网格入站流量网关。
此外,请一致地部署应用服务,以便命名空间账号中的 service balance-reader 与舰队中每个 GKE 集群内的相同服务关联。舰队中采用的相同性和信任原则可让您在 GKE Enterprise 和 Google Cloud 中使用整个范围内支持舰队的功能。
服务网格中的东西向路由规则和流量政策在网格 Ingress 层处理。网格 Ingress 层部署在舰队中的每个 GKE 集群上。以相同方式配置每个网格入站流量网关,并遵循舰队的命名空间相同性原则。
虽然 GKE 网关只有一个配置集群,但您应该在舰队中的所有 GKE 集群之间同步 GKE 网关配置。
如果您需要指定新的配置集群,请使用 ConfigSync。ConfigSync 有助于确保所有此类配置在舰队中的所有 GKE 集群之间同步,并有助于避免与非当前配置进行协调。
网格入站流量网关
Istio 0.8 引入了网格入站流量网关。网关提供了一组专用代理,其端口会向来自服务网格外部的流量公开。这些网格入站流量代理可让您独立于应用路由行为来控制网络公开行为。
通过代理,您还可以在网格外部流量到达应用边车之前将路由和政策应用于网格外部流量。网格入站流量定义了流量到达网格中的节点时的处理方式,但是外部组件必须定义流量如何首先到达网格。
如要管理外部流量,您需要有一个位于网格外部的负载均衡器。为了自动执行部署,此参考架构使用通过 GKE 网关资源预配的 Cloud Load Balancing。
GKE 网关和多集群服务
您可以通过多种方式向集群外部的客户端提供应用访问权限。GKE Gateway 是 Kubernetes Gateway API 的实现。GKE 网关会优化并改进 Ingress 资源。
将 GKE 网关资源部署到 GKE 集群时,网关控制器会监控 Gateway API 资源,并协调 Cloud Load Balancing 资源,以实现网关资源指定的网络行为。
使用 GKE Gateway 时,用于向客户端公开应用的负载均衡器的类型很大程度上取决于以下因素:
- 后端服务位于单个 GKE 集群中,还是分布在多个 GKE 集群中(位于同一舰队中)。
- 客户端的状态(外部或内部)。
- 所需的负载均衡器功能,包括与 Google Cloud Armor 安全政策集成的功能。
- 服务网格的跨度要求。服务网格可以跨越多个 GKE 集群,也可以包含在单个集群中。
在网关中,此行为通过指定适当的 GatewayClass 来控制。在引用网关类时,可在多集群场景中使用的类的名称以 -mc
结尾。
此参考架构讨论了如何通过外部应用负载均衡器在外部公开应用服务。不过,使用网关时,您还可以创建多集群区域级内部应用负载均衡器。
如需在多集群场景中部署应用服务,您可以通过以下两种方式定义 Google Cloud 负载均衡器组件:
如需详细了解这两种部署应用服务的方法,请参阅为 GKE 选择多集群负载均衡 API。
多集群 Ingress 依赖于创建 MultiClusterService
资源。多集群网关依赖于创建 ServiceExport
资源并引用 ServiceImport
资源。
使用多集群网关时,您可以通过创建政策来启用底层 Google Cloud 负载均衡器的额外功能。与此参考架构关联的部署指南介绍了如何配置 Google Cloud Armor 安全政策来帮助保护后端服务免遭跨站脚本攻击。
这些政策资源针对舰队中跨多个集群公开的后端服务。在多集群场景中,所有此类政策都必须引用 ServiceImport
资源和 API 组。
健康检查
使用 L7 负载均衡的两层所带来的一种复杂性是健康检查。您必须将每个负载均衡器配置为检查下一层的健康状况。GKE 网关会检查网格入站流量代理的健康状况,而网格又会检查应用后端的健康状况。
- Cloud Ingress:在此参考架构中,通过 GKE 网关配置 Google Cloud 负载均衡器,以检查所公开健康检查端口上的网格入站流量代理的健康状况。如果网格代理关闭,或者集群、网格或区域不可用,则 Google Cloud 负载均衡器会检测到此情况,并且不会将流量发送到网格代理。在这种情况下,流量将路由到其他 GKE 集群或区域中的备用网格代理。
- 网格 Ingress:在网格应用中,您可以直接对后端执行健康检查,以便在本地实现负载均衡和流量管理。
设计考虑事项
本部分提供的指导可帮助您使用此参考架构开发满足特定的安全性和合规性、可靠性和费用要求的架构。
安全性、隐私权和合规性
本文档中的架构图包含多个安全要素。最关键的要素是如何配置加密和部署证书。出于这些安全目的,GKE 网关会与 Certificate Manager 相集成。
互联网客户端对公共证书进行身份验证,并作为 Virtual Private Cloud (VPC) 中的第一个跃点连接到外部负载均衡器。您可以参阅网关定义中的 Certificate Manager CertificateMap
。下一个跃点位于 Google Front End (GFE) 和网格入站流量代理之间。该跃点默认加密。
GFE 与其后端之间的网络级加密会自动应用。如果您的安全要求规定平台所有者保留加密密钥的所有权,则可以在集群网关 (GFE) 和网格入站流量(Envoy 代理实例)之间启用具有 TLS 加密的 HTTP/2。
在集群网关和网格入站流量之间启用具有 TLS 加密的 HTTP/2 时,您可以使用自签名证书或公共证书来加密流量。您可以使用自签名证书或公共证书,因为 GFE 不会对其进行身份验证。与此参考架构关联的部署指南中演示了额外的这层加密。
为防止证书被错误处理,请勿重复使用公共证书。为服务网格中的每个负载均衡器使用单独的证书。
为帮助创建外部 DNS 条目和 TLS 证书,此参考架构的部署指南使用 Cloud Endpoints。通过 Cloud Endpoints,您可以创建外部可用的 cloud.goog
子网域。在企业级场景中,使用合适的域名,并创建指向 DNS 服务提供商提供的全球应用负载均衡器 IP 地址的 A 记录。
如果您使用的服务网格强制执行 TLS,则边车代理之间的所有流量以及所有网格入站流量都会进行加密。该架构图展示了从客户端到 Google Cloud 负载均衡器、从负载均衡器到网格入站流量代理以及从入站流量代理到边车代理的 HTTPS 加密。
可靠性和弹性
多集群、多区域的边缘到网格模式的一个主要优势是,它可以使用服务网格的所有功能进行东西向负载均衡,例如均衡应用服务之间的流量。
此参考架构使用多集群 GKE 网关将传入的云端入站流量路由到 GKE 集群。系统选择 GKE 集群时,会考虑其与用户之间的距离(基于延迟时间)及其可用性和健康状况。当流量到达 Istio 入站流量网关(网格入站流量)时,将通过服务网格路由到相应的后端。
处理东西向流量的另一种方法是对跨 GKE 集群部署的所有应用服务使用多集群服务。在舰队内的多个 GKE 集群中使用多集群服务时,服务端点会集中在 ClusterSet
中。如果一项服务需要调用其他服务,该服务可以定位到另一项服务的任何健康状况良好的端点。由于端点是轮换选择的,因此所选端点可能位于其他可用区或不同区域。
使用服务网格处理东西向流量而不是使用多集群服务的一个主要优势是,服务网格可以使用局部负载均衡。局部负载均衡不是多集群服务的功能,但您可以通过 DestinationRule
进行配置。
配置完成后,从一个服务到另一个服务的调用会首先尝试到达同一可用区中的服务端点,然后才会尝试到达调用方服务所在的区域。最后,仅当同一可用区或同一区域中的服务端点不可用时,调用才会定位到其他区域中的端点。
费用优化
若要在企业中广泛采用此多集群架构,可使用 Google Kubernetes Engine (GKE) Enterprise 版本,其中包含 Cloud Service Mesh 和多集群网关。此外,GKE Enterprise 还提供许多功能,可让您大规模管理和控制 GKE 集群、应用和其他流程。
部署
如需部署此架构,请参阅从边缘到多集群网格:通过 GKE 网关和 Cloud Service Mesh 部署分布全球的应用。
后续步骤
- 了解 GKE 网关提供的可与服务网格配合使用的更多功能。
- 了解适用于 GKE 的不同类型的 Cloud Load Balancing。
- 了解 Cloud Service Mesh 提供的功能。
- 如需查看更多参考架构、图表和最佳实践,请浏览云架构中心。
贡献者
作者:
- Alex Mattson | 应用专家工程师
- Mark Chilvers | 应用专家工程师
其他贡献者:
- Abdelfettah Sghiouar | Cloud 开发技术推广工程师
- Arunkumar Jayaraman | 首席工程师
- Greg Bray | 客户工程师
- Megan Yahya | 产品经理
- Paul Revello | Cloud 解决方案架构师
- Valavan Rajakumar | 关键企业架构师
- Maridi (Raju) Makaraju | 支持性技术主管